From: Nobuyoshi Nakada Date: 2007-12-04T16:04:04+09:00 Subject: [ruby-dev:32449] Re: SEGV on "abcd\xf0".force_encoding("utf-8").reverse なかだです。 At Tue, 4 Dec 2007 15:29:09 +0900, Tanaka Akira wrote in [ruby-dev:32448]: > 以下のようにすると SEGV します。 > > % ./ruby -ve 'p "abcd\xf0".force_encoding("utf-8").reverse' > ruby 1.9.0 (2007-12-04 patchlevel 0) [i686-linux] > [BUG] Segmentation fault > ruby 1.9.0 (2007-12-04) [i686-linux] どうなるのがいいんでしょうね。例外? Index: string.c =================================================================== --- string.c (revision 14096) +++ string.c (working copy) @@ -2709,4 +2709,5 @@ rb_str_reverse(VALUE str) VALUE obj; char *s, *e, *p; + int cr; if (RSTRING_LEN(str) <= 1) return rb_str_dup(str); @@ -2716,6 +2717,7 @@ rb_str_reverse(VALUE str) p = RSTRING_END(obj); + cr = ENC_CODERANGE(str); if (RSTRING_LEN(str) > 1) { - if (rb_enc_mbmaxlen(enc) == 1) { + if (rb_enc_mbmaxlen(enc) == 1 || cr == ENC_CODERANGE_7BIT) { while (s < e) { *--p = *s++; @@ -2726,6 +2728,16 @@ rb_str_reverse(VALUE str) int clen = rb_enc_mbclen(s, e, enc); - if (clen == 0) { + switch (clen) { + default: + if (s + clen <= e) break; +#if !RAISE_ON_REVERSING_BROKEN_CHAR + clen = e - s; + break; +#endif + case 0: rb_raise(rb_eArgError, "invalid mbstring sequence"); + case 1: + *--p = *s++; + continue; } p -= clen; @@ -2738,4 +2750,5 @@ rb_str_reverse(VALUE str) OBJ_INFECT(obj, str); rb_enc_associate(obj, enc); + ENC_CODERANGE_SET(obj, cr); return obj; -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