From 2f082acebc51a4ccad390ab94f4b80227dd919b8 Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Tue, 30 Jun 2026 18:49:36 +0200 Subject: [PATCH] cf-socket ntop with result --- lib/cf-socket.c | 38 +++++++++++++++++++------------------- tests/unit/unit1607.c | 3 ++- tests/unit/unit1609.c | 3 ++- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/lib/cf-socket.c b/lib/cf-socket.c index 9c65963ce3..986294f2f0 100644 --- a/lib/cf-socket.c +++ b/lib/cf-socket.c @@ -84,13 +84,13 @@ /* retrieves ip address and port from a sockaddr structure. note it calls - * curlx_inet_ntop which sets errno on fail, not SOCKERRNO. + * curlx_inet_ntop() and returns CURLcode. * @unittest 1607 */ UNITTEST bool sockaddr2string(struct sockaddr *sa, curl_socklen_t salen, - char *addr, uint16_t *port); + char *addr, uint16_t *port, CURLcode *result); UNITTEST bool sockaddr2string(struct sockaddr *sa, curl_socklen_t salen, - char *addr, uint16_t *port) + char *addr, uint16_t *port, CURLcode *result) { struct sockaddr_in *si = NULL; #ifdef USE_IPV6 @@ -105,7 +105,8 @@ UNITTEST bool sockaddr2string(struct sockaddr *sa, curl_socklen_t salen, switch(sa->sa_family) { case AF_INET: si = (struct sockaddr_in *)(void *)sa; - if(curlx_inet_ntop(sa->sa_family, &si->sin_addr, addr, MAX_IPADR_LEN)) { + if(curlx_inet_ntop(sa->sa_family, &si->sin_addr, addr, MAX_IPADR_LEN, + result)) { *port = ntohs(si->sin_port); return TRUE; } @@ -113,7 +114,8 @@ UNITTEST bool sockaddr2string(struct sockaddr *sa, curl_socklen_t salen, #ifdef USE_IPV6 case AF_INET6: si6 = (struct sockaddr_in6 *)(void *)sa; - if(curlx_inet_ntop(sa->sa_family, &si6->sin6_addr, addr, MAX_IPADR_LEN)) { + if(curlx_inet_ntop(sa->sa_family, &si6->sin6_addr, addr, MAX_IPADR_LEN, + result)) { *port = ntohs(si6->sin6_port); return TRUE; } @@ -136,7 +138,7 @@ UNITTEST bool sockaddr2string(struct sockaddr *sa, curl_socklen_t salen, addr[0] = '\0'; *port = 0; - errno = SOCKEAFNOSUPPORT; + *result = CURLE_UNSUPPORTED_PROTOCOL; return FALSE; } @@ -1082,21 +1084,21 @@ static void set_local_ip(struct Curl_cfilter *cf, #ifdef HAVE_GETSOCKNAME if((ctx->sock != CURL_SOCKET_BAD) && !(data->conn->scheme->protocol & CURLPROTO_TFTP)) { + CURLcode result; /* TFTP does not connect, so it cannot get the IP like this */ struct Curl_sockaddr_storage ssloc; curl_socklen_t slen = sizeof(struct Curl_sockaddr_storage); - VERBOSE(char buffer[STRERROR_LEN]); memset(&ssloc, 0, sizeof(ssloc)); if(getsockname(ctx->sock, (struct sockaddr *)&ssloc, &slen)) { + VERBOSE(char buffer[STRERROR_LEN]); VERBOSE(int sockerr = SOCKERRNO); infof(data, "getsockname() failed with errno %d: %s", sockerr, curlx_strerror(sockerr, buffer, sizeof(buffer))); } else if(!sockaddr2string((struct sockaddr *)&ssloc, slen, - ctx->ip.local_ip, &ctx->ip.local_port)) { - infof(data, "ssloc inet_ntop() failed with errno %d: %s", - errno, curlx_strerror(errno, buffer, sizeof(buffer))); + ctx->ip.local_ip, &ctx->ip.local_port, &result)) { + infof(data, "ssloc inet_ntop() failed with %d", (int)result); } } #else @@ -1108,21 +1110,19 @@ static CURLcode set_remote_ip(struct Curl_cfilter *cf, struct Curl_easy *data) { struct cf_socket_ctx *ctx = cf->ctx; + CURLcode result; /* store remote address and port used in this connection attempt */ ctx->ip.transport = ctx->transport; if(!sockaddr2string(&ctx->addr.curl_sa_addr, (curl_socklen_t)ctx->addr.addrlen, - ctx->ip.remote_ip, &ctx->ip.remote_port)) { - char buffer[STRERROR_LEN]; - + ctx->ip.remote_ip, &ctx->ip.remote_port, &result)) { /* using bare errno instead of SOCKERRNO is safe here, because sockaddr2string() calls curlx_inet_ntop(), and they both report failures via errno (even on Windows builds). */ ctx->sockerr = errno; /* malformed address or bug in inet_ntop, try next address */ - failf(data, "curl_sa_addr inet_ntop() failed with errno %d: %s", - errno, curlx_strerror(errno, buffer, sizeof(buffer))); + failf(data, "curl_sa_addr inet_ntop() failed with %d", (int)result); return CURLE_FAILED_INIT; } return CURLE_OK; @@ -2105,7 +2105,7 @@ static void cf_tcp_set_accepted_remote_ip(struct Curl_cfilter *cf, { struct cf_socket_ctx *ctx = cf->ctx; #ifdef HAVE_GETPEERNAME - char buffer[STRERROR_LEN]; + CURLcode result; struct Curl_sockaddr_storage ssrem; curl_socklen_t plen; @@ -2114,15 +2114,15 @@ static void cf_tcp_set_accepted_remote_ip(struct Curl_cfilter *cf, plen = sizeof(ssrem); memset(&ssrem, 0, plen); if(getpeername(ctx->sock, (struct sockaddr *)&ssrem, &plen)) { + char buffer[STRERROR_LEN]; int sockerr = SOCKERRNO; failf(data, "getpeername() failed with errno %d: %s", sockerr, curlx_strerror(sockerr, buffer, sizeof(buffer))); return; } if(!sockaddr2string((struct sockaddr *)&ssrem, plen, - ctx->ip.remote_ip, &ctx->ip.remote_port)) { - failf(data, "ssrem inet_ntop() failed with errno %d: %s", - errno, curlx_strerror(errno, buffer, sizeof(buffer))); + ctx->ip.remote_ip, &ctx->ip.remote_port, &result)) { + failf(data, "ssrem inet_ntop() failed with %d", (int)result); return; } #else diff --git a/tests/unit/unit1607.c b/tests/unit/unit1607.c index 2b55621340..51b651707e 100644 --- a/tests/unit/unit1607.c +++ b/tests/unit/unit1607.c @@ -140,6 +140,7 @@ static CURLcode test_unit1607(const char *arg) for(j = 0; j < addressnum; ++j) { uint16_t port = 0; char ipaddress[MAX_IPADR_LEN] = { 0 }; + CURLcode result; if(!addr && !tests[i].address[j]) break; @@ -148,7 +149,7 @@ static CURLcode test_unit1607(const char *arg) continue; if(addr && !sockaddr2string(addr->ai_addr, addr->ai_addrlen, - ipaddress, &port)) { + ipaddress, &port, &result)) { curl_mfprintf(stderr, "%s:%d tests[%zu] failed. " "getaddressinfo failed.\n", __FILE__, __LINE__, i); diff --git a/tests/unit/unit1609.c b/tests/unit/unit1609.c index d7970a5cc6..1ed1734074 100644 --- a/tests/unit/unit1609.c +++ b/tests/unit/unit1609.c @@ -142,12 +142,13 @@ static CURLcode test_unit1609(const char *arg) for(j = 0; j < addressnum; ++j) { uint16_t port = 0; char ipaddress[MAX_IPADR_LEN] = { 0 }; + CURLcode result; if(!addr && !tests[i].address[j]) break; if(addr && !sockaddr2string(addr->ai_addr, addr->ai_addrlen, - ipaddress, &port)) { + ipaddress, &port, &result)) { curl_mfprintf(stderr, "%s:%d tests[%zu] failed. Curl_addr2string failed.\n", __FILE__, __LINE__, i);