https://bugs.kde.org/show_bug.cgi?id=344139

--- Comment #2 from Austin English <austinengl...@gmail.com> ---
To give a bit more info (and for myself in the future ;).

This is still present in development wine (wine-1.9.24-105-g1d3b944) and
valgrind (valgrind-3.13.0.SVN, #define VGSVN "16171", #define VEXSVN "3285").

It's not reproducible with every wine unit tests. The first case I found was
dlls/advapi32/tests/service.c.

For info on running wine under valgrind, see:
https://wiki.winehq.org/Wine_and_Valgrind

my scripts/suppression files are at:
https://github.com/austin987/wine_misc/tree/master/valgrind

but in short:
# get wine/wine_misc repos
$ cd wine-valgrind
$ ln -s /path/to/wine_misc/valgrind tools/valgrind
$ ./configure && make -j8
$ vi tools/valgrind/vg-wrapper.sh
# edit paths to wine/valgrind, if needed
$ . tools/valgrind/vg-wrapper.sh
$ ./wine start /min notepad
$ cd dlls/advapi32/tests
$ make service.ok
# BUG

If the bug is present, you should see:
../../../tools/runtest -q -P wine -T ../../.. -M advapi32.dll -p
advapi32_test.exe.so service && touch service.ok
preloader: Warning: failed to reserve range 00110000-68000000
preloader: Warning: failed to reserve range 7f000000-82000000
err:rpc:I_RpcGetBuffer no binding
err:seh:segv_handler Got unexpected trap 0
wine: Unhandled illegal instruction at address 0x7bc280f5 (thread 006d),
starting debugger...
preloader: Warning: failed to reserve range 00110000-68000000
preloader: Warning: failed to reserve range 7f000000-82000000

the key lines being:

err:seh:segv_handler Got unexpected trap 0
wine: Unhandled illegal instruction at address 0x7bc280f5 (thread 006d),
starting debugger...

at that point, it will hang indefinitely.

With a patch from Sebastian (for Wine):
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index 59dca6c..a8cdb96 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -2076,6 +2076,15 @@ static void segv_handler( int signal, siginfo_t
*siginfo, void *sigcontext )
         return;
     }

+    if (!get_trap_code(context) &&
+        siginfo->si_addr == (void *)EIP_sig(context) &&
+        *(char *)EIP_sig(context) == 0x36)
+    {
+        FIXME("---> working around Valgrind SIGILL exception\n");
+        EIP_sig(context)++;
+        return;
+    }
+
     /* check for page fault inside the thread stack */
     if (get_trap_code(context) == TRAP_x86_PAGEFLT &&
         (char *)siginfo->si_addr >= (char *)NtCurrentTeb()->DeallocationStack
&&

the tests will pass and not hang.

-- 
You are receiving this mail because:
You are watching all bug changes.

Reply via email to