changeset 5799:7d1fe5673df6 draft

(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
author rubidium <rubidium@openttd.org>
date Mon, 22 Jan 2007 21:38:16 +0000
parents c0a6767818dc
children 9b2e11950b8f
files src/network/core/game.h src/network/core/udp.cpp src/network/network_udp.cpp
diffstat 3 files changed, 9 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/network/core/game.h
+++ b/src/network/core/game.h
@@ -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
--- a/src/network/core/udp.cpp
+++ b/src/network/core/udp.cpp
@@ -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;
 	}
 }
 
--- a/src/network/network_udp.cpp
+++ b/src/network/network_udp.cpp
@@ -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));