X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fevent.c;h=d981f75bcaeeee9e6caf0cabdd4fbe8b2b278de8;hb=3a316823b971396a428f020f401b9fe41252d98d;hp=59b96e37dc3f7d3c7fa80ed96d27be1326a915c9;hpb=ebffa40aa7832459f63801e3a91cc741e6b339a8;p=tinc diff --git a/src/event.c b/src/event.c index 59b96e37..d981f75b 100644 --- a/src/event.c +++ b/src/event.c @@ -258,8 +258,8 @@ bool event_loop(void) { while(running) { struct timeval diff; struct timeval *tv = get_time_remaining(&diff); - memcpy(&readable, &readfds, sizeof readable); - memcpy(&writable, &writefds, sizeof writable); + memcpy(&readable, &readfds, sizeof(readable)); + memcpy(&writable, &writefds, sizeof(writable)); int fds = 0; @@ -357,10 +357,13 @@ bool event_loop(void) { WSANETWORKEVENTS network_events; if (WSAEnumNetworkEvents(io->fd, io->event, &network_events) != 0) return false; - if (network_events.lNetworkEvents & WRITE_EVENTS) - io->cb(io->data, IO_WRITE); if (network_events.lNetworkEvents & READ_EVENTS) io->cb(io->data, IO_READ); + /* + The fd might be available for write too. However, if we already fired the read callback, that + callback might have deleted the io (e.g. through terminate_connection()), so we can't fire the + write callback here. Instead, we loop back and let the writable io loop above handle it. + */ } } #endif