2011/10/05

bouncehammer 2.7.6で直したバグ(ヘッダの処理)

10/03(月)にbouncehammer 2.7.6をリリースしました。一番大きな変更点は、解析処理を行うmailboxparserコマンドが、ある条件を満たしたバウンスメールを解析すると、途中で停止するという酷いバグの修正です。これはbouncehammerのユーザさんから報告を貰って修正しました。

ある条件とは、不正な形式のメールヘッダで、且つ``@''とESC(0x1b)が含まれている、というものです。

ある条件について

bouncehammer 2.7.5以前のバージョンのmailboxparserに下記のようなヘッダを含むバウンスメールを解析させると、``Invalid mailbox list: ...''というエラーメッセージとともにコマンドが異常終了します。
To: 麻生太郎
単にメールアドレスがないだけのTo:ヘッダに見えますが、これは本来下記のように書かれているべきです。
To: =?ISO-2022-JP?B?GyRCS2NAOEJATzobKEI=?= <asotaro@example.jp>
適切にMIMEエンコードされていない生のISO-2022-JPの文字列は7ビットに収まるのですが、含まれている文字によっては面倒なことになります。

生のISO-2022-JP文字列を表示すると次のようになります。
% cat 1.eml | od -ax⏎
0000000    T   o   :  sp esc   $   B   K   c   @   8   B   @   O   : esc
             546f    3a20    1b24    424b    6340    3842    404f    3a1b
0000020    (   B  nl                                                    
             2842    0a00                                                
0000023
メールアドレスを取り出すモジュールKanadzuchi::Addressのparse()メソッド内部での検査が甘かったので、@(0x40)が含まれている=メールアドレスっぽい→Email::AddressParser->parse()に渡す→``Invalid mailbox list:...''というエラーで落ちていました。

Shift_JISやEUC,UTF-8を生で書いているケースでも文字によっては同じエラーが出るかもしれません(未検証)

修正内容

実際は、ESC(0x1b)が含まれている場合に限り、Email::AddressParser->parse()がエラーを吐いて落ちていたのですが、それ以前の検査が甘かったので、表示できない文字(0x20〜0x7E以外)が含まれていたら有効なメールアドレスではないというコードを追加しました。

よほど適当に作られたメール送信プログラムでも無い限り、ヘッダの7ビットに収まらない文字はちゃ〜んとMIMEエンコードされているはずですが、たまにこういうメールに出くわします。

``Invalid mailbox list:...''というエラーメッセージを見たら、多くの場合はメールアドレス処理のバグなので、もし他のケースで見つけた方がいらっしゃったら教えてください。

0 件のコメント:

コメントを投稿