(svn r8361) -Codechange: make sure the range of the dates coming from the network are valid in OpenTTD
authorrubidium
Mon, 22 Jan 2007 21:38:16 +0000
changeset 6050 77bd608748c8
parent 6049 2128062d20f3
child 6051 3fdc90c44643
(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
src/network/core/game.h
src/network/core/udp.cpp
src/network/network_udp.cpp
--- 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
--- 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;
 	}
 }
 
--- 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));