mirror of https://github.com/OpenTTD/OpenTTD
(svn r14897) -Codechange: don't allow a few command flags to be sent over the network as it's bogus information anyway; e.g. the "do not send over network" flag as it will be set whenever the command is received from the server/client.
-Codechange: test earlier whether the command (send from the server) is actually valid.release/0.7
parent
f5b23103d7
commit
8d017f0ea1
|
@ -560,7 +560,7 @@ bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallbac
|
||||||
if (_networking && !(cmd & CMD_NETWORK_COMMAND)) {
|
if (_networking && !(cmd & CMD_NETWORK_COMMAND)) {
|
||||||
CompanyID bck = _local_company;
|
CompanyID bck = _local_company;
|
||||||
if (_network_dedicated || (_network_server && bck == COMPANY_SPECTATOR)) _local_company = COMPANY_FIRST;
|
if (_network_dedicated || (_network_server && bck == COMPANY_SPECTATOR)) _local_company = COMPANY_FIRST;
|
||||||
NetworkSend_Command(tile, p1, p2, cmd, callback, text);
|
NetworkSend_Command(tile, p1, p2, cmd & ~CMD_FLAGS_MASK, callback, text);
|
||||||
if (_network_dedicated || (_network_server && bck == COMPANY_SPECTATOR)) _local_company = bck;
|
if (_network_dedicated || (_network_server && bck == COMPANY_SPECTATOR)) _local_company = bck;
|
||||||
_docommand_recursive = 0;
|
_docommand_recursive = 0;
|
||||||
ClearStorageChanges(false);
|
ClearStorageChanges(false);
|
||||||
|
|
|
@ -685,6 +685,24 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_COMMAND)
|
||||||
cp->my_cmd = p->Recv_bool();
|
cp->my_cmd = p->Recv_bool();
|
||||||
cp->next = NULL;
|
cp->next = NULL;
|
||||||
|
|
||||||
|
if (!IsValidCommand(cp->cmd)) {
|
||||||
|
IConsolePrintF(CC_ERROR, "WARNING: invalid command from server, dropping...");
|
||||||
|
free(cp);
|
||||||
|
return NETWORK_RECV_STATUS_MALFORMED_PACKET;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetCommandFlags(cp->cmd) & CMD_OFFLINE) {
|
||||||
|
IConsolePrintF(CC_ERROR, "WARNING: offline only command from server, dropping...");
|
||||||
|
free(cp);
|
||||||
|
return NETWORK_RECV_STATUS_MALFORMED_PACKET;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((cp->cmd & CMD_FLAGS_MASK) != 0) {
|
||||||
|
IConsolePrintF(CC_ERROR, "WARNING: invalid command flag from server, dropping...");
|
||||||
|
free(cp);
|
||||||
|
return NETWORK_RECV_STATUS_MALFORMED_PACKET;
|
||||||
|
}
|
||||||
|
|
||||||
// The server did send us this command..
|
// The server did send us this command..
|
||||||
// queue it in our own queue, so we can handle it in the upcoming frame!
|
// queue it in our own queue, so we can handle it in the upcoming frame!
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,8 @@ void NetworkAddCommandQueue(NetworkClientSocket *cs, CommandPacket *cp)
|
||||||
// Prepare a DoCommand to be send over the network
|
// Prepare a DoCommand to be send over the network
|
||||||
void NetworkSend_Command(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallback *callback, const char *text)
|
void NetworkSend_Command(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallback *callback, const char *text)
|
||||||
{
|
{
|
||||||
|
assert((cmd & CMD_FLAG_MASK) == 0);
|
||||||
|
|
||||||
CommandPacket c;
|
CommandPacket c;
|
||||||
|
|
||||||
c.company = _local_company;
|
c.company = _local_company;
|
||||||
|
|
|
@ -839,6 +839,11 @@ static bool CheckCommandFlags(const CommandPacket *cp, const NetworkClientInfo *
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((cp->cmd & CMD_FLAGS_MASK) != 0) {
|
||||||
|
IConsolePrintF(CC_ERROR, "WARNING: invalid command flag from client %d (IP: %s), kicking...", ci->client_id, GetClientIP(ci));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue