View Issue Details

IDProjectCategoryView Status
SSPBT:本体(SSP)
SeverityminorReproducibilityalways 
Status closed 
Fixed in Version2.4 (リリース) 
Summary: 特定条件下で期待通りに文字が表示されない(Wine)
Description

*バグの詳細
Wine 4.2以降でさくらスクリプト"00\n1\nA\nあ"を実行すると
test1.pngのように表示されます。
("1", "A", "あ" が全て"0"になる)

*再現方法
4.2以降のWineでSSPを起動し、適当なゴーストを選んでCtrl+S→"00\n1\nA\nあ"を実行。
"1", "A", "あ" は任意の一文字(ワイド文字1文字分)であれば同じ症状が起こります。

*環境
Debian 10 (buster)
Wine (PlayOnLinux) 4.2, 4.4, 4.11, 4.12
SSP 2.3.97, 2.4.00, 2.4.41, 2.4.42

*原因
Wine 4.2以降に実装されている、NormalizeString関数が失敗したときの処理に起因しているようです。
MSDNのNormalizeStringの説明[1]には

NormalizeStringのSrcLengthに"-1"を指定する場合は
DstStringの末尾にNull終端が書き込まれる。

とありますが、SSPでは"1"や"あ"のようなワイド文字1文字に対して
NormalizeStringを実行する際に
DstLengthが"1"になっている[2]ためDstStringにNull終端が書き込めず失敗します。

Wine 4.2以降に実装されているNormalizeStringは
上記のような場合にはDstStringに何も書き込まないが成功扱いになるため、
SSPは成功したと誤認して直前にNormalizeStringに成功した文字列の1文字目を
誤って表示しているように見えます。

[1] https://docs.microsoft.com/en-us/windows/win32/api/winnls/nf-winnls-normalizestring#return-value
[2] WINEDEBUG=trace+nls wine /path/to/ssp.exe |& grep -i normalize を実行すると
0030:trace:nls:NormalizeString 1 L"00" -1 0x102c63c 3
0030:trace:nls:NormalizeString 1 L"1" -1 0x102c63c 1
0030:trace:nls:NormalizeString 1 L"A" -1 0x102c63c 1
0030:trace:nls:NormalizeString 1 L"\3042" -1 0x102c63c 1
のようなログが出力されました。(NormalizeStringの後の文字は引数)

Activities

2019-09-15 00:47

 

test1.png (2,672 bytes)   
test1.png (2,672 bytes)   

ponapalt

2019-09-30 10:59

administrator   ~0000042

2.4.43 修正済

Issue History

Date Modified Username Field Change
2019-09-15 00:47 guest New Issue
2019-09-15 00:47 guest File Added: test1.png
2019-09-30 10:59 ponapalt Assigned To => ponapalt
2019-09-30 10:59 ponapalt Status new => closed
2019-09-30 10:59 ponapalt Resolution open => fixed
2019-09-30 10:59 ponapalt Fixed in Version => 2.4 (リリース)
2019-09-30 10:59 ponapalt Note Added: 0000042