summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2011-02-09 11:00:00 +0100
committerVolker Lendecke <vlendec@samba.org>2011-03-18 14:56:38 +0100
commit3e4879f3bddd9c9934bddeccfca65b3e8f678c26 (patch)
tree40710e06d5962196654e8ece38dfa185085c2a8d
parent9d813406e6c09f77164628102e66de1cf92f93c5 (diff)
downloadsamba-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.c36
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);
}