From 40e4958953c8518fa779286fd96ebf36517a5bdb Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 11 Jan 2021 15:58:58 +0100 Subject: lib: Make accept_recv() return struct samba_sockaddr Avoid casting problems by using the samba_sockaddr union Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- lib/async_req/async_sock.c | 22 +++++++++++----------- lib/async_req/async_sock.h | 6 ++++-- 2 files changed, 15 insertions(+), 13 deletions(-) (limited to 'lib') diff --git a/lib/async_req/async_sock.c b/lib/async_req/async_sock.c index 85ec148191e..1a39c98ab38 100644 --- a/lib/async_req/async_sock.c +++ b/lib/async_req/async_sock.c @@ -28,6 +28,7 @@ #include #include "lib/async_req/async_sock.h" #include "lib/util/iov_buf.h" +#include "lib/util/util_net.h" /* Note: lib/util/ is currently GPL */ #include "lib/util/tevent_unix.h" @@ -704,8 +705,7 @@ bool wait_for_read_recv(struct tevent_req *req, int *perr) struct accept_state { struct tevent_fd *fde; int listen_sock; - socklen_t addrlen; - struct sockaddr_storage addr; + struct samba_sockaddr addr; int sock; }; @@ -747,10 +747,12 @@ static void accept_handler(struct tevent_context *ev, struct tevent_fd *fde, tevent_req_error(req, EIO); return; } - state->addrlen = sizeof(state->addr); - ret = accept(state->listen_sock, (struct sockaddr *)&state->addr, - &state->addrlen); + state->addr.sa_socklen = sizeof(state->addr.u); + + ret = accept(state->listen_sock, + &state->addr.u.sa, + &state->addr.sa_socklen); if ((ret == -1) && (errno == EINTR)) { /* retry */ return; @@ -764,8 +766,9 @@ static void accept_handler(struct tevent_context *ev, struct tevent_fd *fde, tevent_req_done(req); } -int accept_recv(struct tevent_req *req, struct sockaddr_storage *paddr, - socklen_t *paddrlen, int *perr) +int accept_recv(struct tevent_req *req, + struct samba_sockaddr *paddr, + int *perr) { struct accept_state *state = tevent_req_data(req, struct accept_state); int err; @@ -777,10 +780,7 @@ int accept_recv(struct tevent_req *req, struct sockaddr_storage *paddr, return -1; } if (paddr != NULL) { - memcpy(paddr, &state->addr, state->addrlen); - } - if (paddrlen != NULL) { - *paddrlen = state->addrlen; + *paddr = state->addr; } return state->sock; } diff --git a/lib/async_req/async_sock.h b/lib/async_req/async_sock.h index 9cc052e253b..6952345df0c 100644 --- a/lib/async_req/async_sock.h +++ b/lib/async_req/async_sock.h @@ -57,9 +57,11 @@ struct tevent_req *wait_for_read_send(TALLOC_CTX *mem_ctx, bool check_errors); bool wait_for_read_recv(struct tevent_req *req, int *perr); +struct samba_sockaddr; struct tevent_req *accept_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, int listen_sock); -int accept_recv(struct tevent_req *req, struct sockaddr_storage *paddr, - socklen_t *paddrlen, int *perr); +int accept_recv(struct tevent_req *req, + struct samba_sockaddr *paddr, + int *perr); #endif -- cgit v1.2.1