summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--enc/shift_jis.c3
-rw-r--r--string.c19
-rw-r--r--test/ruby/test_m17n_comb.rb14
4 files changed, 39 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 27b5d16ed9..bda7ddfd7f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Sun May 20 21:36:39 2012 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * enc/shift_jis.c (code_to_mbclen): return
+ ONIGERR_INVALID_CODE_POINT_VALUE if the code is invalid.
+
+ * enc/shift_jis.c (tr_next): increment character until the code
+ is a valid character. [ruby-dev:45652] [Bug #6450]
+
Sun May 20 12:25:10 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* Makefile.in (LIBRUBY_SO): link EXTSOLIBS too.
diff --git a/enc/shift_jis.c b/enc/shift_jis.c
index f309dcfd42..e2bcaec189 100644
--- a/enc/shift_jis.c
+++ b/enc/shift_jis.c
@@ -230,6 +230,9 @@ code_to_mbclen(OnigCodePoint code, OnigEncoding enc ARG_UNUSED)
return ONIGERR_INVALID_CODE_POINT_VALUE;
}
else if (code <= 0xffff) {
+ int low = code & 0xff;
+ if (low < 0x40 || low == 0x7f || 0xfc < low)
+ return ONIGERR_INVALID_CODE_POINT_VALUE;
return 2;
}
else
diff --git a/string.c b/string.c
index 6569215d17..300aacb91f 100644
--- a/string.c
+++ b/string.c
@@ -4967,6 +4967,7 @@ trnext(struct tr *t, rb_encoding *enc)
for (;;) {
if (!t->gen) {
+nextpart:
if (t->p == t->pend) return -1;
if (rb_enc_ascget(t->p, t->pend, &n, enc) == '\\' && t->p + n < t->pend) {
t->p += n;
@@ -4995,12 +4996,20 @@ trnext(struct tr *t, rb_encoding *enc)
}
return t->now;
}
- else if (++t->now < t->max) {
- return t->now;
- }
else {
- t->gen = 0;
- return t->max;
+ while (ONIGENC_CODE_TO_MBCLEN(enc, ++t->now) <= 0) {
+ if (t->now == t->max) {
+ t->gen = 0;
+ goto nextpart;
+ }
+ }
+ if (t->now < t->max) {
+ return t->now;
+ }
+ else {
+ t->gen = 0;
+ return t->max;
+ }
}
}
}
diff --git a/test/ruby/test_m17n_comb.rb b/test/ruby/test_m17n_comb.rb
index 6796aea6b8..d7d3437e08 100644
--- a/test/ruby/test_m17n_comb.rb
+++ b/test/ruby/test_m17n_comb.rb
@@ -1236,6 +1236,20 @@ class TestM17NComb < Test::Unit::TestCase
}
end
+ def test_tr_sjis
+ expected = "\x83}\x83~\x83\x80\x83\x81\x83\x82".force_encoding(Encoding::SJIS)
+ source = "\xCF\xD0\xD1\xD2\xD3".force_encoding(Encoding::SJIS)
+ from = "\xCF-\xD3".force_encoding(Encoding::SJIS)
+ to = "\x83}-\x83\x82".force_encoding(Encoding::SJIS)
+ assert_equal(expected, source.tr(from, to))
+
+ expected = "\x84}\x84~\x84\x80\x84\x81\x84\x82".force_encoding(Encoding::SJIS)
+ source = "\x84M\x84N\x84O\x84P\x84Q".force_encoding(Encoding::SJIS)
+ from = "\x84@-\x84`".force_encoding(Encoding::SJIS)
+ to = "\x84p-\x84\x91".force_encoding(Encoding::SJIS)
+ assert_equal(expected, source.tr(from, to))
+ end
+
def test_tr_s
combination(STRINGS, STRINGS, STRINGS) {|s1, s2, s3|
desc = "#{encdump s1}.tr_s(#{encdump s2}, #{encdump s3})"