View Issue Details

Category
SSPBT:本体(SSP)
SeverityminorReproducibilityalways 
Status closed 
Fixed in Version2.4 (リリース) 
Summary0000028: 特定条件下で期待通りに文字が表示されない(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の後の文字は引数)
TagsNo tags attached.
Attach Tags
Attached Files
test1.png (2,672 bytes)   
test1.png (2,672 bytes)   

Activities

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