diff options
author | Andreas Schneider <asn@samba.org> | 2014-06-03 15:08:07 +0200 |
---|---|---|
committer | Michael Adam <obnox@samba.org> | 2014-06-05 23:57:10 +0200 |
commit | 5ee936d7e2afd5c570fcf848d2f1009949ca4e64 (patch) | |
tree | dacfbc99d47a1f20f3b93d83146c29f7dedac129 /lib/socket_wrapper/socket_wrapper.c | |
parent | 1f03de017bdf16619a7e8785d1c6042995312a87 (diff) | |
download | samba-5ee936d7e2afd5c570fcf848d2f1009949ca4e64.tar.gz samba-5ee936d7e2afd5c570fcf848d2f1009949ca4e64.tar.xz samba-5ee936d7e2afd5c570fcf848d2f1009949ca4e64.zip |
swrap: Setup myname in swrap_socket() for getsockname().
Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Michael Adam <obnox@samba.org>
Diffstat (limited to 'lib/socket_wrapper/socket_wrapper.c')
-rw-r--r-- | lib/socket_wrapper/socket_wrapper.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/lib/socket_wrapper/socket_wrapper.c b/lib/socket_wrapper/socket_wrapper.c index b8b1ca35fd..45a71b0bdb 100644 --- a/lib/socket_wrapper/socket_wrapper.c +++ b/lib/socket_wrapper/socket_wrapper.c @@ -2223,8 +2223,40 @@ static int swrap_socket(int family, int type, int protocol) si->type = real_type; si->protocol = protocol; + /* + * Setup myname so getsockname() can succeed to find out the socket + * type. + */ + switch(si->family) { + case AF_INET: { + struct sockaddr_in sin = { + .sin_family = AF_INET, + }; + + si->myname_len = sizeof(struct sockaddr_in); + si->myname = sockaddr_dup(&sin, si->myname_len); + break; + } + case AF_INET6: { + struct sockaddr_in6 sin6 = { + .sin6_family = AF_INET6, + }; + + si->myname_len = sizeof(struct sockaddr_in6); + si->myname = sockaddr_dup(&sin6, si->myname_len); + break; + } + default: + free(si); + errno = EINVAL; + return -1; + } + fi = (struct socket_info_fd *)calloc(1, sizeof(struct socket_info_fd)); if (fi == NULL) { + if (si->myname != NULL) { + free (si->myname); + } free(si); errno = ENOMEM; return -1; @@ -2503,6 +2535,7 @@ static int swrap_auto_bind(int fd, struct socket_info *si, int family) in.sin_addr.s_addr = htonl(127<<24 | socket_wrapper_default_iface()); + free(si->myname); si->myname_len = sizeof(in); si->myname = sockaddr_dup(&in, si->myname_len); break; @@ -2532,6 +2565,7 @@ static int swrap_auto_bind(int fd, struct socket_info *si, int family) in6.sin6_family = AF_INET6; in6.sin6_addr = *swrap_ipv6(); in6.sin6_addr.s6_addr[15] = socket_wrapper_default_iface(); + free(si->myname); si->myname_len = sizeof(in6); si->myname = sockaddr_dup(&in6, si->myname_len); break; @@ -2685,6 +2719,7 @@ static int swrap_bind(int s, const struct sockaddr *myaddr, socklen_t addrlen) return libc_bind(s, myaddr, addrlen); } + free(si->myname); si->myname_len = addrlen; si->myname = sockaddr_dup(myaddr, addrlen); |