diff options
author | Volker Lendecke <vl@samba.org> | 2021-01-11 15:58:58 +0100 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2021-01-22 19:54:38 +0000 |
commit | 40e4958953c8518fa779286fd96ebf36517a5bdb (patch) | |
tree | 37244e6a87457aa11788e92bf94549b4413fc5cb /lib/async_req | |
parent | b417fd19675bb2d987abc768695c0b2feb1f637a (diff) | |
download | samba-40e4958953c8518fa779286fd96ebf36517a5bdb.tar.gz |
lib: Make accept_recv() return struct samba_sockaddr
Avoid casting problems by using the samba_sockaddr union
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'lib/async_req')
-rw-r--r-- | lib/async_req/async_sock.c | 22 | ||||
-rw-r--r-- | lib/async_req/async_sock.h | 6 |
2 files changed, 15 insertions, 13 deletions
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 <tevent.h> #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 |