summaryrefslogtreecommitdiff
path: root/lib/async_req
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2021-01-11 15:58:58 +0100
committerJeremy Allison <jra@samba.org>2021-01-22 19:54:38 +0000
commit40e4958953c8518fa779286fd96ebf36517a5bdb (patch)
tree37244e6a87457aa11788e92bf94549b4413fc5cb /lib/async_req
parentb417fd19675bb2d987abc768695c0b2feb1f637a (diff)
downloadsamba-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.c22
-rw-r--r--lib/async_req/async_sock.h6
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