From: Witold Kręcicki Date: Tue, 20 Oct 2020 10:55:58 +0000 (+0200) Subject: Don't crash if isc_uv_export returns an error in accept_connection. X-Git-Tag: v9.17.7~46^2~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ae9a6befa802a10fb08fbe100ee96dd03ecb9787;p=thirdparty%2Fbind9.git Don't crash if isc_uv_export returns an error in accept_connection. isc_uv_export can return an error - e.g. EMFILE (from dup), handle this nicely. --- diff --git a/lib/isc/netmgr/tcp.c b/lib/isc/netmgr/tcp.c index 483bd6d12f7..7aef6850584 100644 --- a/lib/isc/netmgr/tcp.c +++ b/lib/isc/netmgr/tcp.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -933,7 +934,9 @@ accept_connection(isc_nmsocket_t *ssock, isc_quota_t *quota) { if (r != 0) { result = isc__nm_uverr2result(r); uv_close((uv_handle_t *)uvstream, free_uvtcpt); - isc_quota_detach("a); + if (quota != NULL) { + isc_quota_detach("a); + } return (result); } @@ -942,6 +945,17 @@ accept_connection(isc_nmsocket_t *ssock, isc_quota_t *quota) { event = isc__nm_get_ievent(ssock->mgr, netievent_tcpchildaccept); /* Duplicate the server socket */ + r = isc_uv_export((uv_stream_t *)uvstream, &event->streaminfo); + if (r != 0) { + result = isc_errno_toresult(errno); + uv_close((uv_handle_t *)uvstream, free_uvtcpt); + if (quota != NULL) { + isc_quota_detach("a); + } + isc__nm_put_ievent(ssock->mgr, event); + return (result); + } + isc_nmsocket_t *csock = isc_mem_get(ssock->mgr->mctx, sizeof(isc_nmsocket_t)); isc__nmsocket_init(csock, ssock->mgr, isc_nm_tcpsocket, ssock->iface); @@ -954,9 +968,6 @@ accept_connection(isc_nmsocket_t *ssock, isc_quota_t *quota) { event->sock = csock; event->quota = quota; - r = isc_uv_export((uv_stream_t *)uvstream, &event->streaminfo); - RUNTIME_CHECK(r == 0); - uv_close((uv_handle_t *)uvstream, free_uvtcpt); if (w == isc_nm_tid()) {