[Bug 10924] Netbeans 6 installer hangs or exits silently

wine-bugs at winehq.org wine-bugs at winehq.org
Sat Oct 4 09:49:49 CDT 2014


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

Anastasius Focht <focht at gmx.net> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |focht at gmx.net
          Component|-unknown                    |ntdll
           Hardware|Other                       |x86
            Version|unspecified                 |0.9.51.
                 OS|other                       |Linux

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

confirming, still present.

JDK prerequisite can be downloaded here:

http://www.atteya.net/site/en/downloads/java-jdk?download=47:java-jdk-6u45-windows-i586

To install JDK in unattended, silent mode:

--- snip ---
$ wine jdk-6u45-windows-i586.exe /s
--- snip ---

To avoid resetting the WINEPREFIX every time after testing (installer complains
about already running installer after abort due to lockfiles):

--- snip ---
$ wine cmd.exe /C "rmdir %USERPROFILE%\\.nbi /s /q"
--- snip ---

The bootstapper process spawns several Java JVMs to execute prerequisite checks
and finally for the full installer which lives in a Java bundle.

For each process a set of named pipes is created for stdin/out/err redirection.
Additionally a 'wineconsole' process is created implicitly due to the nature of
'java.exe' being a console process type.

The process/thread ids for better overview:

--- snip ---
Wine-dbg>info thread

process  tid      prio (all id:s are in hex)
00000008 netbeans-6.0.1-ml-javase-windows.exe
    00000022    0
    00000009    0
...
00000030 (D) C:\Program Files\Java\jre6\bin\java.exe
    0000000b    1
    00000047    0
    00000046    0
    00000045    0
    00000044    0
    00000042    0
    00000041    0
    0000003f    0
    0000003e    0
    0000003d    2
    0000003c    2
    0000003b    0
    0000003a    2
    00000039    2
    00000038    2
    00000037    1
    00000036    2
    00000035    2
    00000034    0
    00000031    0
00000032 wineconsole.exe
    00000033    0
--- snip ---

Trace log:

