# HG changeset patch # User rubidium # Date 1169501896 0 # Node ID 77bd608748c8f4cd96bd8e18418d38ab08d351de # Parent 2128062d20f385b0e8bf500671547c5442a9bc91 (svn r8361) -Codechange: make sure the range of the dates coming from the network are valid in OpenTTD -Codechange: use_password is a boolean variable -Codechange: move range checking for server_lang and map_set to Recv_NetworkGameInfo diff -r 2128062d20f3 -r 77bd608748c8 src/network/core/game.h --- a/src/network/core/game.h Mon Jan 22 21:00:38 2007 +0000 +++ b/src/network/core/game.h Mon Jan 22 21:38:16 2007 +0000 @@ -27,7 +27,7 @@ bool version_compatible; ///< Can we connect to this server or not? (based on server_revision) bool compatible; ///< Can we connect to this server or not? (based on server_revision _and_ grf_match byte server_lang; ///< Language of the server (we should make a nice table for this) - byte use_password; ///< Is set to != 0 if it uses a password + bool use_password; ///< Is this server passworded? char server_password[NETWORK_PASSWORD_LENGTH]; ///< On the server: the game password, on the client: != "" if server has password byte clients_max; ///< Max clients allowed on server byte clients_on; ///< Current count of clients on server diff -r 2128062d20f3 -r 77bd608748c8 src/network/core/udp.cpp --- a/src/network/core/udp.cpp Mon Jan 22 21:00:38 2007 +0000 +++ b/src/network/core/udp.cpp Mon Jan 22 21:38:16 2007 +0000 @@ -245,6 +245,8 @@ */ void NetworkUDPSocketHandler::Recv_NetworkGameInfo(Packet *p, NetworkGameInfo *info) { + static const Date MAX_DATE = ConvertYMDToDate(MAX_YEAR, 11, 31); // December is month 11 + info->game_info_version = NetworkRecv_uint8(this, p); /* @@ -272,8 +274,8 @@ } } /* Fallthrough */ case 3: - info->game_date = NetworkRecv_uint32(this, p); - info->start_date = NetworkRecv_uint32(this, p); + info->game_date = clamp(NetworkRecv_uint32(this, p), 0, MAX_DATE); + info->start_date = clamp(NetworkRecv_uint32(this, p), 0, MAX_DATE); /* Fallthrough */ case 2: info->companies_max = NetworkRecv_uint8 (this, p); @@ -284,7 +286,7 @@ NetworkRecv_string(this, p, info->server_name, sizeof(info->server_name)); NetworkRecv_string(this, p, info->server_revision, sizeof(info->server_revision)); info->server_lang = NetworkRecv_uint8 (this, p); - info->use_password = NetworkRecv_uint8 (this, p); + info->use_password = (NetworkRecv_uint8 (this, p) != 0); info->clients_max = NetworkRecv_uint8 (this, p); info->clients_on = NetworkRecv_uint8 (this, p); info->spectators_on = NetworkRecv_uint8 (this, p); @@ -297,6 +299,9 @@ info->map_height = NetworkRecv_uint16(this, p); info->map_set = NetworkRecv_uint8 (this, p); info->dedicated = (NetworkRecv_uint8(this, p) != 0); + + if (info->server_lang >= NETWORK_NUM_LANGUAGES) info->server_lang = 0; + if (info->map_set >= NUM_LANDSCAPE) info->map_set = 0; } } diff -r 2128062d20f3 -r 77bd608748c8 src/network/network_udp.cpp --- a/src/network/network_udp.cpp Mon Jan 22 21:00:38 2007 +0000 +++ b/src/network/network_udp.cpp Mon Jan 22 21:38:16 2007 +0000 @@ -330,9 +330,6 @@ } } - if (item->info.server_lang >= NETWORK_NUM_LANGUAGES) item->info.server_lang = 0; - if (item->info.map_set >= NUM_LANDSCAPE ) item->info.map_set = 0; - if (item->info.hostname[0] == '\0') snprintf(item->info.hostname, sizeof(item->info.hostname), "%s", inet_ntoa(client_addr->sin_addr));