Browse code

freshclam/manager.c: don't mix IPv4 and IPv6 addresses while randomizing (bb#2319)

Tomasz Kojm authored on 2010/10/15 23:15:10
Showing 2 changed files
... ...
@@ -1,3 +1,7 @@
1
+Fri Oct 15 16:13:27 CEST 2010 (tk)
2
+----------------------------------
3
+ * freshclam/manager.c: don't mix IPv4 and IPv6 addresses while randomizing (bb#2319)
4
+
1 5
 Thu Oct 14 19:43:09 CEST 2010 (acab)
2 6
 ------------------------------------
3 7
  * libclamav: add pool based hastabs so we don't frag on md5 sizes (bb#2185)
... ...
@@ -197,6 +197,7 @@ static int wwwconnect(const char *server, const char *proxy, int pport, char *ip
197 197
 	struct addrinfo hints, *res = NULL, *rp, *loadbal_rp = NULL, *addrs[128];
198 198
 	char port_s[6], loadbal_ipaddr[46];
199 199
 	uint32_t loadbal = 1, minsucc = 0xffffffff, minfail = 0xffffffff, addrnum = 0;
200
+	int ipv4start = -1, ipv4end = -1;
200 201
 	struct mirdat_ip *md;
201 202
 #else
202 203
 	struct sockaddr_in name;
... ...
@@ -247,11 +248,20 @@ static int wwwconnect(const char *server, const char *proxy, int pport, char *ip
247 247
     for(rp = res; rp && addrnum < 128; rp = rp->ai_next) {
248 248
 	rp->ai_flags = cli_rndnum(1024);
249 249
 	addrs[addrnum] = rp;
250
+	if(rp->ai_family == AF_INET) {
251
+	    if(ipv4start == -1)
252
+		ipv4start = addrnum;
253
+	} else if(ipv4end == -1 && ipv4start != -1) {
254
+	    ipv4end = addrnum - 1;
255
+	}
256
+	if(!rp->ai_next && ipv4end == -1)
257
+	    ipv4end = addrnum;
250 258
 	addrnum++;
251 259
     }
252
-    qsort(addrs, addrnum, sizeof(struct addrinfo *), qcompare);
260
+    if(ipv4end != -1 && ipv4start != -1 && ipv4end - ipv4start + 1 > 1)
261
+	qsort(&addrs[ipv4start], ipv4end - ipv4start + 1, sizeof(struct addrinfo *), qcompare);
253 262
 
254
-    for(i = 0; i < addrnum; i++) {
263
+    for(i = 0; i < addrnum; ) {
255 264
 	    void *addr;
256 265
 
257 266
 	rp = addrs[i];
... ...
@@ -276,8 +286,10 @@ static int wwwconnect(const char *server, const char *proxy, int pport, char *ip
276 276
 		logg("*Ignoring mirror %s (has connected too many times with an outdated version)\n", ipaddr);
277 277
 
278 278
 	    ignored++;
279
-	    if(!loadbal || i + 1 < addrnum)
279
+	    if(!loadbal || i + 1 < addrnum) {
280
+		i++;
280 281
 		continue;
282
+	    }
281 283
 	}
282 284
 
283 285
 	if(mdat && loadbal) {
... ...
@@ -292,8 +304,10 @@ static int wwwconnect(const char *server, const char *proxy, int pport, char *ip
292 292
 			loadbal_rp = rp;
293 293
 			strncpy(loadbal_ipaddr, ipaddr, sizeof(loadbal_ipaddr));
294 294
 		    }
295
-		    if(i + 1 < addrnum)
295
+		    if(i + 1 < addrnum) {
296
+			i++;
296 297
 			continue;
298
+		    }
297 299
 		}
298 300
 	    }
299 301
 
... ...
@@ -308,6 +322,7 @@ static int wwwconnect(const char *server, const char *proxy, int pport, char *ip
308 308
 	    strncpy(ipaddr, loadbal_ipaddr, sizeof(ipaddr));
309 309
 
310 310
 	} else if(loadbal_rp == rp) {
311
+	    i++;
311 312
 	    continue;
312 313
 	}
313 314
 
... ...
@@ -346,6 +361,7 @@ static int wwwconnect(const char *server, const char *proxy, int pport, char *ip
346 346
 	    freeaddrinfo(res);
347 347
 	    return socketfd;
348 348
 	}
349
+	i++;
349 350
     }
350 351
     freeaddrinfo(res);
351 352