1
0
Fork 0

(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.
release/0.4
Darkvater 2006-05-02 12:54:23 +00:00
parent f26027da17
commit f9a2d113ab
1 changed files with 25 additions and 4 deletions

View File

@ -29,7 +29,23 @@ static void NetworkSendPatchSettings(NetworkClientState* cs);
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 @@ DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_ERROR)(NetworkClientState *cs, Netwo
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 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ERROR)
// 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 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ERROR)
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);