Changeset 9777
- Timestamp:
- Dec 15, 2009, 5:34:36 PM (12 years ago)
- Location:
- trunk/third-party/dht
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/third-party/dht/CHANGES
r9718 r9777 1 15 December 2009: dht-0.13 2 3 * Implemented protection against incorrect addresses in the DHT. 4 * Tweaked neighborhood maintenance to wake up less often. 5 1 6 11 December 2009: dht-0.12 2 7 * Fixed slightly incorrect formatting of DHT messages. -
trunk/third-party/dht/dht.c
r9657 r9777 225 225 0xFF, 0xFF, 0xFF, 0xFF 226 226 }; 227 static const unsigned char v4prefix[16] = { 228 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0, 0, 0, 0 229 }; 227 230 228 231 static int dht_socket = -1; … … 296 299 for(i = 0; i < buflen; i++) 297 300 fprintf(f, "%02x", buf[i]); 301 } 302 303 static int 304 is_martian(struct sockaddr *sa) 305 { 306 switch(sa->sa_family) { 307 case AF_INET: { 308 struct sockaddr_in *sin = (struct sockaddr_in*)sa; 309 const unsigned char *address = (const unsigned char*)&sin->sin_addr; 310 return sin->sin_port == 0 || 311 (address[0] == 0) || 312 (address[0] == 127) || 313 ((address[0] & 0xE0) == 0xE0); 314 } 315 case AF_INET6: { 316 struct sockaddr_in6 *sin6 = (struct sockaddr_in6*)sa; 317 const unsigned char *address = (const unsigned char*)&sin6->sin6_addr; 318 return sin6->sin6_port == 0 || 319 (address[0] == 0xFF) || 320 (address[0] == 0xFE && (address[1] & 0xC0) == 0x80) || 321 (memcmp(address, zeroes, 15) == 0 && 322 (address[15] == 0 || address[15] == 1)) || 323 (memcmp(address, v4prefix, 12) == 0); 324 } 325 326 default: 327 return 0; 328 } 298 329 } 299 330 … … 619 650 620 651 if(id_cmp(id, myid) == 0) 652 return NULL; 653 654 if(is_martian(sa)) 621 655 return NULL; 622 656 … … 645 679 } 646 680 647 /* New node. First, try to get rid of a known-bad node. */ 681 /* New node. */ 682 683 if(mybucket) { 684 if(sa->sa_family == AF_INET) 685 mybucket_grow_time = now.tv_sec; 686 else 687 mybucket6_grow_time = now.tv_sec; 688 } 689 690 /* First, try to get rid of a known-bad node. */ 648 691 n = b->nodes; 649 692 while(n) { … … 655 698 n->pinged_time = 0; 656 699 n->pinged = 0; 657 if(mybucket) {658 if(sa->sa_family == AF_INET)659 mybucket_grow_time = now.tv_sec;660 else661 mybucket6_grow_time = now.tv_sec;662 }663 700 return n; 664 701 } … … 706 743 debugf("Splitting.\n"); 707 744 b = split_bucket(b); 708 if(sa->sa_family == AF_INET)709 mybucket_grow_time = now.tv_sec;710 else711 mybucket6_grow_time = now.tv_sec;712 745 return new_node(id, sa, salen, confirm); 713 746 } … … 734 767 b->nodes = n; 735 768 b->count++; 736 if(mybucket) {737 if(sa->sa_family == AF_INET)738 mybucket_grow_time = now.tv_sec;739 else740 mybucket6_grow_time = now.tv_sec;741 }742 769 return n; 743 770 } … … 1653 1680 1654 1681 if(b == NULL) 1655 return -1;1682 return 0; 1656 1683 1657 1684 memcpy(id, myid, 20); … … 1668 1695 1669 1696 if(q) { 1697 /* Since our node-id is the same in both DHTs, it's probably 1698 profitable to query both families. */ 1670 1699 int want = dht_socket >= 0 && dht_socket6 >= 0 ? (WANT4 | WANT6) : -1; 1671 1700 n = random_node(q); … … 1680 1709 pinged(n, q); 1681 1710 } 1682 } 1683 return 1; 1711 return 1; 1712 } 1713 return 0; 1684 1714 } 1685 1715 … … 1797 1827 1798 1828 if(rc < 0 || sourcelen > sizeof(struct sockaddr_storage)) 1829 goto dontread; 1830 1831 if(is_martian(source)) 1799 1832 goto dontread; 1800 1833 … … 2646 2679 const unsigned char *p; 2647 2680 2681 /* This code will happily crash if the buffer is not NUL-terminated. */ 2682 if(buf[buflen] != '\0') { 2683 debugf("Eek! parse_message with unterminated buffer.\n"); 2684 return -1; 2685 } 2686 2648 2687 #define CHECK(ptr, len) \ 2649 2688 if(((unsigned char*)ptr) + (len) > (buf) + (buflen)) goto overflow;
Note: See TracChangeset
for help on using the changeset viewer.