summaryrefslogtreecommitdiffstats
path: root/lib/socket_wrapper/socket_wrapper.c
diff options
context:
space:
mode:
authorAndreas Schneider <asn@samba.org>2014-06-03 15:08:07 +0200
committerMichael Adam <obnox@samba.org>2014-06-05 23:57:10 +0200
commit5ee936d7e2afd5c570fcf848d2f1009949ca4e64 (patch)
treedacfbc99d47a1f20f3b93d83146c29f7dedac129 /lib/socket_wrapper/socket_wrapper.c
parent1f03de017bdf16619a7e8785d1c6042995312a87 (diff)
downloadsamba-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.c35
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);