mirror of
https://github.com/samba-team/samba.git
synced 2025-01-12 09:18:10 +03:00
swrap: Use swrap_address in swrap_accept().
Signed-off-by: Andreas Schneider <asn@samba.org> Reviewed-by: Stefan Metzmacher <metze@samba.org>
This commit is contained in:
parent
891e837c3c
commit
f8584abfef
@ -2486,8 +2486,12 @@ static int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
|
||||
struct swrap_address un_my_addr = {
|
||||
.sa_socklen = sizeof(struct sockaddr_un),
|
||||
};
|
||||
struct sockaddr *my_addr;
|
||||
socklen_t my_addrlen, len;
|
||||
struct swrap_address in_addr = {
|
||||
.sa_socklen = sizeof(struct sockaddr_storage),
|
||||
};
|
||||
struct swrap_address in_my_addr = {
|
||||
.sa_socklen = sizeof(struct sockaddr_storage),
|
||||
};
|
||||
int ret;
|
||||
|
||||
parent_si = find_socket_info(s);
|
||||
@ -2499,38 +2503,30 @@ static int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
|
||||
* assume out sockaddr have the same size as the in parent
|
||||
* socket family
|
||||
*/
|
||||
my_addrlen = socket_length(parent_si->family);
|
||||
if (my_addrlen <= 0) {
|
||||
in_addr.sa_socklen = socket_length(parent_si->family);
|
||||
if (in_addr.sa_socklen <= 0) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
my_addr = (struct sockaddr *)malloc(my_addrlen);
|
||||
if (my_addr == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = libc_accept(s, &un_addr.sa.s, &un_addr.sa_socklen);
|
||||
if (ret == -1) {
|
||||
if (errno == ENOTSOCK) {
|
||||
/* Remove stale fds */
|
||||
swrap_remove_stale(s);
|
||||
}
|
||||
free(my_addr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
fd = ret;
|
||||
|
||||
len = my_addrlen;
|
||||
ret = sockaddr_convert_from_un(parent_si,
|
||||
&un_addr.sa.un,
|
||||
un_addr.sa_socklen,
|
||||
parent_si->family,
|
||||
my_addr,
|
||||
&len);
|
||||
&in_addr.sa.s,
|
||||
&in_addr.sa_socklen);
|
||||
if (ret == -1) {
|
||||
free(my_addr);
|
||||
close(fd);
|
||||
return ret;
|
||||
}
|
||||
@ -2541,7 +2537,6 @@ static int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
|
||||
child_fi = (struct socket_info_fd *)calloc(1, sizeof(struct socket_info_fd));
|
||||
if (child_fi == NULL) {
|
||||
free(child_si);
|
||||
free(my_addr);
|
||||
close(fd);
|
||||
errno = ENOMEM;
|
||||
return -1;
|
||||
@ -2558,15 +2553,17 @@ static int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
|
||||
child_si->is_server = 1;
|
||||
child_si->connected = 1;
|
||||
|
||||
child_si->peername.sa_socklen = len;
|
||||
memcpy(&child_si->peername.sa.s, my_addr, len);
|
||||
child_si->peername = (struct swrap_address) {
|
||||
.sa_socklen = in_addr.sa_socklen,
|
||||
};
|
||||
memcpy(&child_si->peername.sa.ss, &in_addr.sa.ss, in_addr.sa_socklen);
|
||||
|
||||
if (addr != NULL && addrlen != NULL) {
|
||||
size_t copy_len = MIN(*addrlen, len);
|
||||
size_t copy_len = MIN(*addrlen, in_addr.sa_socklen);
|
||||
if (copy_len > 0) {
|
||||
memcpy(addr, my_addr, copy_len);
|
||||
memcpy(addr, &in_addr.sa.ss, copy_len);
|
||||
}
|
||||
*addrlen = len;
|
||||
*addrlen = in_addr.sa_socklen;
|
||||
}
|
||||
|
||||
ret = libc_getsockname(fd,
|
||||
@ -2575,22 +2572,19 @@ static int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
|
||||
if (ret == -1) {
|
||||
free(child_fi);
|
||||
free(child_si);
|
||||
free(my_addr);
|
||||
close(fd);
|
||||
return ret;
|
||||
}
|
||||
|
||||
len = my_addrlen;
|
||||
ret = sockaddr_convert_from_un(child_si,
|
||||
&un_my_addr.sa.un,
|
||||
un_my_addr.sa_socklen,
|
||||
child_si->family,
|
||||
my_addr,
|
||||
&len);
|
||||
&in_my_addr.sa.s,
|
||||
&in_my_addr.sa_socklen);
|
||||
if (ret == -1) {
|
||||
free(child_fi);
|
||||
free(child_si);
|
||||
free(my_addr);
|
||||
close(fd);
|
||||
return ret;
|
||||
}
|
||||
@ -2599,9 +2593,10 @@ static int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
|
||||
"accept() path=%s, fd=%d",
|
||||
un_my_addr.sa.un.sun_path, s);
|
||||
|
||||
child_si->myname.sa_socklen = len;
|
||||
memcpy(&child_si->myname.sa.s, my_addr, len);
|
||||
free(my_addr);
|
||||
child_si->myname = (struct swrap_address) {
|
||||
.sa_socklen = in_my_addr.sa_socklen,
|
||||
};
|
||||
memcpy(&child_si->myname.sa.ss, &in_my_addr.sa.ss, in_my_addr.sa_socklen);
|
||||
|
||||
SWRAP_DLIST_ADD(sockets, child_si);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user