summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pack.c2
-rw-r--r--test/ruby/test_pack.rb14
2 files changed, 16 insertions, 0 deletions
diff --git a/pack.c b/pack.c
index 9ba9bacd89..cb9cbb3794 100644
--- a/pack.c
+++ b/pack.c
@@ -208,6 +208,7 @@ pack_pack(rb_execution_context_t *ec, VALUE ary, VALUE fmt, VALUE buffer)
int integer_size, bigendian_p;
StringValue(fmt);
+ rb_must_asciicompat(fmt);
p = RSTRING_PTR(fmt);
pend = p + RSTRING_LEN(fmt);
@@ -959,6 +960,7 @@ pack_unpack_internal(VALUE str, VALUE fmt, enum unpack_mode mode, long offset)
StringValue(str);
StringValue(fmt);
+ rb_must_asciicompat(fmt);
if (offset < 0) rb_raise(rb_eArgError, "offset can't be negative");
len = RSTRING_LEN(str);
diff --git a/test/ruby/test_pack.rb b/test/ruby/test_pack.rb
index e1d58a2b84..2706dbfaee 100644
--- a/test/ruby/test_pack.rb
+++ b/test/ruby/test_pack.rb
@@ -22,6 +22,20 @@ class TestPack < Test::Unit::TestCase
assert_equal(x, x.pack("l").unpack("l"))
end
+ def test_ascii_incompatible
+ assert_raise(Encoding::CompatibilityError) do
+ ["foo"].pack("u".encode("UTF-32BE"))
+ end
+
+ assert_raise(Encoding::CompatibilityError) do
+ "foo".unpack("C".encode("UTF-32BE"))
+ end
+
+ assert_raise(Encoding::CompatibilityError) do
+ "foo".unpack1("C".encode("UTF-32BE"))
+ end
+ end
+
def test_pack_n
assert_equal "\000\000", [0].pack('n')
assert_equal "\000\001", [1].pack('n')