diff --git a/NEWS.md b/NEWS.md index 27c535919a..2b96b56076 100644 --- a/NEWS.md +++ b/NEWS.md @@ -11,6 +11,14 @@ Note that each entry is kept to a minimum, see links for details. Note: We're only listing outstanding class updates. +* Array + + * `Array#pack` now raises ArgumentError for unknown directives. [[Bug #19150]] + +* String + + * `String#unpack` now raises ArgumentError for unknown directives. [[Bug #19150]] + ## Stdlib updates * The following default gems are updated. @@ -41,3 +49,5 @@ See GitHub releases like [GitHub Releases of Logger](https://github.com/ruby/log ## Implementation improvements ## JIT + +[Bug #19150]: https://bugs.ruby-lang.org/issues/19150 diff --git a/pack.c b/pack.c index 3bdae01362..f1f474759a 100644 --- a/pack.c +++ b/pack.c @@ -167,7 +167,7 @@ unknown_directive(const char *mode, char type, VALUE fmt) snprintf(unknown, sizeof(unknown), "\\x%.2x", type & 0xff); } fmt = rb_str_quote_unprintable(fmt); - rb_warn("unknown %s directive '%s' in '%"PRIsVALUE"'", + rb_raise(rb_eArgError, "unknown %s directive '%s' in '%"PRIsVALUE"'", mode, unknown, fmt); } diff --git a/test/ruby/test_pack.rb b/test/ruby/test_pack.rb index 0ee36857ba..27573ef457 100644 --- a/test/ruby/test_pack.rb +++ b/test/ruby/test_pack.rb @@ -777,32 +777,32 @@ EXPECTED end def test_pack_garbage - assert_warn(%r%unknown pack directive '\*' in '\*U'$%) do + assert_raise(ArgumentError, %r%unknown pack directive '\*' in '\*U'$%) do assert_equal "\000", [0].pack("*U") end end def test_unpack_garbage - assert_warn(%r%unknown unpack directive '\*' in '\*U'$%) do + assert_raise(ArgumentError, %r%unknown unpack directive '\*' in '\*U'$%) do assert_equal [0], "\000".unpack("*U") end end def test_invalid_warning - assert_warning(/unknown pack directive ',' in ','/) { + assert_raise(ArgumentError, /unknown pack directive ',' in ','/) { [].pack(",") } - assert_warning(/\A[ -~]+\Z/) { + assert_raise(ArgumentError, /\A[ -~]+\Z/) { [].pack("\x7f") } - assert_warning(/\A(.* in '\u{3042}'\n)+\z/) { + assert_raise(ArgumentError, /\A(.* in '\u{3042}'\n)+\z/) { [].pack("\u{3042}") } - assert_warning(/\A.* in '.*U'\Z/) { + assert_raise(ArgumentError, /\A.* in '.*U'\Z/) { assert_equal "\000", [0].pack("\0U") } - assert_warning(/\A.* in '.*U'\Z/) { + assert_raise(ArgumentError, /\A.* in '.*U'\Z/) { "\000".unpack("\0U") } end