sakura-editor / sakura

SAKURA Editor (Japanese text editor for MS Windows)
https://sakura-editor.github.io/
Other
1.23k stars 162 forks source link

共有メモリ上の文字幅キャッシュに同時書き込みを防止する仕組みがない #1523

Open kengoide opened 3 years ago

kengoide commented 3 years ago

問題内容

1514 の概要と少し重複しますが、サクラエディタには文字の描画幅をキャッシュする仕組みがあります。キャッシュのメモリ領域としてフォント1つあたり2バイト×65536のメモリを確保しており、メモリ領域の場所は以下の通りです。

共通設定フォントのキャッシュをプロセス間で共有することで、キャッシュのヒット率の向上とメモリ使用量の削減を狙っているのだと思います。問題ではないかなと思うのは、キャッシュ機構が複数プロセスの同時アクセスを防止する仕組みを利用していないことです。

共有メモリ(=メモリマップトファイル)の同じ位置に複数のプロセスが同時に書き込む操作は安全ではありません。文字幅キャッシュの場合、特定の文字の情報が存在しなかった場合には新たに文字の情報を書き込む操作が行われるので、複数のプロセスが同じ瞬間に同じ文字の情報を参照すると競合してデータが壊れる可能性があります。

あまり起こらなさそうに思える状況ですが、起こらない保証もありませんから、いつかどこかで起きると思って対策した方がいい気がします。

問題のカテゴリ

berryzplus commented 3 years ago

このissueに関連して気付いたことがあります。

https://github.com/sakura-editor/sakura/blob/b2178a2e9710774b5383b96e451d22541c2e1934/sakura_core/env/CShareData.cpp#L736-L743

738行目、739行目がこのissueの議題です。 見たら分かると思いますが、書き込みした後に「有効性チェック」っぽいことをしています。

kengoide commented 3 years ago

DLLSHAREDATA::m_sCharWidth のサイズやオフセットが異なる場合にクラッシュしそうですね…。

このissueについては共有メモリにキャッシュを置くのをやめる方向で検討します。