(svn r4521) - Fix: be consistent about the size of the player-name in MP. This hopefully fixes a crash on lesser OS's (eg Win98). Use ttd_strlcpy() to just copy over strings and properly terminate them because different implementations of snprintf() behave differently. Courtesy of TrueLight

replace/41b28d7194a279bdc17475d4fbe2ea6ec885a466
Darkvater 18 years ago
parent 084acbf23c
commit ed96dcd868

@ -92,11 +92,11 @@ NetworkClientState *NetworkFindClientStateFromIndex(uint16 client_index)
// if the user did not send it yet, Client #<no> is used. // if the user did not send it yet, Client #<no> is used.
void NetworkGetClientName(char *client_name, size_t size, const NetworkClientState *cs) void NetworkGetClientName(char *client_name, size_t size, const NetworkClientState *cs)
{ {
NetworkClientInfo *ci = DEREF_CLIENT_INFO(cs); const NetworkClientInfo *ci = DEREF_CLIENT_INFO(cs);
if (ci->client_name[0] == '\0') if (*ci->client_name == '\0')
snprintf(client_name, size, "Client #%d", cs->index); snprintf(client_name, size, "Client #%4d", cs->index);
else else
snprintf(client_name, size, "%s", ci->client_name); ttd_strlcpy(client_name, ci->client_name, size);
} }
byte NetworkSpectatorCount(void) byte NetworkSpectatorCount(void)
@ -545,7 +545,7 @@ void NetworkCloseClient(NetworkClientState *cs)
// We did not receive a leave message from this client... // We did not receive a leave message from this client...
NetworkErrorCode errorno = NETWORK_ERROR_CONNECTION_LOST; NetworkErrorCode errorno = NETWORK_ERROR_CONNECTION_LOST;
char str[100]; char str[100];
char client_name[NETWORK_NAME_LENGTH]; char client_name[NETWORK_CLIENT_NAME_LENGTH];
NetworkClientState *new_cs; NetworkClientState *new_cs;
NetworkGetClientName(client_name, sizeof(client_name), cs); NetworkGetClientName(client_name, sizeof(client_name), cs);

@ -145,7 +145,7 @@ VARDEF NetworkGameInfo _network_game_info;
VARDEF NetworkPlayerInfo _network_player_info[MAX_PLAYERS]; VARDEF NetworkPlayerInfo _network_player_info[MAX_PLAYERS];
VARDEF NetworkClientInfo _network_client_info[MAX_CLIENT_INFO]; VARDEF NetworkClientInfo _network_client_info[MAX_CLIENT_INFO];
VARDEF char _network_player_name[NETWORK_NAME_LENGTH]; VARDEF char _network_player_name[NETWORK_CLIENT_NAME_LENGTH];
VARDEF char _network_default_ip[NETWORK_HOSTNAME_LENGTH]; VARDEF char _network_default_ip[NETWORK_HOSTNAME_LENGTH];
VARDEF uint16 _network_own_client_index; VARDEF uint16 _network_own_client_index;

@ -567,7 +567,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMPANY_INFO)
DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_JOIN) DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_JOIN)
{ {
char name[NETWORK_NAME_LENGTH]; char name[NETWORK_CLIENT_NAME_LENGTH];
char unique_id[NETWORK_NAME_LENGTH]; char unique_id[NETWORK_NAME_LENGTH];
NetworkClientInfo *ci; NetworkClientInfo *ci;
byte playas; byte playas;
@ -612,7 +612,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_JOIN)
} }
// We need a valid name.. make it Player // We need a valid name.. make it Player
if (name[0] == '\0') snprintf(name, sizeof(name), "Player"); if (*name == '\0') ttd_strlcpy(name, "Player", sizeof(name));
if (!NetworkFindName(name)) { // Change name if duplicate if (!NetworkFindName(name)) { // Change name if duplicate
// We could not create a name for this player // We could not create a name for this player
@ -622,8 +622,8 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_JOIN)
ci = DEREF_CLIENT_INFO(cs); ci = DEREF_CLIENT_INFO(cs);
snprintf(ci->client_name, sizeof(ci->client_name), "%s", name); ttd_strlcpy(ci->client_name, name, sizeof(ci->client_name));
snprintf(ci->unique_id, sizeof(ci->unique_id), "%s", unique_id); ttd_strlcpy(ci->unique_id, unique_id, sizeof(ci->unique_id));
ci->client_playas = playas; ci->client_playas = playas;
ci->client_lang = client_lang; ci->client_lang = client_lang;
@ -1389,7 +1389,7 @@ bool NetworkFindName(char new_name[NETWORK_CLIENT_NAME_LENGTH])
byte number = 0; byte number = 0;
char original_name[NETWORK_CLIENT_NAME_LENGTH]; char original_name[NETWORK_CLIENT_NAME_LENGTH];
// We use NETWORK_NAME_LENGTH in here, because new_name is really a pointer // We use NETWORK_CLIENT_NAME_LENGTH in here, because new_name is really a pointer
ttd_strlcpy(original_name, new_name, NETWORK_CLIENT_NAME_LENGTH); ttd_strlcpy(original_name, new_name, NETWORK_CLIENT_NAME_LENGTH);
while (!found_name) { while (!found_name) {

@ -12,7 +12,7 @@ DEF_SERVER_SEND_COMMAND(PACKET_SERVER_SHUTDOWN);
DEF_SERVER_SEND_COMMAND(PACKET_SERVER_NEWGAME); DEF_SERVER_SEND_COMMAND(PACKET_SERVER_NEWGAME);
DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_RCON)(NetworkClientState *cs, uint16 color, const char *command); DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_RCON)(NetworkClientState *cs, uint16 color, const char *command);
bool NetworkFindName(char new_name[NETWORK_NAME_LENGTH]); bool NetworkFindName(char new_name[NETWORK_CLIENT_NAME_LENGTH]);
void NetworkServer_HandleChat(NetworkAction action, DestType desttype, int dest, const char *msg, uint16 from_index); void NetworkServer_HandleChat(NetworkAction action, DestType desttype, int dest, const char *msg, uint16 from_index);
bool NetworkServer_ReadPackets(NetworkClientState *cs); bool NetworkServer_ReadPackets(NetworkClientState *cs);

Loading…
Cancel
Save