... | ... |
@@ -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 |
|