diff -Nurp djbdns-1.05-epoll-20070305T031624Z/TARGETS djbdns-1.05-epoll-20070305T185643Z/TARGETS --- djbdns-1.05-epoll-20070305T031624Z/TARGETS 2007-03-04 18:02:08.362873000 +0200 +++ djbdns-1.05-epoll-20070305T185643Z/TARGETS 2007-03-05 20:59:35.224035000 +0200 @@ -210,4 +210,3 @@ setup check dict.o byte_rchr.o -safari_copy.o Binary files djbdns-1.05-epoll-20070305T031624Z/case_diffb.o and djbdns-1.05-epoll-20070305T185643Z/case_diffb.o differ diff -Nurp djbdns-1.05-epoll-20070305T031624Z/dns.h djbdns-1.05-epoll-20070305T185643Z/dns.h --- djbdns-1.05-epoll-20070305T031624Z/dns.h 2007-03-05 05:08:32.354427000 +0200 +++ djbdns-1.05-epoll-20070305T185643Z/dns.h 2007-03-05 20:54:58.749341000 +0200 @@ -167,6 +167,36 @@ static inline uint32 reciprocal_remainde /* XXX: sort servers by configurable notion of closeness? */ /* XXX: pay attention to competence of each server? */ +/* special non-biased shuffling to prevent destruction of the Internet */ +static inline void dns_sortip16(char *s) +{ + unsigned int rnd; + uint32 tmp; + uint32 *p = (uint32*)s; + +#define HACK(nnn) \ + rnd = dns_random() % nnn; \ + tmp = p[rnd]; \ + p[rnd] = p[nnn-1]; \ + p[nnn-1] = tmp; + + HACK(16); + HACK(15); + HACK(14); + HACK(13); + HACK(12); + HACK(11); + HACK(10); + HACK(9); + HACK(8); + HACK(7); + HACK(6); + HACK(5); + HACK(4); + HACK(3); + HACK(2); +} + static inline void dns_sortip(char *s,unsigned int n) { int i; diff -Nurp djbdns-1.05-epoll-20070305T031624Z/query.c djbdns-1.05-epoll-20070305T185643Z/query.c --- djbdns-1.05-epoll-20070305T031624Z/query.c 2006-06-03 16:03:51.292018000 +0300 +++ djbdns-1.05-epoll-20070305T185643Z/query.c 2007-03-05 20:27:22.741413000 +0200 @@ -428,7 +428,7 @@ static int doit(struct query *z,int stat break; if (j == 64) goto SERVFAIL; - dns_sortip(z->servers[z->level],64); + dns_sortip16(z->servers[z->level]); if (z->level) { log_tx(z->name[z->level],DNS_T_A,z->control[z->level],z->servers[z->level],z->level); if (dns_transmit_start(&z->dt,z->servers[z->level],flagforwardonly,z->name[z->level],DNS_T_A,z->localip) == -1) goto DIE;