(trunk libT) #2667 "Ignore martian addresses in LTEP messages" -- implemented for 1.80
This commit is contained in:
parent
b840cb931b
commit
3fe5db7113
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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_ */
|
||||
|
|
|
@ -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 );
|
||||
|
|
Loading…
Reference in New Issue