From: "H.Holon" Date: 2007-02-27T22:54:00+09:00 Subject: [ruby-dev:30440] Re: MIME decoding confused by non-MIME characters --Apple-Mail-3-1003709570 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=ISO-2022-JP はじめてこちらには 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/ ] --Apple-Mail-3-1003709570 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=UTF-8 =C2=A0 = =E3=81=AF=E3=81=98=E3=82=81=E3=81=A6=E3=81=93=E3=81=A1=E3=82=89=E3=81=AB=E3= =81=AF post=E3=81=97=E3=81=BE=E3=81=99=E3=80=82=E7=9B=B8=E9=A6=AC=E3=81=A8= =E7=94=B3=E3=81=97=E3=81=BE=E3=81=99=E3=80=82


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

-dev=E3=81=AB=E6=8C=AF=E3=81=A3=E3=81=A6=E3=81=BF=E3=82= =8B=E3=80=82

=C2=A0 = =E3=81=95=E3=81=8D=E3=81=BB=E3=81=A9=E3=80=81irc=E3=81=AE=E3=81=BB=E3=81=86= =E3=81=A7 rfc=E3=81=AA=E3=81=A9=E8=A6=8B=E3=81=A4=E3=81=A4=E3=80=81rfc2045= =E3=81=A7
> Any characters outside of the base64 alphabet = are to be ignored in base64-encoded data.
=E3=81=A8=E3=81=82=E3=82= =8B=E3=81=93=E3=81=A8=E3=80=81 =E3=81=9D=E3=82=8C=E3=81=A8 Python2.5, = PHP5.2.1, Perl5.8.6=E3=81=A7=E3=82=82

> a =3D "\xEF\xBB\xBF=C2=A0= =C2=A0 Q\tU=C2=A0 F\xFF B \t\n\xFF\xFF\xFF=C2=A0 Q U F =C2=A0 =C2=A0\t = B=C2=A0 =C2=A0 QUE=3D\n"
>=C2=A0p = a.unpack('m')

=C2=A0 = =E7=9B=B8=E5=BD=93=E3=81=AE(=E5=AB=8C=E3=81=8C=E3=82=89=E3=81=9B=E3=81=BF=E3= =81=9F=E3=81=84=E3=81=AA = base64=E6=96=87=E5=AD=97=E5=88=97=E3=81=A7=E3=81=99=E3=81=8C)=E5=87=A6=E7=90= =86=E3=81=A7=E5=85=A8=E3=81=A6=E9=96=A2=E4=BF=82=E3=81=AA=E3=81=84
=E6=96=87=E5=AD=97=E5=88=97=E3=81=AF=E7=84=A1=E8=A6=96=E3=81=97=E3=81=A6= =E3=81=84=E3=82=8B=E3=82=88=E3=81=86=E3=81=A7=E3=80=81=E3=81=9D=E3=82=8C=E3= =81=A7=E3=81=84=E3=81=84=E3=81=AE=E3=81=A7=E3=81=AF=E3=81=A8=E3=81=84=E3=81= =86=E6=B5=81=E3=82=8C=E3=81=A7=E3=81=97=E3=81=9F=E3=81=AE=E3=81=A7=E9=96=A2=E4=BF=82=E3=81=AA=E3=81=84=E6=96=87=E5=AD=97=E3=81=AF=E5=85=A8= =E9=83=A8skip=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3= =E3=81=97=E3=81=A6=E3=81=BF=E3=81=BE=E3=81=97=E3=81=9F=E3=80=82
= =C2=A0
# = =E3=81=93=E3=81=86=E3=81=84=E3=81=86=E5=A0=B4=E5=90=88=E3=81=AE=E3=83=86=E3= =82=B9=E3=83=88=E3=82=B3=E3=83=BC=E3=83=89=E3=81=A3=E3=81=A6=E6=89=8B=E9=96= =93=E3=81=8C=E3=81=8B=E3=81=8B=E3=82=8A=E3=81=BE=E3=81=99=E3=81=AD=E3=80=82=
# = =E3=81=9D=E3=81=86=E3=81=84=E3=81=86=E3=81=AE=E3=82=82=E6=B7=BB=E4=BB=98=E3= =81=97=E3=81=9F=E3=81=BB=E3=81=86=E3=81=8C=E3=81=84=E3=81=84=E3=82=93=E3=81= =A7=E3=81=97=E3=82=87=E3=81=86=E3=81=8B?=C2=A0


=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D
--- pack.c.old=C2=A0 2007-02-27 21:18:41.000000000 = +0900
+++ pack.c=C2=A0 =C2=A0 =C2=A0 2007-02-27 = 22:45:38.000000000 +0900
@@ -1803,20 +1803,27 @@
=C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = }
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = }
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = while (s < send) {
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0=C2=A0 while (s[0] =3D=3D '\r' || s[0] =3D=3D '\n') = { s++; }
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0=C2=A0 if ((a =3D b64_xtable[(int)s[0]]) =3D=3D -1) = break;
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0=C2=A0 if ((b =3D b64_xtable[(int)s[1]]) =3D=3D -1) = break;
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0=C2=A0 if ((c =3D b64_xtable[(int)s[2]]) =3D=3D -1) = break;
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0=C2=A0 if ((d =3D b64_xtable[(int)s[3]]) =3D=3D -1) = break;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0=C2=A0 a =3D b =3D c =3D d =3D -1;
+=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0 while((a =3D = b64_xtable[(int)(*(unsigned char*)s)]) =3D=3D -1 && s < send) = { s++; }
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0=C2=A0 if( s >=3D send ) break;
+=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0 s++;
+=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0 while((b =3D= b64_xtable[(int)(*(unsigned char*)s)]) =3D=3D -1 && s < = send) { s++; }
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0=C2=A0 if( s >=3D send ) break;
+=C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0 = s++;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0=C2=A0 while((c =3D b64_xtable[(int)(*(unsigned char*)s)]) =3D=3D = -1 && s < send) { if( *s =3D=3D '=3D' ) break; s++; = }
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0=C2=A0 if( *s =3D=3D '=3D' || s >=3D send ) = break;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0=C2=A0 s++;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0=C2=A0 while((d =3D b64_xtable[(int)(*(unsigned = char*)s)]) =3D=3D -1 && s < send) { if( *s =3D=3D '=3D' ) = break; s++; }
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0=C2=A0 if( *s =3D=3D '=3D' || s >=3D send ) = break;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0=C2=A0 s++;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 *ptr++ =3D a << 2 | b >> = 4;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 *ptr++ =3D b << 4 | c >> 2;
=C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 *ptr++ =3D c = << 6 | d;
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0=C2=A0 s +=3D 4;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 }
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 if (a !=3D -1 && b !=3D -1) {
-=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0 if (s + 2 = < send && s[2] =3D=3D '=3D')
+=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0 if (c =3D=3D -1 = && *s =3D=3D '=3D')
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 *ptr++ =3D a << 2 = | b >> 4;
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0=C2=A0 if (c !=3D -1 && s + 3 < send && = s[3] =3D=3D '=3D') {
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0=C2=A0 else if (c !=3D -1 && *s =3D=3D '=3D') = {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 *ptr++ =3D a << 2 | b >> = 4;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 *ptr++ =3D b << 4 | c >> = 2;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 }

----
SOUMA Yutaka = (H.Holon) [ holon@radastery.jp = | ]


=

= --Apple-Mail-3-1003709570--