-
Notifications
You must be signed in to change notification settings - Fork 168
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
CNativeW::AllocStringBufferの失敗時にコピーを中断させる #1732
CNativeW::AllocStringBufferの失敗時にコピーを中断させる #1732
Conversation
sakura_core/view/CEditView.cpp
Outdated
@@ -1883,6 +1883,11 @@ bool CEditView::GetSelectedData( | |||
cmemBuf->AllocStringBuffer(nBufSize); | |||
//>> 2002/04/18 Azumaiya | |||
|
|||
// メモリ確保に失敗したら抜ける | |||
if( 0 == cmemBuf->GetStringLength() ){ |
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.
cmemBufはこの時点で空文字列なので、GetStringLength()は必ず0ではないのですか。
下も同上。
ついでに書いておきますが、正規表現で長さ0マッチとコピーを組み合わせると、長さ0の(\0のみの)文字列をコピーできるので「文字列の長さが0だった場合」を判断材料にするのは、よろしくないと思います。
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.
capacityのほうをみないといかんですね。
✅ Build sakura 1.0.3927 completed (commit e258ada82b by @berryzplus) |
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.
int nBufSize = wcslen(WCODE::CRLF) * (Int)i;
そもそもこの変数、intなので特にx64で正しく計算できないときありますね。
AllocStringBufferにマイナスを指定した時どういう動作をするかは分かりませんけど。
ああ、でも(2GBを超えているかどうかは関係ありません)と書かれているので、今回のPRはその範囲ではないということなのかな。
そうなんですよ。32bitでも搭載メモリが少なければ発生したはずの不具合を対処する内容です。 |
この件は既知の問題で、どうすべきか検討しないといかんです。 |
✅ Build sakura 1.0.3929 completed (commit 5af6d409f6 by @berryzplus) |
Kudos, SonarCloud Quality Gate passed! |
✅ Build sakura 1.0.3931 completed (commit dddfc3bf43 by @berryzplus) |
レビューありがとうございます。マージしちゃいます。 |
PR の目的
不具合を修正します。
カテゴリ
PR の背景
#1575 で報告された不具合の対策 #1710 の焼き直しです。
発生事象
大きなデータをコピーしようとすると固まる。
(データが2GBを超えているかどうかは関係ありません。)
原因
選択範囲のデータを取得するコードで
メモリ確保の失敗が考慮されていません。
CNativeWはメモリ確保に失敗するとバッファが解放されるので、メモリの事前確保が成立せずに超低速になります。
PR のメリット
PR のデメリット (トレードオフとかあれば)
横展開要否を検討すべき箇所が、他に30箇所あります。
仕様・動作説明
仕様変更/機能追加はありません。
対策
メモリ確保が失敗した場合に、データ取得を異常終了させる修正を行います。
PR の影響範囲
テスト内容
テスト1
#1575 の再現手順で、アプリが固まる不具合が解消することを確認します。
手順
ファイルを開くまでにかなり時間がかかります。
アプリが無応答になる事象が解消されているのを確認できます。
関連 issue, PR
#1710
#1575
参考資料