forked from mirror/OpenTTD
(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:
@@ -143,13 +143,10 @@ DEF_CLIENT_SEND_COMMAND_PARAM(PACKET_CLIENT_COMMAND)(CommandPacket *cp)
|
||||
// uint32: P1 (free variables used in DoCommand)
|
||||
// uint32: P2
|
||||
// uint32: Tile
|
||||
// uint32: decode_params
|
||||
// 10 times the last one (lengthof(cp->dp))
|
||||
// string: text
|
||||
// uint8: CallBackID (see callback_table.c)
|
||||
//
|
||||
|
||||
uint i;
|
||||
char *dparam_char;
|
||||
Packet *p = NetworkSend_Init(PACKET_CLIENT_COMMAND);
|
||||
|
||||
NetworkSend_uint8(p, cp->player);
|
||||
@@ -157,14 +154,7 @@ DEF_CLIENT_SEND_COMMAND_PARAM(PACKET_CLIENT_COMMAND)(CommandPacket *cp)
|
||||
NetworkSend_uint32(p, cp->p1);
|
||||
NetworkSend_uint32(p, cp->p2);
|
||||
NetworkSend_uint32(p, (uint32)cp->tile);
|
||||
/* We are going to send them byte by byte, because dparam is misused
|
||||
for chars (if it is used), and else we have a BigEndian / LittleEndian
|
||||
problem.. we should fix the misuse of dparam... -- TrueLight */
|
||||
dparam_char = (char *)&cp->dp[0];
|
||||
for (i = 0; i < lengthof(cp->dp) * 4; i++) {
|
||||
NetworkSend_uint8(p, *dparam_char);
|
||||
dparam_char++;
|
||||
}
|
||||
NetworkSend_string(p, cp->text);
|
||||
NetworkSend_uint8(p, cp->callback);
|
||||
|
||||
NetworkSend_Packet(p, MY_CLIENT);
|
||||
@@ -587,22 +577,13 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_SYNC)
|
||||
|
||||
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_COMMAND)
|
||||
{
|
||||
uint i;
|
||||
char *dparam_char;
|
||||
CommandPacket *cp = malloc(sizeof(CommandPacket));
|
||||
cp->player = NetworkRecv_uint8(MY_CLIENT, p);
|
||||
cp->cmd = NetworkRecv_uint32(MY_CLIENT, p);
|
||||
cp->p1 = NetworkRecv_uint32(MY_CLIENT, p);
|
||||
cp->p2 = NetworkRecv_uint32(MY_CLIENT, p);
|
||||
cp->tile = NetworkRecv_uint32(MY_CLIENT, p);
|
||||
/* We are going to send them byte by byte, because dparam is misused
|
||||
for chars (if it is used), and else we have a BigEndian / LittleEndian
|
||||
problem.. we should fix the misuse of dparam... -- TrueLight */
|
||||
dparam_char = (char *)&cp->dp[0];
|
||||
for (i = 0; i < lengthof(cp->dp) * 4; i++) {
|
||||
*dparam_char = NetworkRecv_uint8(MY_CLIENT, p);
|
||||
dparam_char++;
|
||||
}
|
||||
NetworkRecv_string(MY_CLIENT, p, cp->text, sizeof(cp->text));
|
||||
cp->callback = NetworkRecv_uint8(MY_CLIENT, p);
|
||||
cp->frame = NetworkRecv_uint32(MY_CLIENT, p);
|
||||
cp->next = NULL;
|
||||
|
Reference in New Issue
Block a user