Rainer Jung wrote: > On 21.01.2009 18:33, William A. Rowe, Jr. wrote: >> William A. Rowe, Jr. wrote: >>> Rainer Jung wrote: >>>> Could be, that there's something wrong with the code that copies the >>>> listen sockets from the main process to the child. >>> Exactly; one of the primary possibilities is that a well documented API, >>> WSADuplicateSocket does not behave for a given socket provider. >> >> It's also possible that there is an [un]obvious bug. I hate this >> particular >> tracing, but I'm off to check this out from the parent/child this >> afternoon. >> Yes - my own testing initially has been -X - it explains our discrepancy. > > Looks like I solved it: > > In r730828 Win9x code was removed. At least in one function, the Win9x > code was kept and instead the more modern code was removed, namely in > file mpm_winnt.c, function get_listeners_from_parent(): > > @@ -480,30 +466,12 @@ > exit(APEXIT_CHILDINIT); > } > > - if (osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { > - HANDLE hProcess = GetCurrentProcess(); > - HANDLE dup; > - if (DuplicateHandle(hProcess, (HANDLE) nsd, hProcess, &dup, > - 0, FALSE, DUPLICATE_SAME_ACCESS)) { > ... > - } > - } > - else { > ... > - if (!SetHandleInformation((HANDLE)nsd, HANDLE_FLAG_INHERIT, > 0)) { > ... > - } > + if (DuplicateHandle(hProcess, (HANDLE) nsd, hProcess, &dup, > + 0, FALSE, DUPLICATE_SAME_ACCESS)) { > + closesocket(nsd); > + nsd = (SOCKET) dup; > } > + > apr_os_sock_put(&lr->sd, &nsd, s->process->pool); > } > > In effect, the "if" part is still there and the else part has been > removed. As far as MSDN tells me, osver.dwPlatformId == > VER_PLATFORM_WIN32_WINDOWS is true for Win9x, so the if part is the one > to remove, and the else part is the one we might want to keep. > > When I undo this change, it works again :) > > By adding some logging, I see, that my XP system takes the else branch.
Feel free to commit - fantastic sleuthing --- Thanks!!! If you don't beat me to it the fix will be in my next round of commits :) Bill