[Bug 27282] TDRABCSetup.exe hang on start up (GetWindowText uses SendMessage to query for process' local window title text, leading to potential deadlock)

wine-bugs at winehq.org wine-bugs at winehq.org
Sat Jan 14 05:03:58 CST 2012


http://bugs.winehq.org/show_bug.cgi?id=27282

Anastasius Focht <focht at gmx.net> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
                 CC|                            |focht at gmx.net
          Component|-unknown                    |user32
            Summary|TDRABCSetup.exe hang on     |TDRABCSetup.exe hang on
                   |start up                    |start up (GetWindowText
                   |                            |uses SendMessage to query
                   |                            |for process' local window
                   |                            |title text, leading to
                   |                            |potential deadlock)
     Ever Confirmed|0                           |1

--- Comment #5 from Anastasius Focht <focht at gmx.net> 2012-01-14 05:03:58 CST ---
Hello,

confirming.

It seems the installer looks for specific processes using window title match.

A second worker thread is spawned that calls FindWindow() and while the main
thread waits for the worker to finish (without pumping messages).

Although the installer doesn't explicitly create a window up to this point, a
hidden window has already been created as part of OLE init.

Wine's current FindWindow -> window list -> GetWindowText() logic uses
SendMessage() if the window is created in same process.
This deadlocks here because the main thread is blocked, not pumping messages.

Relevant part of trace log:

--- snip ---
0024:Starting process L"Z:\\home\\focht\\Downloads\\TDRABCSetup.exe"
(entryproc=0x403542)
0024:Call comctl32.InitCommonControls() ret=00403567
0024:Ret  comctl32.InitCommonControls() retval=68754b05 ret=00403567
0024:Call KERNEL32.SetErrorMode(00008001) ret=00403572
0024:Ret  KERNEL32.SetErrorMode() retval=00000000 ret=00403572
0024:Call ole32.OleInitialize(00000000) ret=00403579 
...
0024:Call user32.CreateWindowExW(00000000,7062df00 L"OleMainThreadWndClass
0x########
",00000000,00000000,00000000,00000000,00000000,00000000,fffffffd,00000000,70540000,00000000)
ret=7055e6f6 
...
0024:Ret  user32.CreateWindowExW() retval=00060052 ret=7055e6f6 
...
0024:Call KERNEL32.LoadLibraryExW(0040e0b0
L"C:\\users\\focht\\Temp\\nsm3ed0.tmp\\Plugin_ABC.dll",00000000,00000008)
ret=0040218b 
...
0024:Ret  KERNEL32.LoadLibraryExW() retval=00370000 ret=0040218b 
...
0024:CALL
Plugin_ABC.CloseGarbageWindows(00000000,00002004,00471000,0040a0a0,0040a000)
ret=004021d8 
...
0024:Call
KERNEL32.CreateThread(00000000,00000000,00372160,00000000,00000000,00000000)
ret=00372222
0024:Ret  KERNEL32.CreateThread() retval=00000044 ret=00372222
0024:Call KERNEL32.WaitForSingleObject(00000044,ffffffff) ret=0037222b 
...
0025:Starting thread proc 0x372160 (arg=(nil))
0025:Call KERNEL32.GetSystemDefaultLangID() ret=00372167
0025:Ret  KERNEL32.GetSystemDefaultLangID() retval=00000409 ret=00372167
0025:Call user32.FindWindowW(00000000,00376438 L"Internet Banking of
Agricultural Bank of China") ret=003721ae 

<deadlock here>
--- snip ---

Nice how they call their own stuff "garbage windows" ;-)

Debugger, creation of hidden window:

--- snip ---
Wine-dbg>bt
Backtrace:
=>0 0x682755cf WIN_CreateWindowEx+0x719(cs=0x33f98c,
className="OleMainThreadWndClass 0x######## ", module=0x68850000, unicode=0x1)
[/home/focht/projects/wine/wine-git/include/winbase.h:2540] in user32
(0x0033f974)
  1 0x68276413 CreateWindowExW+0x7d(exStyle=0, className="OleMainThreadWndClass
0x######## ", windowName=0x0(nil), style=0, x=0, y=0, width=0, height=0,
parent=0xfffffffd, menu=(nil), instance=0x68850000, data=0x0(nil))
[/home/focht/projects/wine/wine-git/dlls/user32/win.c:1583] in user32
(0x0033f9c4)
  2 0x688696f6 apartment_createwindowifneeded+0x9c(apt=0x12a750)
[/home/focht/projects/wine/wine-git/dlls/ole32/compobj.c:1195] in ole32
(0x0033fa34)
  3 0x68867760 apartment_get_or_create+0xff(model=0x2)
[/home/focht/projects/wine/wine-git/dlls/ole32/compobj.c:391] in ole32
(0x0033fa84)
  4 0x68869ea8 CoInitializeEx+0x19d(lpReserved=0x0(nil), dwCoInit=0x2)
[/home/focht/projects/wine/wine-git/dlls/ole32/compobj.c:1443] in ole32
(0x0033faf4)
  5 0x68894fdc OleInitialize+0x76(reserved=0x0(nil))
[/home/focht/projects/wine/wine-git/dlls/ole32/ole2.c:185] in ole32
(0x0033fb54)
Wine-dbg>info locals
0x682755cf WIN_CreateWindowEx+0x719: (0033f974)
    CREATESTRUCTW* cs=0x33f98c (parameterEBP)
    LPCWSTR className="OleMainThreadWndClass 0x######## " (parameterEBP)
    HINSTANCE module=0x68850000 (parameterEBP)
...
    HWND hwnd=0x2002c (localEBP)
    HWND parent=0x20034 (localEBP)
    HWND owner=(nil) (localEBP)
    HWND top_child=(nil) (localEBP)
    MDICREATESTRUCTW mdi_cs={szClass=0x0(nil), szTitle=0x0(nil), hOwner=(nil),
x=0, y=0, cx=0, cy=0, style=0, lParam=0} (localEBP)
    CBT_CREATEWNDW cbtc={lpcs=(nil), hwndInsertAfter=(nil)} (localEBP)
    CREATESTRUCTW cbcs={lpCreateParams=0x0(nil), hInstance=(nil), hMenu=(nil),
hwndParent=(nil), cy=0, cx=0, y=0, x=0, style=0, lpszName=0x0(nil),
lpszClass=0x0(nil), dwExStyle=0} (localEBP)
    DWORD ret=0x24 (localEBP)
--- snip ---

Debugger, synchronous send message call to blocked main thread:

--- snip ---
Wine-dbg>bt
Backtrace:
=>0 0x68284ec3 send_message(info=0xe1e940, res_ptr=0xe1e96c, unicode=0x1)
[/home/focht/projects/wine/wine-git/dlls/user32/message.c:3064] in user32
(0x00e1e978)
  1 0x682b685d GetWindowTextW+0x4e(hwnd=0x2002c, lpString="", nMaxCount=0x30)
[/home/focht/projects/wine/wine-git/dlls/user32/win.c:2552] in user32
(0x00e1e998)
  2 0x682b4b1b FindWindowExW+0x15f(parent=(nil), child=(nil),
className=0x0(nil), title="Internet Banking of Agricultural Bank of China")
[/home/focht/projects/wine/wine-git/dlls/user32/win.c:1775] in user32
(0x00e1e9d8)
  3 0x682b4e05 FindWindowW+0x33(className=0x0(nil), title="Internet Banking of
Agricultural Bank of China")
[/home/focht/projects/wine/wine-git/dlls/user32/win.c:1843] in user32
(0x00e1e9f8)
  4 0x003421ae in plugin_abc (+0x21ad) (0x682b4dd1)
--- snip ---

Source:
http://source.winehq.org/git/wine.git/blob/8f565eb6ae2663e2ef11342e85ce1cada1f6404c:/dlls/user32/win.c#l2544

--- snip ---
2547 INT WINAPI GetWindowTextW( HWND hwnd, LPWSTR lpString, INT nMaxCount )
2548 {
2549     if (!lpString) return 0;
2550 
2551     if (WIN_IsCurrentProcess( hwnd ))
2552         return (INT)SendMessageW( hwnd, WM_GETTEXT, nMaxCount,
(LPARAM)lpString );
2553 
2554     /* when window belongs to other process, don't send a message */
2555     if (nMaxCount <= 0) return 0;
2556     get_server_window_text( hwnd, lpString, nMaxCount );
2557     return strlenW(lpString);
2558 }
--- snip ---

$ sha1sum TDRABCSetup.exe 
07f5d29a22ac01ab4eebf6779001dc6794028066  TDRABCSetup.exe

$ wine --version
wine-1.3.37

Regards

-- 
Configure bugmail: http://bugs.winehq.org/userprefs.cgi?tab=email
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