From bd304004dcc56feaa3ae4154b91c11cb37c28445 Mon Sep 17 00:00:00 2001 From: Taylor Richards Date: Sat, 5 Sep 2015 04:18:05 -0400 Subject: [PATCH] fix size issues with filter_game_list_struct --- include/gtrack.h | 1 + src/network/gtrack.cpp | 23 +++++++++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/include/gtrack.h b/include/gtrack.h index b1fb452..89eb2c3 100644 --- a/include/gtrack.h +++ b/include/gtrack.h @@ -112,6 +112,7 @@ typedef struct { typedef struct { int rank; // Try to find opponents with a rank similar to this char channel[CHANNEL_LEN]; // only give us games in this channel + char pad[3]; // 3-bytes padding for size/alignment } filter_game_list_struct; diff --git a/src/network/gtrack.cpp b/src/network/gtrack.cpp index 3591a28..41eda50 100644 --- a/src/network/gtrack.cpp +++ b/src/network/gtrack.cpp @@ -53,8 +53,6 @@ SDL_COMPILE_TIME_ASSERT(game_list, sizeof(game_list) == 384); SDL_COMPILE_TIME_ASSERT(filter_game_list_struct, sizeof(filter_game_list_struct) == 40); -#define PXO_ADD_STRING(d) do { SDL_strlcpy((char*)(data+packet_size), d, sizeof(game_packet_header)-packet_size); packet_size += (SDL_strlen((char*)(data+packet_size)) + 1); } while (0) - //Variables // SOCKET gamesock; @@ -111,7 +109,8 @@ static int SerializeGamePacket(const game_packet_header *gph, ubyte *data) filter_game_list_struct *filter = (filter_game_list_struct *)&gph->data; PXO_ADD_INT(filter->rank); - PXO_ADD_STRING(filter->channel); + PXO_ADD_DATA(filter->channel); + PXO_ADD_DATA(filter->pad); // for sizing, so gph->len will match } break; @@ -133,11 +132,19 @@ static int SerializeGamePacket(const game_packet_header *gph, ubyte *data) } case GNT_GAME_COUNT_REQ: { - char channel[CHANNEL_LEN]; + SDL_assert(gph->len == (GAME_HEADER_ONLY_SIZE+sizeof(filter_game_list_struct))); + + filter_game_list_struct filter; + + SDL_zero(filter); + + memcpy(filter.channel, gph->data, sizeof(filter.channel)); - memcpy(channel, gph->data, sizeof(channel)); + PXO_ADD_DATA(filter.channel); - PXO_ADD_DATA(channel); + // add in junk data (ignored on server) to make packet size match + PXO_ADD_INT(filter.rank); + PXO_ADD_DATA(filter.pad); break; } @@ -630,8 +637,8 @@ void RequestGameCountWithFilter(void *filter) GameCountReq.game_type = GT_FREESPACE2; #endif GameCountReq.type = GNT_GAME_COUNT_REQ; - GameCountReq.len = GAME_HEADER_ONLY_SIZE+sizeof(filter_game_list_struct); - memcpy(&GameCountReq.data, ((filter_game_list_struct*)filter)->channel, sizeof(filter_game_list_struct) - 4); + GameCountReq.len = GAME_HEADER_ONLY_SIZE+sizeof(filter_game_list_struct); + memcpy(&GameCountReq.data, ((filter_game_list_struct*)filter)->channel, CHANNEL_LEN); packet_length = SerializeGamePacket(&GameCountReq, packet_data); SENDTO(Unreliable_socket, (char *)&packet_data, packet_length, 0, (struct sockaddr *)>rackaddr, sizeof(struct sockaddr_in), PSNET_TYPE_GAME_TRACKER); -- 2.39.2