« CubePort の Panther 対応ドライバリリース! | Main | Qube2 の静音化 »

procmail で Out of memory

procmail の設定をいじって,Subject で色々振り分けようとしたところ Out of memory となる現象が発生してハマりました。
結局,最新の pkgsrc からビルドしたら直ったのですが。

procmail 3.22 のレシピでパイプ「|」を使っている人は要注意ッス。
設定をいじり始めたとき,私の環境は以下の通りでした。
NetBSD 1.6.1
procmail-3.22       Local mail delivery agent
Procmail を使って,Subject でメールを振り分ける際 Subject が MIME エンコードされている場合には デコードしてからヘッダを判定しなければなりません。
そこで,Procmail の紹介とレシピの書き方の通りに nkf を使ったヘッダのデコードを行い,その後に振り分けるようにレシピを作ってみたのですが,なぜかきちんと振り分けされません。

原因究明のため,.procmailrc に LOGFILE と VERBOSE を設定して,ログを取ってみました。
そうすると, DECODED_SUBJECT=|echo "$MATCH"|nkf -meZ1|sed 's/[[:space:]]//g' の部分で処理がしばらく停止し,その後 Out of memory となることがわかりました。

Web を検索してみると,どうも過去に同じトラブルに遭遇した人がいて,回避策がでていました。 Re: Procmail 3.22 running out of memory

この記事にならい,Subject を変数に代入する部分を { DECODED_SUBJECT=`echo "$MATCH"|nkf -meZ1|sed 's/[[:space:]]//g'` } に変えたところ,一応動くようにはなったものの,キモチワルかったのでさらに原因を追求してみました。

どうも BSD で使う場合に発生する問題のようなので,ポーティングの問題である可能性が高いと判断して最新の pkg をチェックしたところ... 今年の始めに nb1 パッチが出ているようでした。
$NetBSD: patch-af,v 1.1 2004/01/11 06:55:00 simonb Exp $

--- src/pipes.c.orig    Tue Sep 11 14:58:44 2001
+++ src/pipes.c
@@ -194,7 +194,7 @@ perr:             progerr(line,excode,pwait==4
      makeblock(&temp,Stdfilled);
      tmemmove(temp.p,Stdout,Stdfilled);
      readdyn(&temp,&Stdfilled,Stdfilled+backlen+1);
-     Stdout=realloc(Stdout,&Stdfilled+1);
+     Stdout=realloc(Stdout,Stdfilled+1);
      tmemmove(Stdout,temp.p,Stdfilled+1);
      freeblock(&temp);
      retStdout(Stdout,pwait&&pipw,!backblock);
なんだこれー!realloc の確保サイズに「長さ+1」を渡すべきところ,「長さの変数のアドレス+長さの変数のサイズ」を渡してたんじゃねーの?!
BSD 系だけじゃなくて,全部ヤバイじゃん。ほかのプラットフォームで,よく動いてるなー。

で,さっそく cvs update して,procmail を make update したところ,あっさり直ってしまいました。
procmail-3.22nb1    Local mail delivery agent
ふー。かなり疲れました。

# あとで,pkgsrc ML のアーカイブを探したところ,修正に関する記事を見つけました
# 本件,http://www.procmail.org/ には出ていないんだけど,本当にみんな大丈夫なのかな?

|

« CubePort の Panther 対応ドライバリリース! | Main | Qube2 の静音化 »

Comments

私も最近自宅でQube2JにNetBSDを入れて使い始めているのですが、PCに入れたFreeBSDに比べてSambaの応答がやたら遅いのです。
Load Averageは常に1.0を超えてるし…。
やっぱり、こんなものなんですかねぇ。ご意見をお聞かせ願えれば幸いです。

Posted by: take3 | 2004.02.09 at 02:08 PM

うちは気にならないですね...。
バージョンは
ja-samba-2.2.8.1.1.1nb1 Samba supporting I18N swat and L10N for Japanese
です。
ちなみに Load が高いのは, paneld が原因のようです。
止めたら低くなりました.

Posted by: cube | 2004.02.10 at 02:26 AM

そうそう,うちは物理メモリを MAX (256MB) まで増設してあります。
関係あるかなぁ...。

Posted by: cube | 2004.02.10 at 02:27 AM

情報ありがとうございました。特にpaneldの情報はありがたかったです。
sambaの方もWindows側でネットワークドライブとして接続すると、
なぜかレスポンスが向上しました。
物理メモリは64MBなんですけど、まぁなんとかいけそうかなぁ。
宅内サーバ利用なんで、特にきついこともないと思いますし。
これからもちょこちょこ覗かせていただきますね。
本当にありがとうございました。
#手がかかる分ちっこいこいつはかなり愛しげです

BGM: "Karn Evil #9 1st impression part1~part2" by Emarson, Lake & Parmer

Posted by: take3 | 2004.02.12 at 02:07 PM

Emarson, Lake & Palmerだ...
本文とは関係なくってすみません。

Posted by: take3 | 2004.02.12 at 02:09 PM

The comments to this entry are closed.

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/11543/131954

Listed below are links to weblogs that reference procmail で Out of memory:

« CubePort の Panther 対応ドライバリリース! | Main | Qube2 の静音化 »