TMailが不正なヘッダのパースで固まる

Rails1.1.4という化石のような環境で起こる。ActionMailerでメールを受信する際に、Fromヘッダなどに正しくエンコードされてないiso-2022-jpな文字列があると半永久的にCPUを消費する。ASCIIの開始シーケンスである"ESC B ("がない場合に起こるらしい。同梱のTMailは0.10.7。最近のでは直ってるのだろうか。古いシステムのメンテはこれだから嫌だ。

解決策

--- vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/scanner_r.rb       (リビジョン 4595)
+++ vendor/rails/actionmailer/lib/action_mailer/vendor/tmail/scanner_r.rb       (作業コピー)
@@ -49,7 +49,7 @@

     atomchars  = alnum + Regexp.quote(atomsyms)
     tokenchars = alnum + Regexp.quote(tokensyms)
-    iso2022str = '\e(?!\(B)..(?:[^\e]+|\e(?!\(B)..)*\e\(B'
+    iso2022str = '\e(?!\(B)..(?>[^\e]+|\e(?!\(B)..)*\e\(B'

     eucstr  = '(?:[\xa1-\xfe][\xa1-\xfe])+'
     sjisstr = '(?:[\x81-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc])+'

いわゆる量指定子のネストによって半永久的なバックトラックが発生していると考えられるので、どうせ失敗するなら上記のように意味は変えずにすぐに失敗するようにした方がよい。ちゃんと検証てないが、バギーなメールはすぐに失敗し、正しいメールは正しくパースできることを確認した。