Re-examining SetThreadContext

Mike Hearn mh at codeweavers.com
Sun Feb 6 11:17:24 CST 2005


Hi Alexandre,

A user recently reported another app that doesn't work due to Armadillo
copy protection. This scheme requires SetThreadContext/GetThreadContext to
work properly and currently they do not.

These two functions require the thread to be suspended, therefore they
always return a bogus context (blocking on a wineserver wait pipe).

I wrote a patch for this a while ago:

http://navi.cx/svn/misc/trunk/winekb/patches/thread-context.patch

However you felt it had races in it. There were two possible races I could
see:

- The race between suspending the thread and the sigcontext being uploaded.
  This was not a problem with my patch as Get/SetThreadContext loop.

- A race where you can call SuspendThread again before the SIGUSR1 handler
  has completed. I believe this was the sticking point last time, no? But
  I can't see how this can happen because SIGUSR1 is blocked while it's
  being handled.

So in the following sequence:

PROCESS A: SuspendThread()
PROCESS A: GetThreadContext()
PROCESS B: SIGUSR1
PROCESS B: upload sigcontext
PROCESS B: block
PROCESS A: GetThreadContext() returns
PROCESS A: ResumeThread
PROCESS B: unblock, download sigcontext, restore, finish

I do not see where the races are. Could you please re-examine this patch
and let me know if there are any more problems with it?

Dealing with the set/thread context operations in SIGUSR1 makes sense
because they are only allowed when the target thread is suspended.

thanks -mike




More information about the wine-devel mailing list