Ensure netreq->fd is set to -1 after close()/closesocket()

If netreq->fd is not set to -1, then multiple functions close the
same socket. This causes major issues in multithread code where the
socket must not be closed multiple times as it may be owned by a
different thread.
This commit is contained in:
Neil Cook 2017-07-31 22:48:09 +01:00
parent 1b731271af
commit 2d7d6581b4
1 changed files with 5 additions and 1 deletions

View File

@ -588,6 +588,7 @@ _getdns_cancel_stub_request(getdns_network_req *netreq)
#else #else
close(netreq->fd); close(netreq->fd);
#endif #endif
netreq->fd = -1;
} }
} }
@ -606,6 +607,7 @@ stub_timeout_cb(void *userarg)
#else #else
close(netreq->fd); close(netreq->fd);
#endif #endif
netreq->fd = -1;
netreq->upstream->udp_timeouts++; netreq->upstream->udp_timeouts++;
if (netreq->upstream->udp_timeouts % 100 == 0) if (netreq->upstream->udp_timeouts % 100 == 0)
_getdns_upstream_log(netreq->upstream, GETDNS_LOG_UPSTREAM_STATS, GETDNS_LOG_DEBUG, _getdns_upstream_log(netreq->upstream, GETDNS_LOG_UPSTREAM_STATS, GETDNS_LOG_DEBUG,
@ -1413,6 +1415,7 @@ stub_udp_read_cb(void *userarg)
#else #else
close(netreq->fd); close(netreq->fd);
#endif #endif
netreq->fd = -1;
stub_next_upstream(netreq); stub_next_upstream(netreq);
} }
netreq->debug_end_time = _getdns_get_time_as_uintt64(); netreq->debug_end_time = _getdns_get_time_as_uintt64();
@ -1435,8 +1438,8 @@ stub_udp_read_cb(void *userarg)
closesocket(netreq->fd); closesocket(netreq->fd);
#else #else
close(netreq->fd); close(netreq->fd);
netreq->fd = -1;
#endif #endif
netreq->fd = -1;
while (GLDNS_TC_WIRE(netreq->response)) { while (GLDNS_TC_WIRE(netreq->response)) {
DEBUG_STUB("%s %-35s: MSG: %p TC bit set in response \n", STUB_DEBUG_READ, DEBUG_STUB("%s %-35s: MSG: %p TC bit set in response \n", STUB_DEBUG_READ,
__FUNC__, (void*)netreq); __FUNC__, (void*)netreq);
@ -1533,6 +1536,7 @@ stub_udp_write_cb(void *userarg)
#else #else
close(netreq->fd); close(netreq->fd);
#endif #endif
netreq->fd = -1;
stub_next_upstream(netreq); stub_next_upstream(netreq);
} }
netreq->debug_end_time = _getdns_get_time_as_uintt64(); netreq->debug_end_time = _getdns_get_time_as_uintt64();