summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--string.c8
-rw-r--r--test/ruby/test_string.rb3
2 files changed, 7 insertions, 4 deletions
diff --git a/string.c b/string.c
index 25323ce313..a7948224e5 100644
--- a/string.c
+++ b/string.c
@@ -6289,15 +6289,15 @@ str_undump(VALUE str)
int encidx;
ptrdiff_t size;
- if (utf8) {
- rb_raise(rb_eRuntimeError, "dumped string contained Unicode escape but used force_encoding");
- }
-
size = rb_strlen_lit(".force_encoding(\"");
if (s_end - s <= size) goto invalid_format;
if (memcmp(s, ".force_encoding(\"", size) != 0) goto invalid_format;
s += size;
+ if (utf8) {
+ rb_raise(rb_eRuntimeError, "dumped string contained Unicode escape but used force_encoding");
+ }
+
encname = s;
s = memchr(s, '"', s_end-s);
size = s - encname;
diff --git a/test/ruby/test_string.rb b/test/ruby/test_string.rb
index fee71791a1..d6356fcfa1 100644
--- a/test/ruby/test_string.rb
+++ b/test/ruby/test_string.rb
@@ -814,6 +814,9 @@ CODE
assert_raise(RuntimeError) { S('"\xA"').undump }
assert_raise(RuntimeError) { S('"\\"').undump }
assert_raise(RuntimeError) { S(%("\0")).undump }
+ assert_raise_with_message(RuntimeError, /invalid/) {
+ '"\\u{007F}".xxxxxx'.undump
+ }
end
def test_dup