diff options
| author | nagachika <nagachika@ruby-lang.org> | 2024-03-31 17:18:55 +0900 |
|---|---|---|
| committer | nagachika <nagachika@ruby-lang.org> | 2024-03-31 17:18:55 +0900 |
| commit | 4f3ed07d5bfd581b630e4afc8b9bb170ce781e7f (patch) | |
| tree | b5a1d43f0ed8378e1c7b33e45f9f17a38d1b448c | |
| parent | 1b5c74a2408d248f35cb811327dd51f49ee37c9e (diff) | |
merge revision(s) ade56737e2273847426214035c0ff2340b43799a: [Backport #20190]
Fix coderange of invalid_encoding_string.<<(ord)
Appending valid encoding character can change coderange from invalid to valid.
Example: "\x95".force_encoding('sjis')<<0x5C will be a valid string "\x{955C}"
---
string.c | 6 +++++-
test/ruby/test_string.rb | 3 +++
2 files changed, 8 insertions(+), 1 deletion(-)
| -rw-r--r-- | string.c | 6 | ||||
| -rw-r--r-- | test/ruby/test_string.rb | 3 | ||||
| -rw-r--r-- | version.h | 2 |
3 files changed, 9 insertions, 2 deletions
@@ -3502,8 +3502,12 @@ rb_str_concat(VALUE str1, VALUE str2) } rb_str_resize(str1, pos+len); memcpy(RSTRING_PTR(str1) + pos, buf, len); - if (cr == ENC_CODERANGE_7BIT && code > 127) + if (cr == ENC_CODERANGE_7BIT && code > 127) { cr = ENC_CODERANGE_VALID; + } + else if (cr == ENC_CODERANGE_BROKEN) { + cr = ENC_CODERANGE_UNKNOWN; + } ENC_CODERANGE_SET(str1, cr); } return str1; diff --git a/test/ruby/test_string.rb b/test/ruby/test_string.rb index 069813e681..24527a527f 100644 --- a/test/ruby/test_string.rb +++ b/test/ruby/test_string.rb @@ -301,6 +301,9 @@ CODE assert_raise(RangeError, bug) {S("a".force_encoding(Encoding::UTF_8)) << -1} assert_raise(RangeError, bug) {S("a".force_encoding(Encoding::UTF_8)) << 0x81308130} assert_nothing_raised {S("a".force_encoding(Encoding::GB18030)) << 0x81308130} + + s = "\x95".force_encoding(Encoding::SJIS).tap(&:valid_encoding?) + assert_predicate(s << 0x5c, :valid_encoding?) end def test_MATCH # '=~' @@ -11,7 +11,7 @@ # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR #define RUBY_VERSION_TEENY 3 #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR -#define RUBY_PATCHLEVEL 163 +#define RUBY_PATCHLEVEL 164 #include "ruby/version.h" #include "ruby/internal/abi.h" |
