]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
check return value from uv_tcp_getpeername() when connecting
authorEvan Hunt <each@isc.org>
Thu, 29 Oct 2020 22:42:09 +0000 (15:42 -0700)
committerOndřej Surý <ondrej@isc.org>
Fri, 30 Oct 2020 10:11:54 +0000 (11:11 +0100)
if we can't determine the peer, the connect should fail.

lib/isc/netmgr/tcp.c

index 9d5e493f31c1f5df71e300803c0e454f9d1f7d3a..04b1d171bc0e11f8a9c880fe8262d03366e4870e 100644 (file)
@@ -254,6 +254,7 @@ tcp_connect_cb(uv_connect_t *uvreq, int status) {
        isc_nmsocket_t *sock = uv_handle_get_data((uv_handle_t *)uvreq->handle);
        struct sockaddr_storage ss;
        isc_nmhandle_t *handle = NULL;
+       int r;
 
        REQUIRE(VALID_NMSOCK(sock));
        REQUIRE(sock->tid == isc_nm_tid());
@@ -274,11 +275,16 @@ tcp_connect_cb(uv_connect_t *uvreq, int status) {
                return;
        }
 
+       isc__nm_incstats(sock->mgr, sock->statsindex[STATID_CONNECT]);
+       r = uv_tcp_getpeername(&sock->uv_handle.tcp, (struct sockaddr *)&ss,
+                              &(int){ sizeof(ss) });
+       if (r != 0) {
+               failed_connect_cb(sock, req, isc__nm_uverr2result(status));
+               return;
+       }
+
        atomic_store(&sock->connecting, false);
 
-       isc__nm_incstats(sock->mgr, sock->statsindex[STATID_CONNECT]);
-       uv_tcp_getpeername(&sock->uv_handle.tcp, (struct sockaddr *)&ss,
-                          &(int){ sizeof(ss) });
        result = isc_sockaddr_fromsockaddr(&sock->peer, (struct sockaddr *)&ss);
        RUNTIME_CHECK(result == ISC_R_SUCCESS);