Fix convert_ss2service() to filter out zero addresses.
authorJeremy Allison <jra@samba.org>
Mon, 30 Apr 2012 23:24:27 +0000 (16:24 -0700)
committerKarolin Seeger <kseeger@samba.org>
Sat, 30 Jun 2012 11:43:43 +0000 (13:43 +0200)
(cherry picked from commit 3226be5b5ab771c8cdf98588c40713d36eae4702)

source3/libsmb/namequery.c

index ff43706175feea51bab98a8ea2b373de01adbb65..b68448e16aedcd83cca86a71b59e785df9004188 100644 (file)
@@ -848,32 +848,53 @@ struct sockaddr_storage *name_query(int fd,
 }
 
 /********************************************************
convert an array if struct sockaddr_storage to struct ip_service
Convert an array if struct sockaddr_storage to struct ip_service
  return false on failure.  Port is set to PORT_NONE;
+ pcount is [in/out] - it is the length of ss_list on input,
+ and the length of return_iplist on output as we remove any
+ zero addresses from ss_list.
 *********************************************************/
 
 static bool convert_ss2service(struct ip_service **return_iplist,
                const struct sockaddr_storage *ss_list,
-               int count)
+               int *pcount)
 {
        int i;
+       int orig_count = *pcount;
+       int real_count = 0;
 
-       if ( count==0 || !ss_list )
+       if (orig_count==0 || !ss_list )
                return False;
 
+       /* Filter out zero addrs. */
+       for ( i=0; i<orig_count; i++ ) {
+               if (is_zero_addr((struct sockaddr *)&ss_list[i])) {
+                       continue;
+               }
+               real_count++;
+       }
+       if (real_count==0) {
+               return false;
+       }
+
        /* copy the ip address; port will be PORT_NONE */
-       if ((*return_iplist = SMB_MALLOC_ARRAY(struct ip_service, count)) ==
+       if ((*return_iplist = SMB_MALLOC_ARRAY(struct ip_service, real_count)) ==
                        NULL) {
                DEBUG(0,("convert_ip2service: malloc failed "
-                       "for %d enetries!\n", count ));
+                       "for %d enetries!\n", real_count ));
                return False;
        }
 
-       for ( i=0; i<count; i++ ) {
-               (*return_iplist)[i].ss   = ss_list[i];
-               (*return_iplist)[i].port = PORT_NONE;
+       for ( i=0, real_count = 0; i<orig_count; i++ ) {
+               if (is_zero_addr((struct sockaddr *)&ss_list[i])) {
+                       continue;
+               }
+               (*return_iplist)[real_count].ss   = ss_list[i];
+               (*return_iplist)[real_count].port = PORT_NONE;
+               real_count++;
        }
 
+       *pcount = real_count;
        return true;
 }
 
@@ -946,7 +967,7 @@ NTSTATUS name_resolve_bcast(const char *name,
 success:
 
        status = NT_STATUS_OK;
-       if (!convert_ss2service(return_iplist, ss_list, *return_count) )
+       if (!convert_ss2service(return_iplist, ss_list, return_count) )
                status = NT_STATUS_INVALID_PARAMETER;
 
        SAFE_FREE(ss_list);
@@ -1081,7 +1102,7 @@ NTSTATUS resolve_wins(const char *name,
 success:
 
        status = NT_STATUS_OK;
-       if (!convert_ss2service(return_iplist, ss_list, *return_count))
+       if (!convert_ss2service(return_iplist, ss_list, return_count))
                status = NT_STATUS_INVALID_PARAMETER;
 
        SAFE_FREE(ss_list);