diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-03-11 00:05:12 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-03-11 00:05:12 +0000 |
commit | 5fade63482d39d9c550a0ce8a555dc8e3c0aedec (patch) | |
tree | 5d99adf08d3c5e7503b353229fe71c2ba633eb0f | |
parent | 724878c9139715fea803690cfd2a0687abbd7242 (diff) | |
download | ruby-5fade63482d39d9c550a0ce8a555dc8e3c0aedec.tar.gz |
re.c: fixed escaped multibyte char
* re.c (unescape_nonascii): escaped multibyte character should be
copied as-is, just with checking if the encoding matches.
https://twitter.com/sakuro/status/972014409986883584
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62718 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | re.c | 12 | ||||
-rw-r--r-- | test/ruby/test_regexp.rb | 2 |
2 files changed, 14 insertions, 0 deletions
@@ -2537,11 +2537,13 @@ unescape_nonascii(const char *p, const char *end, rb_encoding *enc, while (p < end) { int chlen = rb_enc_precise_mbclen(p, end, enc); if (!MBCLEN_CHARFOUND_P(chlen)) { + invalid_multibyte: errcpy(err, "invalid multibyte character"); return -1; } chlen = MBCLEN_CHARFOUND_LEN(chlen); if (1 < chlen || (*p & 0x80)) { + multibyte: rb_str_buf_cat(buf, p, chlen); p += chlen; if (*encp == 0) @@ -2559,6 +2561,16 @@ unescape_nonascii(const char *p, const char *end, rb_encoding *enc, errcpy(err, "too short escape sequence"); return -1; } + chlen = rb_enc_precise_mbclen(p, end, enc); + if (!MBCLEN_CHARFOUND_P(chlen)) { + goto invalid_multibyte; + } + if ((chlen = MBCLEN_CHARFOUND_LEN(chlen)) > 1) { + /* include the previous backslash */ + --p; + ++chlen; + goto multibyte; + } switch (c = *p++) { case '1': case '2': case '3': case '4': case '5': case '6': case '7': /* \O, \OO, \OOO or backref */ diff --git a/test/ruby/test_regexp.rb b/test/ruby/test_regexp.rb index 85d5b2cdfe..90892355e5 100644 --- a/test/ruby/test_regexp.rb +++ b/test/ruby/test_regexp.rb @@ -515,6 +515,8 @@ class TestRegexp < Test::Unit::TestCase s = ".........." 5.times { s.sub!(".", "") } assert_equal(".....", s) + + assert_equal("\\\u{3042}", Regexp.new("\\\u{3042}").source) end def test_equal |