SPF include 参照のループではまる

●問題詳細

SPF include 参照のループをしているホストからのメールの処理で、無限ループが発生・メモリ枯渇・メールサーバが落ちる

 

example.com txt "v=spf1 ip4:XXX.XXX.XXX.XXX include:example.com ~all"」のような設定がされたDNSからのメールがあった。

 

●解決法

無限ループしてしまっている自己作成メール処理プログラム(PMilter を使った、milter)で、SPF include 参照のループしている場合でも、無限ループにならないように修正

 

●経緯

2013年12月7日(土)メールサーバ停止 長期稼働だったので単純にリブート対処

2013年12月14日(土)メールサーバ停止 リブート対処・原因究明開始(連続で土曜日だったので、再度水曜にリブートを行う)

2013年12月21日(土)メールサーバ停止 リブート対処・稼働時間などが原因ではないと判明・土曜の同じ時間帯での停止のため、日付関係を調査開始

2013年12月28日(土)メールサーバ停止 年末のため30日まで対処できず。

2014年1月4日(土)メールサーバ停止 年始のため、調査できず。しかし、日付関係ではなく、メモリ関係だと判明。メモリ・プロセス監視開始

2014年1月11日(土)メールサーバ停止 原因プロセスほぼ確定。しかし曜日が関連していると考えていたため理由不明。

2014年1月18日(土)メールサーバ停止 偶然問題発生の瞬間を見ていたため、原因プロセス確定。到着メールが原因と判明。

2014年1月19日(日)到着メールの SPF 設定が参照ループしていることが判明。自己作成メール処理プログラム(PMilter を使った、milter)修正

 

 

Visual Studio 6.0 が MSDN からダウンロードできない理由

以前からMSDNVisual Studio 6.0がないのを不思議に思っていたのだが、最近になってその理由のページを見つけた。

 

http://msdn.microsoft.com/ja-jp/subscriptions/dd179309.aspx

 

Windows 2000 も同じ理由で、なかったのね。

 

今となっては不要だけど、当時はMSDNからダウンロードしたかった。

sendmail の第三者中継で悩んだ

#ドメインはすべて例です。

example.co.jp のメールサーバを設定中、第三者中継が行えるように見えて、悩んだ。

 

$ telnet mail.example.co.jp 25
Trying XXX.XXX.XXX.111...
Connected to mail.example.co.jp (XXX.XXX.XXX.111).
Escape character is '^]'.
220 unknown ESMTP
EHLO example.jp
250-example.co.jp Hello example.jp [XXX.XXX.XXX.222], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH DIGEST-MD5 CRAM-MD5
250-DELIVERBY
250 HELP
MAIL FROM: <test@yahoo.com>
250 2.1.0 <test@yahoo.com>... Sender ok
RCPT TO: <test@gmail.com>
250 2.1.5 <test@gmail.com>... Recipient ok
QUIT
221 2.0.0 example.co.jp closing connection
Connection closed by foreign host.

 

いろいろ調べたところ、

テストのtelnetを行ったクライアントの逆引きが example.jp で

/etc/mail/local-host-names に example.co.jp に加え example.jp の記述があった。

local-host-names から example.jp の記述を取り除き、

service sendmail restart で sendmail 再起動(必要)したところ、

(略)
MAIL FROM: <test@yahoo.com>
250 2.1.0 <test@yahoo.com>... Sender ok
RCPT TO: <test@gmail.com>
550 5.7.1 <test@gmail.com>... Relaying denied. Proper authentication required.

 と無事、第三者中継を拒否するようになった。

VC++のBCMenuクラス内でプログラムが落ちる

VC++のBCMenuを使っている。

BCMenu : http://www.rocscience.com/~corkum/BCMenu.html

http://www.codeproject.com/Articles/22/Cool-Owner-Drawn-Menus-with-Bitmaps-Version-3-03 (3.033がダウンロード可能)

 

しかし、BCMenuクラス内で落ちることがあった。

 

・プログラム内で、以下のようにセパレータを追加

BCMenu* pSubMenu;

...

CMenu* pMenu = (CMenu*)pSubMenu;

pMenu->InsertMenu(2, MF_BYPOSITION|MF_SEPARATOR);

 

・その後、追加したセパレータを削除

・削除したセパレータより下にセパレータがあった場合、このセパレータの表示がおかしくなるもしくは、プログラムが落ちる

 

プログラムをおったところ、BCMenuData であるはずのものが、CString になってたりした。なので、上記の部分を発見。修正した。

 

(なぜ、CMenu* にキャストしていたかは謎。)

 

 

ついでに、BCMenu の2点おかしなところを発見。

1. 無意味コード

1426行目付近

    else if (nFlags&MF_STRING){
        ASSERT(!(nFlags&MF_OWNERDRAW));
        ModifyMenu(pos,nFlags,nID,mdata->GetString());
    }

は、MF_STRING が 0 なので、絶対に if文の中は実行されない

 

2. 無意味指定

1990行目付近

            if(!mdata)mdata=NewODMenu(j,
                state|MF_BYPOSITION|MF_SEPARATOR|MF_OWNERDRAW,0,_T(""));//SK: modified for Unicode correctness
の MF_BYPOSITION の指定は意味なし。

 

ソースを読む限り、BCMenuData->nFlagsに MF_BYPOSITION は、指定しても無意味。

Twitterコマンドラインクライアント shtter の Twitter API 1.1 対応

ツイッターLinux コマンドラインのクライアント shtter の Twitter API 1.1 対応のパッチ

https://lostman-worlds-end.blogspot.com/2010/05/openwrt_22.html?showComment=1373621194847#c28097559419757091

 

マージ済みのソース

https://github.com/lostman-github/shtter/tree/v1.1-patched

 

シェルスクリプトの中で投稿だけするために shtter を利用させていただいていたのだが、Twitter API 1.0 が完全停止され困っていたので、助かる。

 

(Twitter API v2 対応は 

Twitterコマンドラインクライアント shtter の Twitter API v2 対応 - 苦労する日々 )

VC6 で GetProcessId()

VC6 で ShellExecuteEx をしたプロセスのプロセスIDの取得に苦労。

GetProcessId() は、kernel32.dll に実装されているが、VC6 のヘッダにはないみたい。

以下で解決

typedef ULONG (__stdcall *GETPROCESSID)(HANDLE Process);

GETPROCESSID GetProcessId=(GETPROCESSID)GetProcAddress(GetModuleHandle("kernel32.dll"), "GetProcessId");
DWORD processID = GetProcessId(m_hProcess);

Windows7 急に起動を含むすべての動作が遅くなった。

現象: Windows7 急に起動を含むすべての動作が遅くなった。

 

検索して、HDD のライトキャッシュや DMA 設定などを確認したりしたが、ダメ。

 

いろいろ設定を確認していて気づいた。

原因:ソフトウェアRAID1 が再同期中