const tr_address tr_inaddr_any = { TR_AF_INET,
{ { { { INADDR_ANY, 0x00, 0x00, 0x00 } } } } };
-
#ifdef WIN32
static const char *
inet_ntop(int af, const void *src, char *dst, socklen_t cnt)
}
}
+static tr_bool
+isMulticastAddress( const tr_address * addr )
+{
+ if( addr->type == TR_AF_INET && IN_MULTICAST( htonl( addr->addr.addr4.s_addr ) ) )
+ return TRUE;
+
+ if( addr->type == TR_AF_INET6 && ( addr->addr.addr6.s6_addr[0] == 0xff ) )
+ return TRUE;
+
+ return FALSE;
+}
+
+tr_bool
+tr_isValidPeerAddress( const tr_address * addr, tr_port port )
+{
+ if( isMulticastAddress( addr ) )
+ return FALSE;
+
+ if( port == 0 )
+ return FALSE;
+
+ return TRUE;
+}
+
int
tr_netOpenTCP( tr_session * session,
const tr_address * addr,
assert( tr_isAddress( addr ) );
- /* don't try to connect to multicast addresses */
- if( addr->type == TR_AF_INET && IN_MULTICAST( htonl( addr->addr.addr4.s_addr ) ) )
- return -EINVAL;
- if( addr->type == TR_AF_INET6 && ( addr->addr.addr6.s6_addr[0] == 0xff ) )
+ if( isMulticastAddress( addr ) )
return -EINVAL;
if( ( s = createSocket( ( addr->type == TR_AF_INET ? AF_INET : AF_INET6 ), type ) ) < 0 )
const tr_address * b);
void tr_normalizeV4Mapped( tr_address * const addr );
+tr_bool tr_isValidPeerAddress( const tr_address * addr, tr_port port );
+
void tr_suspectAddress( const tr_address * a, const char * source );
static TR_INLINE tr_bool tr_isAddress( const tr_address * a ) { return ( a != NULL ) && ( a->type==TR_AF_INET || a->type==TR_AF_INET6 ); }
managerLock( t->manager );
if( !tr_sessionIsAddressBlocked( t->manager->session, &pex->addr ) )
- ensureAtomExists( t, &pex->addr, pex->port, pex->flags, from );
+ if( tr_isValidPeerAddress( &pex->addr, pex->port ) )
+ ensureAtomExists( t, &pex->addr, pex->port, pex->flags, from );
managerUnlock( t->manager );
}