ruby-changes:2700
From: ko1@a...
Date: 11 Dec 2007 13:58:15 +0900
Subject: [ruby-changes:2700] nobu - Ruby:r14191 (trunk): * transcode.c (transcode_loop): get rid of SEGV at sequence can not be
nobu 2007-12-11 13:57:51 +0900 (Tue, 11 Dec 2007) New Revision: 14191 Modified files: trunk/ChangeLog trunk/transcode.c Log: * transcode.c (transcode_loop): get rid of SEGV at sequence can not be converted. * transcode.c (rb_str_transcode_bang): copy encoding. [ruby-dev:32532] http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=14191&r2=14190 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/transcode.c?r1=14191&r2=14190 Index: ChangeLog =================================================================== --- ChangeLog (revision 14190) +++ ChangeLog (revision 14191) @@ -1,3 +1,10 @@ +Tue Dec 11 13:57:25 2007 Nobuyoshi Nakada <nobu@r...> + + * transcode.c (transcode_loop): get rid of SEGV at sequence can not be + converted. + + * transcode.c (rb_str_transcode_bang): copy encoding. [ruby-dev:32532] + Tue Dec 11 12:05:51 2007 Tanaka Akira <akr@f...> * encoding.c (rb_enc_get_ascii): add an argument to provide the Index: transcode.c =================================================================== --- transcode.c (revision 14190) +++ transcode.c (revision 14191) @@ -61,7 +61,7 @@ typedef struct { const char *from_encoding; const char *to_encoding; - BYTE_LOOKUP *conv_tree_start; + const BYTE_LOOKUP *conv_tree_start; int max_output; int from_utf8; } transcoder; @@ -86,7 +86,7 @@ } transcoder_table[n].from_encoding = from_e; transcoder_table[n].to_encoding = to_e; - transcoder_table[n].conv_tree_start = (BYTE_LOOKUP *)tree_start; + transcoder_table[n].conv_tree_start = tree_start; transcoder_table[n].max_output = max_output; transcoder_table[n].from_utf8 = from_utf8; @@ -168,19 +168,20 @@ int from_utf8 = my_transcoder->from_utf8; char *out_s = out_stop - my_transcoder->max_output + 1; while (in_p < in_stop) { - next_table = conv_tree_start; - if (out_p >= out_s) { + next_table = conv_tree_start; + if (out_p >= out_s) { int len = (out_p - *out_pos); int new_len = (len + my_transcoder->max_output) * 2; *out_pos = (*my_transcoding->flush_func)(my_transcoding, len, new_len); out_p = *out_pos + len; out_s = *out_pos + new_len - my_transcoder->max_output; - } - next_byte = (unsigned char)*in_p++; + } + next_byte = (unsigned char)*in_p++; follow_byte: - next_offset = next_table->base[next_byte]; - next_info = (VALUE)next_table->info[next_offset]; - switch (next_info & 0x1F) { + next_offset = next_table->base[next_byte]; + if (next_offset == (base_element)-1) goto illegal; + next_info = (VALUE)next_table->info[next_offset]; + switch (next_info & 0x1F) { case NOMAP: *out_p++ = next_byte; continue; @@ -223,13 +224,13 @@ /* todo: add code for alternative behaviors */ rb_raise(rb_eRuntimeError /*@@@change exception*/, "conversion undefined for byte sequence"); continue; - } - continue; + } + continue; illegal: - /* deal with illegal byte sequence */ - /* todo: add code for alternative behaviors */ - rb_raise(rb_eRuntimeError /*change exception*/, "illegal byte sequence"); - continue; + /* deal with illegal byte sequence */ + /* todo: add code for alternative behaviors */ + rb_raise(rb_eRuntimeError /*change exception*/, "illegal byte sequence"); + continue; } /* cleanup */ *in_pos = in_p; @@ -346,6 +347,7 @@ VALUE newstr = str_transcode(argc, argv, str); if (NIL_P(newstr)) return str; rb_str_shared_replace(str, newstr); + rb_enc_copy(str, newstr); return str; } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml