diff options
-rw-r--r-- | src/net_common.c | 8 | ||||
-rw-r--r-- | src/net_sock.h | 22 | ||||
-rw-r--r-- | src/sv_ac.c | 2 | ||||
-rw-r--r-- | src/sv_ccmds.c | 16 | ||||
-rw-r--r-- | src/sv_local.h | 2 | ||||
-rw-r--r-- | src/sv_main.c | 12 |
6 files changed, 30 insertions, 32 deletions
diff --git a/src/net_common.c b/src/net_common.c index b569f8f..8ade312 100644 --- a/src/net_common.c +++ b/src/net_common.c @@ -166,7 +166,7 @@ static void NET_NetadrToSockadr( const netadr_t *a, struct sockaddr_in *s ) { break; case NA_IP: s->sin_family = AF_INET; - s->sin_addr.s_addr = *( uint32_t * )&a->ip; + s->sin_addr.s_addr = a->ip.u32; s->sin_port = a->port; break; default: @@ -184,7 +184,7 @@ static void NET_SockadrToNetadr( const struct sockaddr_in *s, netadr_t *a ) { memset( a, 0, sizeof( *a ) ); a->type = NA_IP; - *( uint32_t * )&a->ip = s->sin_addr.s_addr; + a->ip.u32 = s->sin_addr.s_addr; a->port = s->sin_port; } @@ -247,6 +247,7 @@ NET_AdrToString */ char *NET_AdrToString( const netadr_t *a ) { static char s[MAX_QPATH]; + const uint8_t *ip; switch( a->type ) { case NA_LOOPBACK: @@ -254,8 +255,9 @@ char *NET_AdrToString( const netadr_t *a ) { return s; case NA_IP: case NA_BROADCAST: + ip = a->ip.u8; Q_snprintf( s, sizeof( s ), "%u.%u.%u.%u:%u", - a->ip[0], a->ip[1], a->ip[2], a->ip[3], ntohs( a->port ) ); + ip[0], ip[1], ip[2], ip[3], ntohs( a->port ) ); return s; default: Com_Error( ERR_FATAL, "%s: bad address type", __func__ ); diff --git a/src/net_sock.h b/src/net_sock.h index 2669e09..8fccacb 100644 --- a/src/net_sock.h +++ b/src/net_sock.h @@ -59,10 +59,16 @@ typedef enum { NET_ERROR, } neterr_t; +typedef union { + uint8_t u8[4]; + uint16_t u16[2]; + uint32_t u32; +} netadrip_t; + typedef struct { - netadrtype_t type; - uint8_t ip[4]; - uint16_t port; + netadrtype_t type; + netadrip_t ip; + uint16_t port; } netadr_t; static inline qboolean NET_IsEqualAdr( const netadr_t *a, const netadr_t *b ) { @@ -75,7 +81,7 @@ static inline qboolean NET_IsEqualAdr( const netadr_t *a, const netadr_t *b ) { return qtrue; case NA_IP: case NA_BROADCAST: - if( *( uint32_t * )a->ip == *( uint32_t * )b->ip && a->port == b->port ) { + if( a->ip.u32 == b->ip.u32 && a->port == b->port ) { return qtrue; } // fall through @@ -96,7 +102,7 @@ static inline qboolean NET_IsEqualBaseAdr( const netadr_t *a, const netadr_t *b return qtrue; case NA_IP: case NA_BROADCAST: - if( *( uint32_t * )a->ip == *( uint32_t * )b->ip ) { + if( a->ip.u32 == b->ip.u32 ) { return qtrue; } // fall through @@ -113,11 +119,11 @@ static inline qboolean NET_IsLanAddress( const netadr_t *adr ) { return qtrue; case NA_IP: case NA_BROADCAST: - if( adr->ip[0] == 127 || adr->ip[0] == 10 ) { + if( adr->ip.u8[0] == 127 || adr->ip.u8[0] == 10 ) { return qtrue; } - if( *( uint16_t * )adr->ip == MakeRawShort( 192, 168 ) || - *( uint16_t * )adr->ip == MakeRawShort( 172, 16 ) ) + if( adr->ip.u16[0] == MakeRawShort( 192, 168 ) || + adr->ip.u16[0] == MakeRawShort( 172, 16 ) ) { return qtrue; } diff --git a/src/sv_ac.c b/src/sv_ac.c index 268e7c3..fd9e762 100644 --- a/src/sv_ac.c +++ b/src/sv_ac.c @@ -1095,7 +1095,7 @@ char *AC_ClientConnect( client_t *cl ) { if( ac.ready ) { MSG_WriteShort( 15 ); MSG_WriteByte( ACC_REQUESTCHALLENGE ); - MSG_WriteData( net_from.ip, 4 ); + MSG_WriteData( net_from.ip.u8, 4 ); MSG_WriteData( &net_from.port, 2 ); MSG_WriteLong( cl->number ); MSG_WriteLong( cl->challenge ); diff --git a/src/sv_ccmds.c b/src/sv_ccmds.c index a2ae4ca..30d83d1 100644 --- a/src/sv_ccmds.c +++ b/src/sv_ccmds.c @@ -407,7 +407,7 @@ void SV_Kick_f( void ) { netadr_t *addr = &sv_client->netchan->remote_address; if( addr->type == NA_IP ) { addrmatch_t *match = Z_Malloc( sizeof( *match ) ); - match->addr = *( uint32_t * )addr->ip; + match->addr.u32 = addr->ip.u32; match->mask = 0xffffffffU; match->hits = 0; match->time = 0; @@ -872,18 +872,16 @@ static qboolean parse_mask( const char *s, uint32_t *addr, uint32_t *mask ) { return qfalse; } - *addr = *( uint32_t * )address.ip; + *addr = address.ip.u32; *mask = BigLong( ~( ( 1 << ( 32 - bits ) ) - 1 ) ); return qtrue; } static size_t format_mask( addrmatch_t *match, char *buf, size_t size ) { - byte ip[4]; - uint32_t mask; + uint8_t *ip = match->addr.u8; + uint32_t mask = BigLong( match->mask ); int i; - *( uint32_t * )ip = match->addr; - mask = BigLong( match->mask ); for( i = 0; i < 32; i++ ) { if( mask & ( 1 << i ) ) { break; @@ -911,7 +909,7 @@ void SV_AddMatch_f( list_t *list ) { } LIST_FOR_EACH( addrmatch_t, match, list, entry ) { - if( match->addr == addr && match->mask == mask ) { + if( match->addr.u32 == addr && match->mask == mask ) { format_mask( match, buf, sizeof( buf ) ); Com_Printf( "Entry %s already exists.\n", buf ); return; @@ -921,7 +919,7 @@ void SV_AddMatch_f( list_t *list ) { s = Cmd_ArgsFrom( 2 ); len = strlen( s ); match = Z_Malloc( sizeof( *match ) + len ); - match->addr = addr; + match->addr.u32 = addr; match->mask = mask; match->hits = 0; match->time = 0; @@ -974,7 +972,7 @@ void SV_DelMatch_f( list_t *list ) { } LIST_FOR_EACH( addrmatch_t, match, list, entry ) { - if( match->addr == addr && match->mask == mask ) { + if( match->addr.u32 == addr && match->mask == mask ) { remove: List_Remove( &match->entry ); Z_Free( match ); diff --git a/src/sv_local.h b/src/sv_local.h index fb8b2bb..6a9cfb4 100644 --- a/src/sv_local.h +++ b/src/sv_local.h @@ -318,7 +318,7 @@ typedef struct { typedef struct { list_t entry; - uint32_t addr; + netadrip_t addr; uint32_t mask; unsigned hits; time_t time; // time of the last hit diff --git a/src/sv_main.c b/src/sv_main.c index e50414f..b5f0fe0 100644 --- a/src/sv_main.c +++ b/src/sv_main.c @@ -281,12 +281,11 @@ static void SV_RateInit( ratelimit_t *r, const char *s ) { r->period = period; } -addrmatch_t *SV_MatchAddress( list_t *list, netadr_t *address ) { - uint32_t addr = *( uint32_t * )address->ip; +addrmatch_t *SV_MatchAddress( list_t *list, netadr_t *addr ) { addrmatch_t *match; LIST_FOR_EACH( addrmatch_t, match, list, entry ) { - if( ( addr & match->mask ) == ( match->addr & match->mask ) ) { + if( ( addr->ip.u32 & match->mask ) == ( match->addr.u32 & match->mask ) ) { match->hits++; match->time = time( NULL ); return match; @@ -1074,13 +1073,6 @@ static void SV_ConnectionlessPacket( void ) { c = Cmd_Argv( 0 ); Com_DPrintf( "ServerPacket[%s]: %s\n", NET_AdrToString( &net_from ), c ); - if( !NET_IsLocalAddress( &net_from ) && net_from.ip[0] == 127 && - net_from.port == Cvar_VariableInteger( "net_port" ) ) - { - Com_DPrintf( "dropped connectionless packet from self\n" ); - return; - } - if( !strcmp( c, "rcon" ) ) { SVC_RemoteCommand(); return; // accept rcon commands even if not active |