(trunk libT) #2667 "Ignore martian addresses in LTEP messages" -- implemented for 1.80

This commit is contained in:
Charles Kerr 2009-12-14 02:07:47 +00:00
parent b840cb931b
commit 3fe5db7113
3 changed files with 39 additions and 2 deletions

View File

@ -633,3 +633,29 @@ tr_globalIPv6( void )
return have_ipv6 ? ipv6 : NULL;
}
int
tr_isMartian( int af, const unsigned char * address )
{
static const unsigned char v4prefix[16] =
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0, 0, 0, 0 };
static const unsigned char zeroes[16] =
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
switch( af )
{
case AF_INET:
return (address[0] == 0) ||
(address[0] == 127) ||
((address[0] & 0xE0) == 0xE0);
case AF_INET6:
return (address[0] == 0xFF) ||
(address[0] == 0xFE && (address[1] & 0xC0) == 0x80) ||
(memcmp(address, zeroes, 15) == 0 && (address[15] == 0 || address[15] == 1)) ||
(memcmp(address, v4prefix, 12) == 0);
default:
return FALSE;
}
}

View File

@ -125,4 +125,7 @@ int tr_globalAddress(int af, void *addr, int *addr_len);
const unsigned char *tr_globalIPv6( void );
int tr_isMartian( int af, const unsigned char * address );
#endif /* _TR_NET_H_ */

View File

@ -980,13 +980,21 @@ parseLtepHandshake( tr_peermsgs * msgs,
dbgmsg( msgs, "peer's port is now %d", (int)i );
}
if( tr_bencDictFindRaw( &val, "ipv4", &addr, &addr_len) && addr_len == 4 ) {
if( tr_peerIoIsIncoming( msgs->peer->io )
&& tr_bencDictFindRaw( &val, "ipv4", &addr, &addr_len )
&& ( addr_len == 4 )
&& ( !tr_isMartian( AF_INET, addr ) ) )
{
pex.addr.type = TR_AF_INET;
memcpy( &pex.addr.addr.addr4, addr, 4 );
tr_peerMgrAddPex( msgs->torrent, TR_PEER_FROM_LTEP, &pex );
}
if( tr_bencDictFindRaw( &val, "ipv6", &addr, &addr_len) && addr_len == 16 ) {
if( tr_peerIoIsIncoming( msgs->peer->io )
&& tr_bencDictFindRaw( &val, "ipv6", &addr, &addr_len )
&& ( addr_len == 16 )
&& ( !tr_isMartian( AF_INET6, addr ) ) )
{
pex.addr.type = TR_AF_INET6;
memcpy( &pex.addr.addr.addr6, addr, 16 );
tr_peerMgrAddPex( msgs->torrent, TR_PEER_FROM_LTEP, &pex );