[Bug 28089] exception handling code touches stack for exceptions handled by the debugger

WineHQ Bugzilla wine-bugs at winehq.org
Sun Nov 29 09:50:11 CST 2020


https://bugs.winehq.org/show_bug.cgi?id=28089

Anastasius Focht <focht at gmx.net> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
      Fixed by SHA1|                            |3889c374a11d92733f6830473ff
                   |                            |589f8846a7396
           Keywords|                            |testcase
         Resolution|---                         |FIXED

--- Comment #10 from Anastasius Focht <focht at gmx.net> ---
Hello folks,

this was fixed by commits:

*
https://source.winehq.org/git/wine.git/commitdiff/485c8566f103f05dba3c8c31d3adb18b89eb032a
("ntdll: Build the exception record on the signal stack first.")

*
https://source.winehq.org/git/wine.git/commitdiff/3889c374a11d92733f6830473ff589f8846a7396
("ntdll: Send debug event before pushing exception data on x86.")

Part of Wine 5.13 release.

Thanks Alexandre.

Disassembly of 'foo' from pre-built testcase (comment #9):

--- snip ---
00401530  PUSH EBP
00401531  MOV EBP,ESP
00401533  AND ESP,FFFFFFF0
00401536  SUB ESP,30
00401539  CALL 004016A0
0040153E  MOV DWORD PTR SS:[LOCAL.4],0
00401546  MOV DWORD PTR SS:[LOCAL.1],0
0040154E  MOV DWORD PTR SS:[LOCAL.2],0
00401556  MOV DWORD PTR SS:[LOCAL.3],0
0040155E  LEA EAX,[LOCAL.5+3]
00401562  MOV DWORD PTR SS:[LOCAL.4],EAX
00401566  LEA EAX,[LOCAL.5+3]
0040156A  SUB EAX,1F4
0040156F  MOV DWORD PTR SS:[LOCAL.1],EAX
00401573  JMP SHORT 00401583
00401575  MOV EAX,DWORD PTR SS:[LOCAL.1]
00401579  LEA EDX,[EAX+1]
0040157C  MOV DWORD PTR SS:[LOCAL.1],EDX
00401580  MOV BYTE PTR DS:[EAX],55
00401583  MOV EAX,DWORD PTR SS:[LOCAL.1]
00401587  CMP EAX,DWORD PTR SS:[LOCAL.4]
0040158B  JNE SHORT 00401575
0040158D  MOV BYTE PTR SS:[LOCAL.5+3],77  ; bpx here (= cause debugger event)
00401592  LEA EAX,[LOCAL.5+3]
00401596  SUB EAX,1F4
0040159B  MOV DWORD PTR SS:[LOCAL.1],EAX
0040159F  JMP SHORT 004015CA
004015A1  MOV EAX,DWORD PTR SS:[LOCAL.1]
004015A5  MOVZX EAX,BYTE PTR DS:[EAX]
004015A8  CMP AL,55
004015AA  JE SHORT 004015C5
004015AC  CMP DWORD PTR SS:[LOCAL.2],0
004015B1  JE SHORT 004015BD
004015B3  MOV EAX,DWORD PTR SS:[LOCAL.1]
004015B7  MOV DWORD PTR SS:[LOCAL.3],EAX
004015BB  JMP SHORT 004015C5
004015BD  MOV EAX,DWORD PTR SS:[LOCAL.1]
004015C1  MOV DWORD PTR SS:[LOCAL.2],EAX
004015C5  ADD DWORD PTR SS:[LOCAL.1],1
004015CA  MOV EAX,DWORD PTR SS:[LOCAL.1]
004015CE  CMP EAX,DWORD PTR SS:[LOCAL.4]
004015D2  JNE SHORT 004015A1
004015D4  MOV EAX,DWORD PTR SS:[LOCAL.2]
004015D8  MOV DWORD PTR SS:[LOCAL.10],EAX
004015DC  MOV EAX,DWORD PTR SS:[LOCAL.3]
004015E0  MOV DWORD PTR SS:[LOCAL.11],EAX
004015E4  MOV DWORD PTR SS:[LOCAL.12],OFFSET 00404000 ; ASCII "to = %p, ..."
004015EB  CALL <JMP.&msvcrt.printf>
004015F0  MOV EAX,0
004015F5  LEAVE
004015F6  RETN
-- snip ---

To test this in automated way here is my one-liner which uses winedbg in gdb
proxy mode:

Old behaviour:

--- snip ---
$ wine --version
wine-5.12-260-g485c8566f10

$ WINEDEBUG=+console winedbg --gdb test.exe -q <<< "b
*0x0040158D"$'\n'cont$'\n' 2>&1 | grep "to ="
017c:trace:console:WriteConsoleW 0x27 L"to = 0064FDF7, from = 0064FC2B\r\n" 32
0x64fa1c (nil)
--- snip ---

Fixed:

--- snip ---
$ wine-5.12-264-g3889c374a11

$ WINEDEBUG=+console winedbg --gdb test.exe -q <<< "b
*0x0040158D"$'\n'cont$'\n' 2>&1 | grep "to ="
017c:trace:console:WriteConsoleW 0x27 L"to = 00000000, from = 00000000\r\n" 32
0x64fa1c (nil)
--- snip ---

The breakpoint triggers an exception event at the right place.

The app is a console app hence +console debug channel is used to capture and
filter the output.

Regards

-- 
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.


More information about the wine-bugs mailing list