cf-socket: fix handling of remote addr for accepted tcp sockets

- do not try to determine the remote address of a listen socket. There
  is none.
- Update remote address of an accepted socket by getpeername() if
  available.

Reported-by: Harry Sintonen
Fixes #10622
Closes #10642
This commit is contained in:
Stefan Eissing 2023-02-28 11:05:06 +01:00 committed by Daniel Stenberg
parent a4d015e69f
commit efa1aba97c
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2

View File

@ -1813,7 +1813,6 @@ CURLcode Curl_conn_tcp_listen_set(struct Curl_easy *data,
Curl_conn_cf_add(data, conn, sockindex, cf); Curl_conn_cf_add(data, conn, sockindex, cf);
conn->sock[sockindex] = ctx->sock; conn->sock[sockindex] = ctx->sock;
set_remote_ip(cf, data);
set_local_ip(cf, data); set_local_ip(cf, data);
ctx->active = TRUE; ctx->active = TRUE;
ctx->connected_at = Curl_now(); ctx->connected_at = Curl_now();
@ -1828,6 +1827,38 @@ out:
return result; return result;
} }
static void set_accepted_remote_ip(struct Curl_cfilter *cf,
struct Curl_easy *data)
{
struct cf_socket_ctx *ctx = cf->ctx;
#ifdef HAVE_GETPEERNAME
char buffer[STRERROR_LEN];
struct Curl_sockaddr_storage ssrem;
curl_socklen_t plen;
ctx->r_ip[0] = 0;
ctx->r_port = 0;
plen = sizeof(ssrem);
memset(&ssrem, 0, plen);
if(getpeername(ctx->sock, (struct sockaddr*) &ssrem, &plen)) {
int error = SOCKERRNO;
failf(data, "getpeername() failed with errno %d: %s",
error, Curl_strerror(error, buffer, sizeof(buffer)));
return;
}
if(!Curl_addr2string((struct sockaddr*)&ssrem, plen,
ctx->r_ip, &ctx->r_port)) {
failf(data, "ssrem inet_ntop() failed with errno %d: %s",
errno, Curl_strerror(errno, buffer, sizeof(buffer)));
return;
}
#else
ctx->r_ip[0] = 0;
ctx->r_port = 0;
(void)data;
#endif
}
CURLcode Curl_conn_tcp_accepted_set(struct Curl_easy *data, CURLcode Curl_conn_tcp_accepted_set(struct Curl_easy *data,
struct connectdata *conn, struct connectdata *conn,
int sockindex, curl_socket_t *s) int sockindex, curl_socket_t *s)
@ -1844,13 +1875,14 @@ CURLcode Curl_conn_tcp_accepted_set(struct Curl_easy *data,
socket_close(data, conn, TRUE, ctx->sock); socket_close(data, conn, TRUE, ctx->sock);
ctx->sock = *s; ctx->sock = *s;
conn->sock[sockindex] = ctx->sock; conn->sock[sockindex] = ctx->sock;
set_remote_ip(cf, data); set_accepted_remote_ip(cf, data);
set_local_ip(cf, data); set_local_ip(cf, data);
ctx->active = TRUE; ctx->active = TRUE;
ctx->accepted = TRUE; ctx->accepted = TRUE;
ctx->connected_at = Curl_now(); ctx->connected_at = Curl_now();
cf->connected = TRUE; cf->connected = TRUE;
DEBUGF(LOG_CF(data, cf, "Curl_conn_tcp_accepted_set(%d)", (int)ctx->sock)); DEBUGF(LOG_CF(data, cf, "accepted_set(sock=%d, remote=%s port=%d)",
(int)ctx->sock, ctx->r_ip, ctx->r_port));
return CURLE_OK; return CURLE_OK;
} }