(svn r2324) Introduce _cmd_text for passing strings with a command instead of abusing _decode_parameters as text buffer. This should prevent several possible buffer overruns and is a bit cleaner to use. As bonus it reduces the size of most command packets by 79 bytes.
This commit is contained in:
22
players.c
22
players.c
@@ -691,16 +691,18 @@ int32 CmdPlayerCtrl(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
||||
PlayerID player_backup = _local_player;
|
||||
_network_player_info[p->index].months_empty = 0;
|
||||
|
||||
/* XXX - When a client joins, we automatically set it's name to the player's
|
||||
* name (for some reason). As it stands now only the server knows the client's
|
||||
* name, so it needs to send out a "broadcast" to do this. To achieve this we send
|
||||
* a network command. However, it uses _local_player to execute the command as.
|
||||
* To prevent abuse (eg. only yourself can change your name/company), we 'cheat'
|
||||
* by impersonation _local_player as the server. Not the best solution; but it
|
||||
* works.
|
||||
* TODO: Perhaps this could be improved by when the client is ready with joining
|
||||
* to let it send itself the command, and not the server? For example in network_client.c:534? */
|
||||
memcpy(_decode_parameters, ci->client_name, 32);
|
||||
/* XXX - When a client joins, we automatically set its name to the
|
||||
* player's name (for some reason). As it stands now only the server
|
||||
* knows the client's name, so it needs to send out a "broadcast" to
|
||||
* do this. To achieve this we send a network command. However, it
|
||||
* uses _local_player to execute the command as. To prevent abuse
|
||||
* (eg. only yourself can change your name/company), we 'cheat' by
|
||||
* impersonation _local_player as the server. Not the best solution;
|
||||
* but it works.
|
||||
* TODO: Perhaps this could be improved by when the client is ready
|
||||
* with joining to let it send itself the command, and not the server?
|
||||
* For example in network_client.c:534? */
|
||||
_cmd_text = ci->client_name;
|
||||
_local_player = ci->client_playas - 1;
|
||||
NetworkSend_Command(0, 0, 0, CMD_CHANGE_PRESIDENT_NAME, NULL);
|
||||
_local_player = player_backup;
|
||||
|
||||
Reference in New Issue
Block a user