From f8eb72e188552bccc4b699e1848218f6150d4218 Mon Sep 17 00:00:00 2001 From: Darkvater Date: Tue, 2 May 2006 12:58:13 +0000 Subject: [PATCH] (svn r4666) - Backport from trunk (r4267): Validate the error number that a client receives from a server, and encapsulate this functionality into GetNetworkErrorMsg() --- network.c | 32 +++++++++++++++++++++++++++++++- network_client.c | 5 +---- network_data.h | 1 + network_server.c | 28 +++------------------------- 4 files changed, 36 insertions(+), 30 deletions(-) diff --git a/network.c b/network.c index b535e7a7a1..f00345b69d 100644 --- a/network.c +++ b/network.c @@ -256,6 +256,36 @@ static void NetworkClientError(byte res, NetworkClientState *cs) { _networking = false; } +/** Retrieve a string representation of an internal error number + * @param buf buffer where the error message will be stored + * @param err NetworkErrorCode (integer) + * @return returns a pointer to the error message (buf) */ +char *GetNetworkErrorMsg(char *buf, NetworkErrorCode err) +{ + /* 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, + }; + + if (err >= lengthof(network_error_strings)) err = 0; + + return GetString(buf, network_error_strings[err]); +} + // Find all IP-aliases for this host static void NetworkFindIPs(void) { @@ -524,7 +554,7 @@ void NetworkCloseClient(NetworkClientState *cs) NetworkGetClientName(client_name, sizeof(client_name), cs); - GetString(str, STR_NETWORK_ERR_CLIENT_GENERAL + errorno); + GetNetworkErrorMsg(str, errorno); NetworkTextMessage(NETWORK_ACTION_LEAVE, 1, false, client_name, "%s", str); diff --git a/network_client.c b/network_client.c index f8d88e8fc2..0d6e54f899 100644 --- a/network_client.c +++ b/network_client.c @@ -683,15 +683,12 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_CHAT) DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_ERROR_QUIT) { - int errorno; char str[100]; uint16 index; NetworkClientInfo *ci; index = NetworkRecv_uint16(MY_CLIENT, p); - errorno = NetworkRecv_uint8(MY_CLIENT, p); - - GetString(str, STR_NETWORK_ERR_CLIENT_GENERAL + errorno); + GetNetworkErrorMsg(str, NetworkRecv_uint8(MY_CLIENT, p)); ci = NetworkFindClientInfoFromIndex(index); if (ci != NULL) { diff --git a/network_data.h b/network_data.h index b8f6a0eef0..68d261d9a9 100644 --- a/network_data.h +++ b/network_data.h @@ -230,6 +230,7 @@ NetworkClientInfo *NetworkFindClientInfoFromIndex(uint16 client_index); NetworkClientInfo *NetworkFindClientInfoFromIP(const char *ip); NetworkClientState *NetworkFindClientStateFromIndex(uint16 client_index); unsigned long NetworkResolveHost(const char *hostname); +char *GetNetworkErrorMsg(char *buf, NetworkErrorCode err); #endif /* ENABLE_NETWORK */ diff --git a/network_server.c b/network_server.c index ea153f4708..dcfb17cd26 100644 --- a/network_server.c +++ b/network_server.c @@ -29,24 +29,6 @@ static void NetworkSendPatchSettings(NetworkClientState* cs); void NetworkPopulateCompanyInfo(void); -/* 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 // DEF_SERVER_SEND_COMMAND has parameter: NetworkClientState *cs @@ -165,12 +147,10 @@ DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_ERROR)(NetworkClientState *cs, Netwo 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, _network_error_strings[error]); + GetNetworkErrorMsg(str, error); // Only send when the current client was in game if (cs->status > STATUS_AUTH) { @@ -909,8 +889,8 @@ 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; - NetworkErrorCode errorno = NetworkRecv_uint8(cs, p); char str[100]; + NetworkErrorCode errorno = NetworkRecv_uint8(cs, p); char client_name[NETWORK_CLIENT_NAME_LENGTH]; // The client was never joined.. thank the client for the packet, but ignore it @@ -921,9 +901,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ERROR) NetworkGetClientName(client_name, sizeof(client_name), cs); - if (errorno >= lengthof(_network_error_strings)) errorno = 0; - - GetString(str, _network_error_strings[errorno]); + GetNetworkErrorMsg(str, errorno); DEBUG(net, 2)("[NET] %s reported an error and is closing his connection (%s)", client_name, str);