s3: Cope with 192.168.1.1/24 in smbcontrol ip-dropped
authorVolker Lendecke <vl@samba.org>
Wed, 9 Feb 2011 10:00:00 +0000 (11:00 +0100)
committerVolker Lendecke <vlendec@samba.org>
Fri, 18 Mar 2011 13:56:38 +0000 (14:56 +0100)
Autobuild-User: Volker Lendecke <vlendec@samba.org>
Autobuild-Date: Fri Mar 18 14:56:38 CET 2011 on sn-devel-104

source3/winbindd/winbindd_cm.c

index 8a21f473315d300f5ce0f10521281ff60071e336..55e92662b32aab169032aea310a8342ae7b96812 100644 (file)
@@ -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);
 }