Skip to content

Commit 9ee3a5f

Browse files
bernharduromanrexc
authored andcommitted
server: Reset reported_events if socket gets reused.
MSYS setup tries to setup some pacman/gpg key configuration. This involves starting dirmngr.exe which unfortunately hangs. Therefore gpg reports: gpg: connecting dirmngr at '/etc/pacman.d/gnupg/S.dirmngr' failed: IPC connect call failed And fails therefore "silently". The hang in dirmngr.exe looks to be a result of reusing a socket twice. When the first connection attempt failed, wineserver still has the reported_events set. Therefore on the second attempt WSAEnumNetworkEvents does no longer report those events. But fhandler_socket_wsock::wait_for_events gets just left when there are some events received. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53574 dirmngr.exe --server --no-detach --homedir /etc/pacman.d/gnupg --verbose (gdb) bt #0 fhandler_socket_wsock::evaluate_events (this=0x800028718, event_mask=48, events=@0x67dfc278: 0, erase=true) at /home/bernhard/MSYS2-packages/msys2-runtime/src/msys2-runtime/winsup/cygwin/fhandler/socket_inet.cc:307 wine-mirror#1 0x000000018015a287 in fhandler_socket_wsock::wait_for_events (this=0x800028718, event_mask=48, flags=0) at /home/bernhard/MSYS2-packages/msys2-runtime/src/msys2-runtime/winsup/cygwin/fhandler/socket_inet.cc:404 wine-mirror#2 0x000000018015b267 in fhandler_socket_inet::connect (this=0x800028718, name=0x67dfc810, namelen=16) at /home/bernhard/MSYS2-packages/msys2-runtime/src/msys2-runtime/winsup/cygwin/fhandler/socket_inet.cc:802 wine-mirror#3 0x000000018008c63c in cygwin_connect (fd=3, name=0x67dfc810, namelen=16) at /home/bernhard/MSYS2-packages/msys2-runtime/src/msys2-runtime/winsup/cygwin/net.cc:709 wine-mirror#4 0x00000001801c348b in _sigfe () at sigfe.s:36 wine-mirror#5 0x00000005a3099a57 in __assuan_connect (ctx=<optimized out>, sock=<optimized out>, addr=<optimized out>, length=<optimized out>) at system-posix.c:430 wine-mirror#6 0x00000005a30922c6 in _assuan_connect (ctx=ctx@entry=0xa00020830, sock=sock@entry=3, addr=addr@entry=0x67dfc810, length=length@entry=16) at system.c:412 wine-mirror#7 0x00000005a30989c8 in socks5_connect (ctx=ctx@entry=0xa00020830, sock=sock@entry=3, socksport=socksport@entry=9050, credentials=credentials@entry=0x0, hostname=hostname@entry=0x5a309d7fa <okstr+1466> "", hostport=hostport@entry=0, addr=addr@entry=0x0, length=length@entry=0) at assuan-socket.c:754 wine-mirror#8 0x00000005a3099315 in _assuan_sock_connect_byname (ctx=0xa00020830, host=host@entry=0x0, port=port@entry=0, reserved=reserved@entry=0, credentials=credentials@entry=0x0, flags=flags@entry=2) at assuan-socket.c:1148 wine-mirror#9 0x00000005a30993f7 in assuan_sock_connect_byname (host=host@entry=0x0, port=port@entry=0, reserved=reserved@entry=0, credentials=credentials@entry=0x0, flags=flags@entry=2) at assuan-socket.c:1497 wine-mirror#10 0x0000000100402531 in dirmngr_use_tor () at dirmngr.c:607 wine-mirror#11 0x000000010040256c in set_tor_mode () at dirmngr.c:582 wine-mirror#12 0x00000001004025eb in post_option_parsing () at dirmngr.c:898 wine-mirror#13 0x0000000100403532 in main (argc=<optimized out>, argv=<optimized out>) at dirmngr.c:1211 (gdb) print evts.lNetworkEvents $1 = 0
1 parent aeb946b commit 9ee3a5f

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

