(svn r4665) - Backport from trunk (r4241, r4243): 0.4
authorDarkvater
Tue, 02 May 2006 12:54:23 +0000
branch0.4
changeset 9980 fb85b0652667
parent 9979 9dbe560017f9
child 9981 aece6eeba0e2
(svn r4665) - Backport from trunk (r4241, r4243):
Fix: Perform validation on the error number that a server receives
from a client. An invalid value may cause the server to terminate.
network_server.c
--- a/network_server.c	Tue May 02 12:52:09 2006 +0000
+++ b/network_server.c	Tue May 02 12:54:23 2006 +0000
@@ -29,7 +29,23 @@
 
 void NetworkPopulateCompanyInfo(void);
 
-// Is the network enabled?
+/* List of possible network errors, used by PACKET_SERVER_ERROR and PACKET_CLIENT_ERROR */
+static const StringID _network_error_strings[] = {
+	STR_NETWORK_ERR_CLIENT_GENERAL,
+	STR_NETWORK_ERR_CLIENT_DESYNC,
+	STR_NETWORK_ERR_CLIENT_SAVEGAME,
+	STR_NETWORK_ERR_CLIENT_CONNECTION_LOST,
+	STR_NETWORK_ERR_CLIENT_PROTOCOL_ERROR,
+	STR_NETWORK_ERR_CLIENT_NOT_AUTHORIZED,
+	STR_NETWORK_ERR_CLIENT_NOT_EXPECTED,
+	STR_NETWORK_ERR_CLIENT_WRONG_REVISION,
+	STR_NETWORK_ERR_CLIENT_NAME_IN_USE,
+	STR_NETWORK_ERR_CLIENT_WRONG_PASSWORD,
+	STR_NETWORK_ERR_CLIENT_PLAYER_MISMATCH,
+	STR_NETWORK_ERR_CLIENT_KICKED,
+	STR_NETWORK_ERR_CLIENT_CHEATER,
+	STR_NETWORK_ERR_CLIENT_SERVER_FULL,
+};
 
 // **********
 // Sending functions
@@ -148,10 +164,13 @@
 	char client_name[NETWORK_CLIENT_NAME_LENGTH];
 
 	Packet *p = NetworkSend_Init(PACKET_SERVER_ERROR);
+
+	if (error >= lengthof(_network_error_strings)) error = 0;
+
 	NetworkSend_uint8(p, error);
 	NetworkSend_Packet(p, cs);
 
-	GetString(str, STR_NETWORK_ERR_CLIENT_GENERAL + error);
+	GetString(str, _network_error_strings[error]);
 
 	// Only send when the current client was in game
 	if (cs->status > STATUS_AUTH) {
@@ -890,7 +909,7 @@
 	// This packets means a client noticed an error and is reporting this
 	//  to us. Display the error and report it to the other clients
 	NetworkClientState *new_cs;
-	byte errorno = NetworkRecv_uint8(cs, p);
+	NetworkErrorCode errorno = NetworkRecv_uint8(cs, p);
 	char str[100];
 	char client_name[NETWORK_CLIENT_NAME_LENGTH];
 
@@ -902,7 +921,9 @@
 
 	NetworkGetClientName(client_name, sizeof(client_name), cs);
 
-	GetString(str, STR_NETWORK_ERR_CLIENT_GENERAL + errorno);
+	if (errorno >= lengthof(_network_error_strings)) errorno = 0;
+
+	GetString(str, _network_error_strings[errorno]);
 
 	DEBUG(net, 2)("[NET] %s reported an error and is closing his connection (%s)", client_name, str);