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 からダウンロードできない理由
以前からMSDNにVisual Studio 6.0がないのを不思議に思っていたのだが、最近になってその理由のページを見つけた。
http://msdn.microsoft.com/ja-jp/subscriptions/dd179309.aspx
Windows 2000 も同じ理由で、なかったのね。
今となっては不要だけど、当時はMSDNからダウンロードしたかった。
sendmail の第三者中継で悩んだ
#ドメインはすべて例です。
example.co.jp のメールサーバを設定中、第三者中継が行えるように見えて、悩んだ。
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 対応
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 が再同期中