From 2d56e78dd3af4bef06f3c3276dd2b02afb6f3842 Mon Sep 17 00:00:00 2001 From: Kp Date: Sat, 22 Jun 2013 02:09:12 +0000 Subject: [PATCH] Validate netgame mode index --- main/gamerend.c | 3 ++- main/multi.c | 22 ++++++++++++++++++++-- main/multi.h | 6 ++++-- main/net_udp.c | 6 ++++-- 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/main/gamerend.c b/main/gamerend.c index 0b1376380..e9b1c3ae6 100644 --- a/main/gamerend.c +++ b/main/gamerend.c @@ -140,7 +140,8 @@ void show_netplayerinfo() x+=FSPACX(8); y+=LINE_SPACING*2; - gr_printf(x,y,"game mode: %s",GMNames[Netgame.gamemode]); + unsigned gamemode = Netgame.gamemode; + gr_printf(x,y,"game mode: %s",gamemode < (sizeof(GMNames) / sizeof(GMNames[0])) ? GMNames[gamemode] : "INVALID"); y+=LINE_SPACING; gr_printf(x,y,"difficulty: %s",MENU_DIFFICULTY_TEXT(Netgame.difficulty)); y+=LINE_SPACING; diff --git a/main/multi.c b/main/multi.c index fa1126aed..dfd910713 100644 --- a/main/multi.c +++ b/main/multi.c @@ -131,8 +131,26 @@ short kill_matrix[MAX_PLAYERS][MAX_PLAYERS]; int multi_goto_secret = 0; short team_kills[2]; int multi_quit_game = 0; -char *GMNames[8]={"Anarchy","Team Anarchy","Robo Anarchy","Cooperative","Unknown","","","Bounty"}; -char *GMNamesShrt[8]={"ANRCHY","TEAM","ROBO","COOP","UNKNOWN","","","BOUNTY"}; +const char GMNames[MULTI_GAME_TYPE_COUNT][MULTI_GAME_NAME_LENGTH]={ + "Anarchy", + "Team Anarchy", + "Robo Anarchy", + "Cooperative", + "Unknown", + "Unknown", + "Unknown", + "Bounty" +}; +const char GMNamesShrt[MULTI_GAME_TYPE_COUNT][8]={ + "ANRCHY", + "TEAM", + "ROBO", + "COOP", + "UNKNOWN", + "UNKNOWN", + "UNKNOWN", + "BOUNTY" +}; // For rejoin object syncing (used here and all protocols - globally) diff --git a/main/multi.h b/main/multi.h index ff3b7df69..703dfe53a 100644 --- a/main/multi.h +++ b/main/multi.h @@ -178,9 +178,13 @@ enum { for_each_netflag_value(define_netflag_bit_enum) }; enum { for_each_netflag_value(define_netflag_bit_mask) }; enum { NETFLAG_DOPOWERUP = 0 for_each_netflag_value(define_netflag_powerup_mask) }; +#define MULTI_GAME_TYPE_COUNT 8 +#define MULTI_GAME_NAME_LENGTH 13 #define MULTI_ALLOW_POWERUP_MAX 12 int multi_allow_powerup_mask[MAX_POWERUP_TYPES]; extern char *multi_allow_powerup_text[MULTI_ALLOW_POWERUP_MAX]; +extern const char GMNames[MULTI_GAME_TYPE_COUNT][MULTI_GAME_NAME_LENGTH]; +extern const char GMNamesShrt[MULTI_GAME_TYPE_COUNT][8]; // Exported functions @@ -279,8 +283,6 @@ extern short kill_matrix[MAX_PLAYERS][MAX_PLAYERS]; extern short team_kills[2]; extern int multi_goto_secret; -extern char *GMNames[8]; -extern char *GMNamesShrt[8]; extern ushort my_segments_checksum; diff --git a/main/net_udp.c b/main/net_udp.c index b1fb21215..ea7efc9b4 100644 --- a/main/net_udp.c +++ b/main/net_udp.c @@ -919,7 +919,8 @@ int net_udp_list_join_poll( newmenu *menu, d_event *event, direct_join *dj ) else snprintf(status, sizeof(status), "BETWEEN "); - snprintf (menus[i+4].text,sizeof(char)*74,"%d.\t%s \t%s \t %d/%d \t%s \t %s \t%s",(i+(NLPage*UDP_NETGAMES_PPAGE))+1,GameName,GMNamesShrt[Active_udp_games[(i+(NLPage*UDP_NETGAMES_PPAGE))].gamemode],nplayers, Active_udp_games[(i+(NLPage*UDP_NETGAMES_PPAGE))].max_numplayers,MissName,levelname,status); + unsigned gamemode = Active_udp_games[(i+(NLPage*UDP_NETGAMES_PPAGE))].gamemode; + snprintf (menus[i+4].text,sizeof(char)*74,"%d.\t%s \t%s \t %d/%d \t%s \t %s \t%s",(i+(NLPage*UDP_NETGAMES_PPAGE))+1,GameName,(gamemode < sizeof(GMNamesShrt) / sizeof(GMNamesShrt[0])) ? GMNamesShrt[gamemode] : "INVALID",nplayers, Active_udp_games[(i+(NLPage*UDP_NETGAMES_PPAGE))].max_numplayers,MissName,levelname,status); Assert(strlen(menus[i+4].text) < 75); } @@ -5113,7 +5114,8 @@ int net_udp_show_game_info() } info+=sprintf (info,"\n\nDifficulty: %s",MENU_DIFFICULTY_TEXT(netgame->difficulty)); - info+=sprintf (info,"\nGame Mode: %s",GMNames[netgame->gamemode]); + unsigned gamemode = netgame->gamemode; + info+=sprintf (info,"\nGame Mode: %s",gamemode < (sizeof(GMNames) / sizeof(GMNames[0])) ? GMNames[gamemode] : "INVALID"); info+=sprintf (info,"\nPlayers: %i/%i",netgame->numplayers,netgame->max_numplayers); c=nm_messagebox1("WELCOME", (int (*)(newmenu *, d_event *, void *))show_game_info_handler, netgame, 2, "JOIN GAME", "GAME INFO", rinfo);