Fix a race in fctx_cancelquery.
When sending an udp query (resquery_send) we first issue an asynchronous isc_socket_connect and increment query->connects, then isc_socket_sendto2 and increment query->sends. If we happen to cancel this query (fctx_cancelquery) we need to cancel all operations we might have issued on this socket. If we are under very high load the callback from isc_socket_connect (resquery_udpconnected) might have not yet been fired. In this case we only cancel the CONNECT event on socket, and ignore the SEND that's waiting there (as there is an `else if`). Then we call dns_dispatch_removeresponse which kills the dispatcher socket and calls isc_socket_close - but if system is under very high load, the send we issued earlier might still not be complete - which triggers an assertion because we're trying to close a socket that's still in use. The fix is to always check if we have incomplete sends on the socket and cancel them if we do.
Showing with 2 additions and 1 deletion