From: "H.Holon" Date: 2007-02-28T03:08:08+09:00 Subject: [ruby-dev:30445] Re: MIME decoding confused by non-MIME characters --Apple-Mail-12-1018958318 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=ISO-2022-JP 相馬です。 連続ですみません。testを完了しました。一応、defaultの test-all では問題ないようです。(ただ、drbで止まりますので、そこだけ は checkしていません) # 先程のではタブ変換がおかしかったようですので添付ファイル # にしておきます。(Apple Mailの仕業かな) しかし、そこで新しく気になる点が。 openssl enc -base64 -d で base64を decodeしてみると、 78文字あたりで制限があり、それより長い文字列であった 場合に切りとられてしまうようです。 一応、RFC2045を見てはみたのですが、base64変換では1行 あたりの文字数制限はないようです。 そのため、この patchでもそういう制限はつけていませんが 多少気になりました。  そのあたり詳しいかたがおられましたらチェックお願い します。 それと、test-allをしていて、他の部分で 2箇所ほど気になりました。 1つは、ruby/test_stringchar.rb 110行付近、Regexp.quoteのテスト がありますが、ここが0x80以上のときにうちの環境では errorになり ます。 re.cの rb_reg_quote()を見てみましたが、ismbchar()で判別して いる部分が気になります。  もう1つ、ruby/test_system.rbの test_syntax でも、eucのファイル で syntax errorを起こしてしまうようです。こちらはまだ追っていま せんのでドコかはわかりませんが、charsetは valid_syntax?で処理 すべきか、file読み込みで処理すべきかは気になります。 # 現在はファイルに -K optionがついていませんので fileの文字列 # から charsetを判別するしかないので不安定かもしれません。 以上、MacOSX 10.4.8 - MacBook - ruby1.8.5-p12(sourceから) の環境での結果です。  みなさま確認のほど宜しくお願いします。 ---- SOUMA Yutaka (H.Holon) [ holon@radastery.jp | http://radastery.jp/ ] --Apple-Mail-12-1018958318 Content-Transfer-Encoding: 7bit Content-Type: application/octet-stream; x-mac-type=54455854; x-unix-mode=0644; x-mac-creator=63456431; name=pack.c.diff Content-Disposition: attachment; filename=pack.c.diff --- pack.c.old 2007-02-27 21:18:41.000000000 +0900 +++ pack.c 2007-02-28 02:44:49.000000000 +0900 @@ -1803,20 +1803,27 @@ } } while (s < send) { - while (s[0] == '\r' || s[0] == '\n') { s++; } - if ((a = b64_xtable[(int)s[0]]) == -1) break; - if ((b = b64_xtable[(int)s[1]]) == -1) break; - if ((c = b64_xtable[(int)s[2]]) == -1) break; - if ((d = b64_xtable[(int)s[3]]) == -1) break; + a = b = c = d = -1; + while((a = b64_xtable[(int)(*(unsigned char*)s)]) == -1 && s < send) { s++; } + if( s >= send ) break; + s++; + while((b = b64_xtable[(int)(*(unsigned char*)s)]) == -1 && s < send) { s++; } + if( s >= send ) break; + s++; + while((c = b64_xtable[(int)(*(unsigned char*)s)]) == -1 && s < send) { if( *s == '=' ) break; s++; } + if( *s == '=' || s >= send ) break; + s++; + while((d = b64_xtable[(int)(*(unsigned char*)s)]) == -1 && s < send) { if( *s == '=' ) break; s++; } + if( *s == '=' || s >= send ) break; + s++; *ptr++ = a << 2 | b >> 4; *ptr++ = b << 4 | c >> 2; *ptr++ = c << 6 | d; - s += 4; } if (a != -1 && b != -1) { - if (s + 2 < send && s[2] == '=') + if (c == -1 && *s == '=') *ptr++ = a << 2 | b >> 4; - if (c != -1 && s + 3 < send && s[3] == '=') { + else if (c != -1 && *s == '=') { *ptr++ = a << 2 | b >> 4; *ptr++ = b << 4 | c >> 2; } --Apple-Mail-12-1018958318 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII --Apple-Mail-12-1018958318--