diff options
author | Volker Lendecke <vl@samba.org> | 2011-02-09 11:00:00 +0100 |
---|---|---|
committer | Volker Lendecke <vlendec@samba.org> | 2011-03-18 14:56:38 +0100 |
commit | 3e4879f3bddd9c9934bddeccfca65b3e8f678c26 (patch) | |
tree | 40710e06d5962196654e8ece38dfa185085c2a8d | |
parent | 9d813406e6c09f77164628102e66de1cf92f93c5 (diff) | |
download | samba-3e4879f3bddd9c9934bddeccfca65b3e8f678c26.tar.gz samba-3e4879f3bddd9c9934bddeccfca65b3e8f678c26.tar.xz samba-3e4879f3bddd9c9934bddeccfca65b3e8f678c26.zip |
s3: Cope with 192.168.1.1/24 in smbcontrol ip-dropped
Autobuild-User: Volker Lendecke <vlendec@samba.org>
Autobuild-Date: Fri Mar 18 14:56:38 CET 2011 on sn-devel-104
-rw-r--r-- | source3/winbindd/winbindd_cm.c | 36 |
1 files changed, 32 insertions, 4 deletions
diff --git a/source3/winbindd/winbindd_cm.c b/source3/winbindd/winbindd_cm.c index 8a21f473315..55e92662b32 100644 --- a/source3/winbindd/winbindd_cm.c +++ b/source3/winbindd/winbindd_cm.c @@ -2680,15 +2680,42 @@ void winbind_msg_ip_dropped(struct messaging_context *msg_ctx, DATA_BLOB *data) { struct winbindd_domain *domain; + char *freeit = NULL; + char *addr; if ((data == NULL) || (data->data == NULL) || (data->length == 0) - || (data->data[data->length-1] != '\0') - || !is_ipaddress((char *)data->data)) { - DEBUG(1, ("invalid msg_ip_dropped message\n")); + || (data->data[data->length-1] != '\0')) { + DEBUG(1, ("invalid msg_ip_dropped message: not a valid " + "string\n")); return; } + + addr = (char *)data->data; + DEBUG(10, ("IP %s dropped\n", addr)); + + if (!is_ipaddress(addr)) { + char *slash; + /* + * Some code sends us ip addresses with the /netmask + * suffix + */ + slash = strchr(addr, '/'); + if (slash == NULL) { + DEBUG(1, ("invalid msg_ip_dropped message: %s", + addr)); + return; + } + freeit = talloc_strndup(talloc_tos(), addr, slash-addr); + if (freeit == NULL) { + DEBUG(1, ("talloc failed\n")); + return; + } + addr = freeit; + DEBUG(10, ("Stripped /netmask to IP %s\n", addr)); + } + for (domain = domain_list(); domain != NULL; domain = domain->next) { char sockaddr[INET6_ADDRSTRLEN]; if (domain->conn.cli == NULL) { @@ -2699,9 +2726,10 @@ void winbind_msg_ip_dropped(struct messaging_context *msg_ctx, } client_socket_addr(domain->conn.cli->fd, sockaddr, sizeof(sockaddr)); - if (strequal(sockaddr, (char *)data->data)) { + if (strequal(sockaddr, addr)) { close(domain->conn.cli->fd); domain->conn.cli->fd = -1; } } + TALLOC_FREE(freeit); } |