From 66b295d461789f204d19b7181b1a11804a666728 Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Tue, 4 Nov 2014 01:00:12 -0500 Subject: setup: Fix bug with strdup() of NULL pointer. getenv() can return NULL if the environment variable is not set, but the result of getenv() was always being passed to M_StringDuplicate() without any check. This could cause crashes on some platforms. Instead, rework the code into a first stage that gets the player's name and a second that duplicates it into a mutable form. This fixes #455. --- src/setup/multiplayer.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) (limited to 'src/setup/multiplayer.c') diff --git a/src/setup/multiplayer.c b/src/setup/multiplayer.c index 8c8fe0c5..8e123b03 100644 --- a/src/setup/multiplayer.c +++ b/src/setup/multiplayer.c @@ -1059,28 +1059,29 @@ void SetPlayerNameDefault(void) { if (net_player_name == NULL) { - net_player_name = M_StringDuplicate(getenv("USER")); + net_player_name = getenv("USER"); } if (net_player_name == NULL) { - net_player_name = M_StringDuplicate(getenv("USERNAME")); + net_player_name = getenv("USERNAME"); } - // On Windows, environment variables are in OEM codepage - // encoding, so convert to UTF8: - -#ifdef _WIN32 - if (net_player_name != NULL) - { - net_player_name = M_OEMToUTF8(net_player_name); - } -#endif - if (net_player_name == NULL) { - net_player_name = M_StringDuplicate("player"); + net_player_name = "player"; } + + // Now strdup() the string so that it's in a mutable form + // that can be freed when the value changes. + +#ifdef _WIN32 + // On Windows, environment variables are in OEM codepage + // encoding, so convert to UTF8: + net_player_name = M_OEMToUTF8(net_player_name); +#else + net_player_name = M_StringDuplicate(net_player_name); +#endif } void MultiplayerConfig(void) -- cgit v1.2.3