-
Notifications
You must be signed in to change notification settings - Fork 165
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Grepダイアログのフォルダ名設定処理でのバッファオーバーラン修正 #1588
Grepダイアログのフォルダ名設定処理でのバッファオーバーラン修正 #1588
Conversation
✅ Build sakura 1.0.3553 completed (commit e4ea1a62cf by @usagisita) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
問題ないと思います。
本来的にはCNativeW型の利用は「必要なときのみ」に控えるべきと思います。
■ CNativeWが必要なケース
- CCodeBase派生クラスでANSI文字列から変換したデータを格納したい場合。
変換失敗時の独自エンコードの仕様があるのでstd::wstring
で代替できません。 - 「指定なし」を示す nullptr を格納したい場合。
std::optional<std::wstring>
で代替可能ですが 実装修正がややめんどうです。
このままで問題ないと思いますが、std::wstringを使うようにしたほうが良さそうに思いました。 |
コメント、確認ありがとうございます。 |
Kudos, SonarCloud Quality Gate passed! |
✅ Build sakura 1.0.3558 completed (commit e957961b07 by @usagisita) |
wcscat( szQuoteFolder, L"\"" ); | ||
::SetWindowText( hwndCtrl, szQuoteFolder ); | ||
std::wstring strQuoteFolder; | ||
strQuoteFolder = std::wstring(L"\"") + folder + std::wstring(L"\""); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
strQuoteFolder = std::wstring(L"\"") + folder + std::wstring(L"\""); | |
strQuoteFolder = strprintf( LR"("%s")", folder ); |
というのもアリかと思いましたが、既存コードではこっちのが多数派ですしどっちでも良さそうに思います。
レビューありがとうございます。 |
PR の目的
見た感じ SetGrepFolder関数のWCHAR[MAX_PATH] の変数で長さを確認せずに、前後をクオートで囲う処理をしていて、パスがぎりぎりの長さの場合にはバッファに入りきりません。
それを修正します。
カテゴリ
PR の背景
PR のメリット
バグが減ります。
PR のデメリット (トレードオフとかあれば)
特にありません。
仕様・動作説明
「現フォルダ」ボタンやフォルダ参照を押すと、パスがエディットコントロールに設定されます。
そのとき、パスに;(セミコロン)が含まれているときはセパレーターと区別するためにパス全体をダブルクォートで囲う処理があります。
これがコード上はバッファオーバーランするように見えるのを、直します。
PR の影響範囲
C言語の文字列操作関数は止めて、可変長のCNativeWにしました。パスが長くても安心です。
変更は関数内のみです。
テスト内容
テスト1
手順
長いフォルダのパスはエクスプローラーやCMDでもうまく作れなかったので未確認です。
普通の;セミコロンを含むパスをダブルクォートで囲う処理が動作することは、目視の動作確認で一応しました。
関連 issue, PR
参考資料