http://bugs.winehq.org/show_bug.cgi?id=29168
Xolotl Loki xoloki@gmail.com changed:
What |Removed |Added ---------------------------------------------------------------------------- CC| |xoloki@gmail.com
--- Comment #45 from Xolotl Loki xoloki@gmail.com 2011-12-18 04:34:13 CST --- I also tried to run through strace, and failed to complete login while doing so. So I looked over WS2_recv_base, and noticed something. The function has standard exit point labels (exit and error), but those are NOT the only exit points; there are two places where naked return is called, one each for success and error cases.
So I added some extra TRACE logging; I'll attach the diff to the bug. I log the return value of WS2_recv, and all the exit points. I also encode the socket value to make sure I can correlate successive log lines properly.
Here's the relavant bits:
trace:winsock:WS_connect socket 0164, ptr 0xa1cdffc { family AF_INET, address 159.153.69.80, port 8995 }, length 16 trace:winsock:WS2_recv_base socket 0164, wsabuf 0xa1cdfcc, nbufs 1, flags 0, from (nil), fromlen -1, ovl 0x57122e70, func (nil) trace:winsock:WS2_recv_base fd=223, options=0 trace:winsock:WS2_recv_base socket 0164 -> WS2_recv returned -1 bytes, errno 11 trace:winsock:WS2_recv_base socket 0164 -> returning SOCKET_ERROR, wsaErrno 259 trace:winsock:WS_shutdown socket 0164, how 2 0 trace:winsock:WS2_register_async_shutdown s 356 type 1 trace:winsock:WS_closesocket socket 0164
So when we try to connect to the server, we call
WS2_recv
which returns EAGAIN. We then go into the
if ((lpOverlapped || lpCompletionRoutine) && !(options & (FILE_SYNCHRONOUS_IO_ALERT | FILE_SYNCHRONOUS_IO_NONALERT)))
branch, which always returns SOCKET_ERROR if WS2_recv returned -1. Is this correct behavior? I don't understand enough of the context to tell.