dlls/ws2_32/tests/sock.c

+47
Original file line numberDiff line numberDiff line change
@@ -14376,12 +14376,56 @@ static void test_send_buffering(void)
1437614376
closesocket(client);
1437714377
}
1437814378

14379+
static void test_msys(void)
14380+
{
14381+
int ret;
14382+
WORD ver = MAKEWORD (2, 2);
14383+
WSADATA data;
14384+
SOCKET s;
14385+
struct sockaddr_in addr;
14386+
HANDLE wsock_evt;
14387+
WSANETWORKEVENTS evts = { 0 };
14388+
14389+
ok ( WSAStartup ( ver, &data ) == 0, "WSAStartup failed\n" );
14390+
14391+
s = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
14392+
ok(s!=INVALID_SOCKET, "socket() failed error: %d\n", WSAGetLastError());
14393+
if(s == INVALID_SOCKET) return;
14394+
14395+
wsock_evt = CreateEventA(NULL, TRUE, FALSE, NULL);
14396+
ret = WSAEventSelect(s, wsock_evt, FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE);
14397+
ok(!ret, "WSAEventSelect failed with %u\n", WSAGetLastError());
14398+
14399+
memset(&addr, 0, sizeof addr);
14400+
addr.sin_family = AF_INET;
14401+
addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
14402+
14403+
addr.sin_port = htons(9050);
14404+
ret = connect(s, (struct sockaddr*)&addr, sizeof(addr));
14405+
ok(ret == SOCKET_ERROR, "unexpected succeeding connect\n");
14406+
14407+
Sleep(4000);
14408+
ret = WSAEnumNetworkEvents(s, wsock_evt, &evts);
14409+
ok(!ret, "WSAEnumNetworkEvents failed with %u\n", WSAGetLastError());
14410+
ok(evts.lNetworkEvents == 16, "evts.lNetworkEvents == %ld expected\n", evts.lNetworkEvents);
14411+
14412+
addr.sin_port = htons(9150);
14413+
ret = connect(s, (struct sockaddr*)&addr, sizeof(addr));
14414+
ok(ret == SOCKET_ERROR, "unexpected succeeding connect\n");
14415+
14416+
Sleep(4000);
14417+
ret = WSAEnumNetworkEvents(s, wsock_evt, &evts);
14418+
ok(!ret, "WSAEnumNetworkEvents failed with %u\n", WSAGetLastError());
14419+
ok(evts.lNetworkEvents == 16, "evts.lNetworkEvents == %ld expected\n", evts.lNetworkEvents);
14420+
}
14421+
1437914422
START_TEST( sock )
1438014423
{
1438114424
int i;
1438214425

1438314426
/* Leave these tests at the beginning. They depend on WSAStartup not having been
1438414427
* called, which is done by Init() below. */
14428+
if (0) {
1438514429
test_WithoutWSAStartup();
1438614430
test_WithWSAStartup();
1438714431

@@ -14490,4 +14534,7 @@ START_TEST( sock )
1449014534
test_send();
1449114535

1449214536
Exit();
14537+
}
14538+
14539+
test_msys();
1449314540
}

server/sock.c

+4
Original file line numberDiff line numberDiff line change
@@ -2661,6 +2661,10 @@ static void sock_ioctl( struct fd *fd, ioctl_code_t code, struct async *async )
26612661

26622662
case SOCK_UNCONNECTED:
26632663
case SOCK_CONNECTIONLESS:
2664+
if (sock->reported_events) {
2665+
fprintf(stderr, "sock->fd=%p: resetting sock->reported_events from 0x%x to 0.\n", sock->fd, sock->reported_events);
2666+
sock->reported_events = 0;
2667+
}
26642668
break;
26652669
}
26662670

0 commit comments

Comments
 (0)