svn commit: samba r12074 - in
branches/SAMBA_4_0/source/lib/socket_wrapper: .
metze at samba.org
metze at samba.org
Mon Dec 5 15:26:50 GMT 2005
Author: metze
Date: 2005-12-05 15:26:49 +0000 (Mon, 05 Dec 2005)
New Revision: 12074
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=12074
Log:
in accept() we need to set socket name of the child socket by looking
up what address the client has used, as the socket is maybe bound to '0.0.0.0'
metze
Modified:
branches/SAMBA_4_0/source/lib/socket_wrapper/socket_wrapper.c
Changeset:
Modified: branches/SAMBA_4_0/source/lib/socket_wrapper/socket_wrapper.c
===================================================================
--- branches/SAMBA_4_0/source/lib/socket_wrapper/socket_wrapper.c 2005-12-05 15:22:38 UTC (rev 12073)
+++ branches/SAMBA_4_0/source/lib/socket_wrapper/socket_wrapper.c 2005-12-05 15:26:49 UTC (rev 12074)
@@ -426,8 +426,12 @@
{
struct socket_info *parent_si, *child_si;
int fd;
- socklen_t un_addrlen = sizeof(struct sockaddr_un);
struct sockaddr_un un_addr;
+ socklen_t un_addrlen = sizeof(un_addr);
+ struct sockaddr_un un_my_addr;
+ socklen_t un_my_addrlen = sizeof(un_my_addr);
+ struct sockaddr my_addr;
+ socklen_t my_addrlen = sizeof(my_addr);
int ret;
parent_si = find_socket_info(s);
@@ -436,6 +440,8 @@
}
memset(&un_addr, 0, sizeof(un_addr));
+ memset(&un_my_addr, 0, sizeof(un_my_addr));
+ memset(&my_addr, 0, sizeof(my_addr));
ret = real_accept(s, (struct sockaddr *)&un_addr, &un_addrlen);
if (ret == -1) return ret;
@@ -450,11 +456,21 @@
memset(child_si, 0, sizeof(*child_si));
child_si->fd = fd;
+ child_si->domain = parent_si->domain;
+ child_si->type = parent_si->type;
+ child_si->protocol = parent_si->protocol;
child_si->bound = 1;
- child_si->myname_len = parent_si->myname_len;
- child_si->myname = sockaddr_dup(parent_si->myname, parent_si->myname_len);
+ ret = real_getsockname(fd, &un_my_addr, &un_my_addrlen);
+ if (ret == -1) return ret;
+ ret = sockaddr_convert_from_un(child_si, &un_my_addr, un_my_addrlen,
+ child_si->domain, &my_addr, &my_addrlen);
+ if (ret == -1) return ret;
+
+ child_si->myname_len = my_addrlen;
+ child_si->myname = sockaddr_dup(&my_addr, my_addrlen);
+
child_si->peername_len = *addrlen;
child_si->peername = sockaddr_dup(addr, *addrlen);
More information about the samba-cvs
mailing list