[スレッド全体]

2008/6/23 (月) 04:07:51 なすこじ  
Mozilla/4.8 (Macintosh; U; PPC)
[5363] 長過ぎるパス名で落ちる
>>data:6689も同様と思われる、長過ぎるパスのファイルを開くと落ちる既知の不具合についてです。

下記4箇所で_MAX_PATHを .nMaxFile に設定しますが、_MAX_PATH以上のファイルパスとなるとバッファに'\0'が無い状態となって突き抜けています。

CDlgOpenFile.cpp
 DoModal_GetOpenFileName()
 DoModal_GetSaveFileName()
 DoModalOpenDlg()
 DoModalSaveDlg()

下記のようにすることで取りあえず落ちるのは回避できるんですが、真っ当な方法じゃないような気もします。
 m_ofn.nMaxFile = _MAX_PATH - 1;
 memset( m_ofn.lpstrFile, 0, _MAX_PATH );  // 最後2文字を0にするだけでもOK

どうすべきでしょうか?

2008/6/23 (月) 11:02:28 じゅうじ  
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
[5364] Re:長過ぎるパス名で落ちる
▼ なすこじさん
>  DoModal_GetOpenFileName()
>  DoModal_GetSaveFileName()
>  DoModalOpenDlg()
>  DoModalSaveDlg()

この、4個のメソッドを呼び出している所だけでしたら、28ヶ所のみでした。
呼び出すすべての前の所で0クリアしてはどうでしょう。
char szPath[_MAX_PATH + 1];
szPath[sizeof(szPath)-1] = '\0';

私ちなみに、よく分かっていないのですが、
なぜ最後1バイトでなく、2バイトクリアするのでしょうか?

2008/6/23 (月) 21:17:43 なすこじ  
Mozilla/4.8 (Macintosh; U; PPC)
[5365] Re2:長過ぎるパス名で落ちる
▼ じゅうじさん
> なぜ最後1バイトでなく、2バイトクリアするのでしょうか?

2バイト文字で切れた場合もう1つ前もゴミとなることがあるためだったのですが、>>data:6694にて要望されたようにメッセージを表示してあげないとまずいということで、前回のものは撤回して下記のようにしようかと思います。

下記関数において、GetOpenFileNameRecover()またはGetSaveFileNameRecover()の戻り値がTRUEの時、バッファ内に'\0'が存在しなければエラーを表示してFALSEを返す。
 DoModal_GetOpenFileName()
  DoModal_GetSaveFileName()
  DoModalOpenDlg()
  DoModalSaveDlg()

上記の4箇所で.nMaxFileに_MAX_PATHを設定しているので、ここでチェックするのが良いと思ったのですが、さらに上位でチェックすべきでしょうか?

[▼次のスレッド]
INCM/CMT
Cyclamen v3.81
[ut:0.000][st:0.000]