[#30408] Ruby 1.8.6 preview2 has been released — "Akinori MUSHA" <knu@...>

 Ruby 1.8.6 preview2 をリリースしました。

20 messages 2007/02/24
[#30414] fail to autoload at $SAFE==4 (Re: Ruby 1.8.6 preview2 has been released) — Hidetoshi NAGAI <nagai@...> 2007/02/25

永井@知能.九工大です.

[#30418] Re: fail to autoload at $SAFE==4 (Re: Ruby 1.8.6 preview2 has been released) — Nobuyoshi Nakada <nobu@...> 2007/02/25

なかだです。

[ruby-dev:30440] Re: MIME decoding confused by non-MIME characters

From: "H.Holon" <holon@...>
Date: 2007-02-27 13:54:00 UTC
List: ruby-dev #30440
  はじめてこちらには postします。相馬と申します。


On 2007/02/27, at 21:00, Urabe Shyouhei wrote:

> -devに振ってみる。

  さきほど、ircのほうで rfcなど見つつ、rfc2045で
> Any characters outside of the base64 alphabet are to be ignored in base64-encoded data.
とあること、 それと Python2.5, PHP5.2.1, Perl5.8.6でも

> a = "\xEF\xBB\xBF    Q\tU  F\xFF B \t\n\xFF\xFF\xFF  Q U F    \t B    QUE=\n"
> p a.unpack('m')

  相当の(嫌がらせみたいな base64文字列ですが)処理で全て関係ない
文字列は無視しているようで、それでいいのではという流れでしたので
関係ない文字は全部skipするように修正してみました。
 
# こういう場合のテストコードって手間がかかりますね。
# そういうのも添付したほうがいいんでしょうか? 


==============================================================
--- pack.c.old  2007-02-27 21:18:41.000000000 +0900
+++ pack.c      2007-02-27 22:45:38.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;
                    }

----
SOUMA Yutaka (H.Holon) [ holon@radastery.jp | http://radastery.jp/ ]



In This Thread