--- snip ---
$ WINEDEBUG=+tid,+seh,+loaddll,+process,+wineconsole,+relay,+server wine
./netbeans-6.0.1-ml-javase-windows.exe >>log.txt 2>&1
...
0022:Call KERNEL32.CreatePipe(0067e9e8,0067e9ec,0067e9d4,00000000) ret=004075ef
0022: create_named_pipe( access=80100000, attributes=00000042, rootdir=0000,
options=00000020, sharing=00000002, maxinstances=00000001, outsize=00000000,
insize=00000000, timeout=0, flags=00000000,
name=L"\\??\\pipe\\Win32.Pipes.00000008.00000007" )
0022: create_named_pipe() = 0 { handle=0090 }
0022: open_file_object( access=40100000, attributes=00000042, rootdir=0000,
sharing=00000000, options=00000060,
filename=L"\\??\\pipe\\Win32.Pipes.00000008.00000007" )
0022: open_file_object() = 0 { handle=0094 }
0022:Ret  KERNEL32.CreatePipe() retval=00000001 ret=004075ef
...
0022:Call KERNEL32.CreatePipe(0067e9e0,0067e9e4,0067e9d4,00000000) ret=00407639
0022: create_named_pipe( access=80100000, attributes=00000042, rootdir=0000,
options=00000020, sharing=00000002, maxinstances=00000001, outsize=00000000,
insize=00000000, timeout=0, flags=00000000,
name=L"\\??\\pipe\\Win32.Pipes.00000008.00000008" )
0022: create_named_pipe() = 0 { handle=0098 }
0022: open_file_object( access=40100000, attributes=00000042, rootdir=0000,
sharing=00000000, options=00000060,
filename=L"\\??\\pipe\\Win32.Pipes.00000008.00000008" )
0022: open_file_object() = 0 { handle=009c }
0022:Ret  KERNEL32.CreatePipe() retval=00000001 ret=00407639 
...
0022:Call KERNEL32.CreateProcessW(00000000,0014fab0 L"\"C:\\Program
Files\\Java\\jre6\\bin\\java.exe\" -Djava.io.tmpdir=C:\\users\\focht\\Temp\\
-Xmx256m -Xms64m -classpath C:\\users\\focht\\Temp\\\\NBI33045.tmp\\bundle.jar
org.netbeans.installer.Installer
",00000000,00000000,00000001,0c000030,00000000,0013eab8
L"Z:\\home\\focht\\Downloads",0067e96c,0067e9c4) ret=00407718
...
0022:trace:process:create_process_impl app (null) cmdline L"\"C:\\Program
Files\\Java\\jre6\\bin\\java.exe\" -Djava.io.tmpdir=C:\\users\\focht\\Temp\\
-Xmx256m -Xms64m -classpath C:\\users\\focht\\Temp\\\\NBI33045.tmp\\bundle.jar
org.netbeans.installer.Installer " 
...
0031: get_startup_info() = 0 { exe_file=0014, info_size=968,
info={debug_flags=0,console_flags=0,console=0001,hstdin=0088,hstdout=0094,hstderr=009c,
...
0022:trace:process:create_process_impl started process pid 0030 tid 0031
...
0022:Ret  KERNEL32.CreateProcessW() retval=00000001 ret=00407718
...
0031:trace:process:create_process_impl app (null) cmdline L"wineconsole
--use-event=20"
...
0033: get_startup_info() = 0 { exe_file=001c, info_size=656,
info={debug_flags=0,console_flags=0,console=0000,hstdin=0088,hstdout=0094,hstderr=009c
...
0031:trace:process:create_process_impl started process pid 0032 tid 0033 
...
0033: get_console_mode( handle=0088 )
0033: get_console_mode() = OBJECT_TYPE_MISMATCH { mode=0 }
0033: get_console_mode( handle=0094 )
0033: get_console_mode() = ACCESS_DENIED { mode=0 }
0033: get_console_mode( handle=009c )
0033: get_console_mode() = ACCESS_DENIED { mode=0 }
...
0033:Starting process L"C:\\windows\\system32\\wineconsole.exe"
(entryproc=0x7edd1a80)
...
0033:trace:wineconsole:WINECON_Init using hConIn 0x28, hSynchro event 0x2c
0033: create_console_output( handle_in=0028, access=c0000000,
attributes=00000000, share=00000003, fd=-1 )
0033: create_console_output() = 0 { handle_out=0034 }
0033:trace:wineconsole:WINECON_Init using hConOut 0x34
...
--- snip ---

Within the JVM, another helper thread is created which writes to stdout:

--- snip ---
0031:Call
KERNEL32.CreateThread(00000000,00000000,00408545,004342e8,00010000,0033fa94)
ret=00408640
...
0031:Ret  KERNEL32.CreateThread() retval=00000068 ret=00408640
...
0034: init_thread() = 0 { pid=0030, tid=0034, server_start=1cfdfbad7352e2c
(-3.7657530), info_size=0, version=457, all_cpus=00000001 } 
...
0034:Call KERNEL32.GetProcAddress(6d330000,00545990
"_Java_java_io_FileDescriptor_set at 12") ret=6d8f6412
0034:Ret  KERNEL32.GetProcAddress() retval=6d331cba ret=6d8f6412
0034:Call KERNEL32.GetStdHandle(fffffff6) ret=6d331cca
0034:Ret  KERNEL32.GetStdHandle() retval=00000088 ret=6d331cca
0034:Call KERNEL32.GetStdHandle(fffffff5) ret=6d331cca
0034:Ret  KERNEL32.GetStdHandle() retval=00000094 ret=6d331cca
0034:Call KERNEL32.GetStdHandle(fffffff4) ret=6d331cca
0034:Ret  KERNEL32.GetStdHandle() retval=0000009c ret=6d331cca 
...
0034:Call KERNEL32.CreateFileW(005ebe00
L"C:\\users\\focht\\.nbi\\log\\20141004125823.log",40000000,00000003,00000000,00000002,00000080,00000000)
ret=6d33479a
0034:Ret  KERNEL32.CreateFileW() retval=000001b4 ret=6d33479a
...
0034:Call KERNEL32.WriteFile(00000094,0085c424,00000051,0085c3fc,00000000)
ret=6d334a71
0034:Ret  KERNEL32.WriteFile() retval=00000001 ret=6d334a71
0034:Call KERNEL32.WriteFile(00000094,0085c454,00000002,0085c42c,00000000)
ret=6d334a71
0034:Ret  KERNEL32.WriteFile() retval=00000001 ret=6d334a71 
...
0022:Call
KERNEL32.PeekNamedPipe(00000090,0067e128,000003ff,0067e0dc,0067e0cc,00000000)
ret=0040732e
0022:Ret  KERNEL32.PeekNamedPipe() retval=00000001 ret=0040732e
0022:Call KERNEL32.ReadFile(00000090,0067e128,000003ff,0067e0dc,00000000)
ret=004072cb
0034:Call KERNEL32.WriteFile(000001b4,0085c514,00000044,0085c4ec,00000000)
ret=6d334a71
0034:Ret  KERNEL32.WriteFile() retval=00000001 ret=6d334a71
0022:Ret  KERNEL32.ReadFile() retval=00000001 ret=004072cb

<this is the last time a 'ReadFile' on pipe is seen in the parent>

0022:Call KERNEL32.WriteFile(00000004,0067e128,000001f4,0067e0bc,00000000)
ret=004072ef
[2014-10-04 12:58:23.632]: entering --
org.netbeans.installer.Installer.main():99
[2014-10-04 12:58:23.638]: initializing the installer engine
[2014-10-04 12:58:23.652]:     entering --
org.netbeans.installer.Installer.<init>():156
[2014-10-04 12:58:23.652]:     dumping target system information
[2014-10-04 12:58:23.652]:         system properties:
[2014-10-04 12:58:23.653]:             awt.toolkit => sun.awt.windows.WToolkit
[2014-10-04 12:58:23.653]:             file.encoding => Cp1252
...
0022:Call KERNEL32.WriteFile(00000004,0067e128,00000332,0067e0bc,00000000)
ret=004072ef
[2014-10-04 12:58:23.654]:             java.vm.info => mixed mode, sharing
[2014-10-04 12:58:23.654]:             java.vm.name => Java HotSpot(TM) Client
VM
[2014-10-04 12:58:23.654]:             java.vm.specification.name => Java
Virtual Machine Specification
[2014-10-04 12:58:23.654]:             java.vm.specification.vendor => Sun
Microsystems Inc.
[2014-10-04 12:58:23.654]:             java.vm.specification.version => 1.0
[2014-10-04 12:58:23.654]:             java.vm.vendor => Sun Microsystems Inc.
[2014-10-04 12:58:23.654]:             java.vm.version => 20.45-b01
[2014-10-04 12:58:23.654]:             line.separator => 
[2014-10-04 12:58:23.654]:             os.arch => x86
[2014-10-04 12:58:23.655]:             os.name => Windows XP
[2014-10-04 12:58:23.655]:             os.version => 5.1
...
--- snip ---

The parent process periodically polls the named pipes which are connected to
the child process via std handles -> 'PeekNamedPipe(00000090, ...)' and writes
to its own stdout -> 'WriteFile(00000004, ...)'.
Additionally there is a log file (handle=000001b4) which is also written to.

At one point another JNI library is loaded within the VM which also starts
writing to the log file and stdout:

--- snip ---
...
0034:Call
KERNEL32.CreateThread(00000000,00000000,7c3494f6,032b38f0,00010004,0085e634)
ret=7c3495f0 
...
0044: init_thread() = 0 { pid=0030, tid=0044, server_start=1cfdfbad7352e2c
(-6.9984780), info_size=0, version=457, all_cpus=00000001 } 
...
0034:Ret  KERNEL32.CreateThread() retval=00000308 ret=7c3495f0
...
0044:Call KERNEL32.CreateFileW(03368918
L"C:\\users\\focht\\Temp\\nbi-3176498415577698668.tmp",40000000,00000003,00000000,00000002,00000080,00000000)
ret=6d33479a
0044:Ret  KERNEL32.CreateFileW() retval=0000032c ret=6d33479a
...
0044:trace:loaddll:load_native_dll Loaded
L"C:\\users\\focht\\Temp\\nbi-3176498415577698668.tmp" at 0x10000000: native 
...
0044:Call KERNEL32.GetStdHandle(fffffff5) ret=10006a05
0044:Ret  KERNEL32.GetStdHandle() retval=00000094 ret=10006a05
0044:Call KERNEL32.GetFileType(00000094) ret=10006a17
0044:Ret  KERNEL32.GetFileType() retval=00000003 ret=10006a17
...
0044:Call KERNEL32.GetProcAddress(10000000,0326e0b0
"_Java_org_netbeans_installer_utils_system_windows_WindowsRegistry_getStringValue0 at 24")
ret=6d331a97
0044:Ret  KERNEL32.GetProcAddress() retval=100019af ret=6d331a97
...
0044:Call KERNEL32.WriteFile(000001b4,0415c0c4,00000065,0415c09c,00000000)
ret=6d334a71
0044:Ret  KERNEL32.WriteFile() retval=00000001 ret=6d334a71
0044:Call KERNEL32.WriteFile(00000094,0415bfd4,00000063,0415bfac,00000000)
ret=6d334a71
0044:Ret  KERNEL32.WriteFile() retval=00000001 ret=6d334a71
0044:Call KERNEL32.WriteFile(00000094,0415c004,00000002,0415bfdc,00000000)
ret=6d334a71

<thread 0044 now blocks forever on the pipe>

0022:Call KERNEL32.Sleep(00000001) ret=00407468
0022:Ret  KERNEL32.Sleep() retval=00000000 ret=00407468
0022:Call
KERNEL32.PeekNamedPipe(00000090,0067e128,000003ff,0067e0dc,0067e0cc,00000000)
ret=0040732e
0022:Ret  KERNEL32.PeekNamedPipe() retval=00000001 ret=0040732e
0022:Call
KERNEL32.PeekNamedPipe(00000098,0067e128,000003ff,0067e0d0,0067e0c0,00000000)
ret=0040732e
0022:Ret  KERNEL32.PeekNamedPipe() retval=00000001 ret=0040732e
0022:Call
KERNEL32.PeekNamedPipe(00000088,0067e128,000003ff,0067e0c4,0067e0b4,00000000)
ret=0040732e
0022:Ret  KERNEL32.PeekNamedPipe() retval=00000001 ret=0040732e
0022:Call KERNEL32.GetExitCodeProcess(000000a8,0067e124) ret=004074a8
0022: get_process_info( handle=00a8 )
0022: get_process_info() = 0 { pid=0030, ppid=0008, affinity=0000000f,
peb=7ffdf000, start_time=1cfdfbad93e45fa (-12.0077230), end_time=0,
exit_code=259, priority=2, cpu=x86, debugger_present=0 }
0022:Ret  KERNEL32.GetExitCodeProcess() retval=00000001 ret=004074a8 
<sequence repeats over again>
--- snip ---

Thread 0022 child stdin/out/err named pipe peek repeats all the time but no
further reads are seen -> 'ReadFile(00000090, ...)'. They simply stop at some
point but the child still keeps writing data to the other pipe end.

When the pipe buffer limit is reached, the write will block, causing the GUI to
freeze (simplified, it's more complicated though, there are several threads in
the VM which are "chained" through events).

If the parent process is left out of the equation (which also removes the std
pipe redirection), the installer works fine:

You need to copy/find the extracted 'bundle.jar' from temp install folder.

--- snip ---
$ wine "C:\\Program Files\\Java\\jre6\\bin\\java.exe"
-Djava.io.tmpdir="C:\\users\\focht\\Temp" -Xmx256m -Xms64m -classpath
"bundle.jar" org.netbeans.installer.Installer
--- snip ---

Down to the metal ...

The code from the parent process (bootstrapper) in question:

--- snip ---
...
00407315  PUSH ECX                               ; NULL
00407316  LEA EAX,DWORD PTR SS:[EBP-4]
00407319  PUSH EAX                               ; &bytesAvail
0040731A  LEA EAX,DWORD PTR SS:[EBP+C]
0040731D  PUSH EAX                               ; &bytesRead
0040731E  MOV ESI,3FF
00407323  PUSH ESI                               ; PIPE_BUFLEN-1 = 0x3ff (1023)
00407324  PUSH EDI                               ; Buffer
00407325  PUSH DWORD PTR SS:[EBP+8]              ; hPipe
00407328  CALL DWORD PTR DS:[<&KERNEL32.PeekNamedPipe>]
0040732E  CMP DWORD PTR SS:[EBP+C],0
00407332  JE SHORT netbeans.0040737B             ; fast fail
00407334  PUSH 4
00407336  POP ECX                                ; 4 bytes ???
00407337  MOV EAX,EDI
00407339  MOV BYTE PTR DS:[EAX],0                ; zero bytes on pipe buffer
0040733C  INC EAX
0040733D  DEC ECX
0040733E  JNZ SHORT netbeans.00407339
00407340  CMP DWORD PTR SS:[EBP-4],400           ; bytesAvail >= PIPE_BUFLEN?
00407347  JNB SHORT netbeans.00407374            ; -> check bytesRead
00407349  PUSH DWORD PTR SS:[EBP+10]             ; Arg4 = handle
0040734C  LEA EAX,DWORD PTR SS:[EBP+C]
0040734F  PUSH EAX                               ; Arg3 = &bytesRead
00407350  PUSH EDI                               ; Arg2 = Buffer
00407351  PUSH DWORD PTR SS:[EBP+8]              ; Arg1 = hPipe
00407354  CALL netbeans.004072B0                 ; ReadFile on the pipe buffer
00407359  ADD ESP,10
0040735C  MOV EAX,DWORD PTR SS:[EBP+C]           ; bytesRead
0040735F  JMP SHORT netbeans.0040737D            ; return bytesRead
00407361  PUSH DWORD PTR SS:[EBP+10]             ; Arg4 = handle
00407364  LEA EAX,DWORD PTR SS:[EBP+C]
00407367  PUSH EAX                               ; Arg3 = &bytesRead
00407368  PUSH EDI                               ; Arg2 = Buffer
00407369  PUSH DWORD PTR SS:[EBP+8]              ; Arg1 = hPipe
0040736C  CALL netbeans.004072B0                 ; ReadFile on the pipe buffer
00407371  ADD ESP,10
00407374  CMP DWORD PTR SS:[EBP+C],ESI           ; bytesRead >= PIPE_BUFLEN-1 ?
00407377  JNB SHORT netbeans.00407361            ; read loop
00407379  JMP SHORT netbeans.0040735C
0040737B  XOR EAX,EAX                            ; return 0
0040737D  POP EDI
0040737E  POP ESI
0040737F  LEAVE
00407380  RETN
--- snip ---

The following C-code snippet is basically the above assembly translated:

--- snip ---
...
    DWORD bytesRead;
    DWORD bytesAvail;

    PeekNamedPipe(hPipe, buf, PIPE_BUFLEN-1, &bytesRead, &bytesAvail, NULL);
    if (bytesRead != 0)
    {
        /* probably a sizeof(buf) vs. sizeof(*buf) bug in this garbage code */
        zero_out_first_four_bytes_on_buf();

        if (bytesAvail >= PIPE_BUFLEN)
        {
           while (bytesRead >= PIPE_BUFLEN-1)
           {
               /* ReadFile(hPipe, buf, PIPE_BUFLEN-1, &bytesRead, NULL) */
               read_buf_helper(hPipe, buf, &bytesRead, hSomeHandle);
           }
        }
        else
        {
             readBuf(hRead, buf, &bytesRead, hSomeHandle);
        }
        return bytesRead;
    }
    return 0;
}
--- snip ---

Following is a custom trace of pipe peek to illustrate the problem from the
Linux side, after 'recv( ... MSG_PEEK)' call.

I instrumented this code:
http://source.winehq.org/git/wine.git/blob/82ce3fdcfd1a5d8bfe24d58dcc51ddc3a1dea040:/dlls/ntdll/file.c#l1531

'recv' is not even guaranteed to return all data that is currently buffered.

--- snip ---
0022:trace:ntdll:NtFsControlFile **** avail=61, data_size=1023, recv_res=8
0022:trace:ntdll:NtFsControlFile **** avail=61, data_size=1023, recv_res=61
0022:trace:ntdll:NtFsControlFile **** avail=568, data_size=1023, recv_res=81
0022:trace:ntdll:NtFsControlFile **** avail=463, data_size=1023, recv_res=2
0022:trace:ntdll:NtFsControlFile **** avail=366, data_size=1023, recv_res=2
0022:trace:ntdll:NtFsControlFile **** avail=511, data_size=1023, recv_res=91
0022:trace:ntdll:NtFsControlFile **** avail=514, data_size=1023, recv_res=78
0022:trace:ntdll:NtFsControlFile **** avail=434, data_size=1023, recv_res=92
0022:trace:ntdll:NtFsControlFile **** avail=809, data_size=1023, recv_res=60
0022:trace:ntdll:NtFsControlFile **** avail=809, data_size=1023, recv_res=2
0022:trace:ntdll:NtFsControlFile **** avail=1149, data_size=1023, recv_res=57
0022:trace:ntdll:NtFsControlFile **** avail=2630, data_size=1023, recv_res=57
0022:trace:ntdll:NtFsControlFile **** avail=4248, data_size=1023, recv_res=57
0022:trace:ntdll:NtFsControlFile **** avail=5577, data_size=1023, recv_res=57
...
0022:trace:ntdll:NtFsControlFile **** avail=12187, data_size=1023, res=57
--- snip ---

The only way to work around this app garbage code is to limit
'buffer->ReadDataAvailable' to not exceed caller 'data_size'.
With that fix in place the installer works.

If Alexandre doesn't want this limitation, the bug is a WONTFIX (stupid app).

$ sha1sum netbeans-6.0.1-ml-javase-windows.exe
70e8a3426214bb47f4db01570849903a3ab44960  netbeans-6.0.1-ml-javase-windows.exe

$ du -sh netbeans-6.0.1-ml-javase-windows.exe
28M    netbeans-6.0.1-ml-javase-windows.exe

$ wine --version
wine-1.7.28

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