index 346a5018f2295f2d20871c01ef1a33e0b8901545..ccaddfc87b2b29e1d2966f78d080aa30db6f7ed1 100644 (file)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
+ * the Free Software Foundation, version 3 of the License ONLY.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
uses sysutils, g_console;
uses sysutils, g_console;
+// TODO: Unify this with g_Net_Host_HandlePacket() somehow? They're almost the same.
procedure g_Net_Client_HandlePacket(P: pENetPacket; Handler: TNetClientMsgHandler);
var
MNext: Integer;
MSize: LongWord;
procedure g_Net_Client_HandlePacket(P: pENetPacket; Handler: TNetClientMsgHandler);
var
MNext: Integer;
MSize: LongWord;
- MHandled: Boolean;
+ MHandled: Boolean = false;
NetMsg: TMsg;
NetMsg: TMsg;
+ Err: Boolean;
begin
begin
- if not NetMsg.Init(P^.data, P^.dataLength, True) then
- Exit;
+ if not NetMsg.Init(P^.data, P^.dataLength, True)
+ then exit;
+ Err := False;
MNext := 0;
MNext := 0;
- while NetMsg.BytesLeft() > 0 do
+ while (NetMsg.BytesLeft() > 0) and (not Err) do
begin
begin
- MSize := NetMsg.ReadLongWord();
- MNext := NetMsg.ReadCount + MSize;
- MHandled := Handler(NetMsg); // TODO: maybe do something with this bool
- NetMsg.Seek(MNext);
+ try
+ MSize := NetMsg.ReadLongWord();
+ MNext := NetMsg.ReadCount + MSize;
+ MHandled := Handler(NetMsg); // TODO: maybe do something with this bool
+ NetMsg.Seek(MNext);
+ except
+ Err := True;
+ end;
end;
enet_packet_destroy(P);
end;
enet_packet_destroy(P);
+ //if Err
+ // then MC_MalformedPacket(S);
end;
procedure g_Net_Host_HandlePacket(S: pTNetClient; P: pENetPacket; Handler: TNetHostMsgHandler);
var
MNext: Integer;
MSize: LongWord;
end;
procedure g_Net_Host_HandlePacket(S: pTNetClient; P: pENetPacket; Handler: TNetHostMsgHandler);
var
MNext: Integer;
MSize: LongWord;
- MHandled: Boolean;
+ MHandled: Boolean = false;
NetMsg: TMsg;
NetMsg: TMsg;
+ Err: Boolean;
begin
begin
- if not NetMsg.Init(P^.data, P^.dataLength, True) then
- Exit;
+ if not NetMsg.Init(P^.data, P^.dataLength, True)
+ then exit;
+ Err := False;
MNext := 0;
MNext := 0;
- while NetMsg.BytesLeft() > 0 do
+ while (NetMsg.BytesLeft() > 0) and (not Err) do
begin
begin
- MSize := NetMsg.ReadLongWord();
- MNext := NetMsg.ReadCount + MSize;
- MHandled := Handler(S, NetMsg); // TODO: maybe do something with this bool
- NetMsg.Seek(MNext);
+ try
+ MSize := NetMsg.ReadLongWord();
+ MNext := NetMsg.ReadCount + MSize;
+ MHandled := Handler(S, NetMsg); // TODO: maybe do something with this bool
+ NetMsg.Seek(MNext);
+ except
+ Err := True;
+ end;
end;
enet_packet_destroy(P);
end;
enet_packet_destroy(P);
+ if Err
+ then MH_MalformedPacket(S);
end;
function g_Net_ClientMsgHandler(NetMsg: TMsg): Boolean;
var
MID: Byte;
end;
function g_Net_ClientMsgHandler(NetMsg: TMsg): Boolean;
var
MID: Byte;
+ Err: Boolean;
begin
Result := True;
begin
Result := True;
- MID := NetMsg.ReadByte();
+ Err := False;
+ try
+ MID := NetMsg.ReadByte();
+ except
+ MID := 0;
+ Err := True;
+ end;
+
+ //if Err then begin MC_MalformedPacket(S); Exit; end;
case MID of
NET_MSG_CHAT: MC_RECV_Chat(NetMsg);
case MID of
NET_MSG_CHAT: MC_RECV_Chat(NetMsg);
NET_MSG_GEVENT: MC_RECV_GameEvent(NetMsg);
NET_MSG_FLAG: MC_RECV_FlagEvent(NetMsg);
NET_MSG_GSET: MC_RECV_GameSettings(NetMsg);
NET_MSG_GEVENT: MC_RECV_GameEvent(NetMsg);
NET_MSG_FLAG: MC_RECV_FlagEvent(NetMsg);
NET_MSG_GSET: MC_RECV_GameSettings(NetMsg);
+ NET_MSG_FLAGPOS:MC_RECV_FlagPos(NetMsg);
NET_MSG_PLR: MC_RECV_PlayerCreate(NetMsg);
NET_MSG_PLRPOS: MC_RECV_PlayerPos(NetMsg);
NET_MSG_PLR: MC_RECV_PlayerCreate(NetMsg);
NET_MSG_PLRPOS: MC_RECV_PlayerPos(NetMsg);
NET_MSG_ISPAWN: MC_RECV_ItemSpawn(NetMsg);
NET_MSG_IDEL: MC_RECV_ItemDestroy(NetMsg);
NET_MSG_ISPAWN: MC_RECV_ItemSpawn(NetMsg);
NET_MSG_IDEL: MC_RECV_ItemDestroy(NetMsg);
+ NET_MSG_IPOS: MC_RECV_ItemPos(NetMsg);
NET_MSG_PSTATE: MC_RECV_PanelState(NetMsg);
NET_MSG_PTEX: MC_RECV_PanelTexture(NetMsg);
NET_MSG_PSTATE: MC_RECV_PanelState(NetMsg);
NET_MSG_PTEX: MC_RECV_PanelTexture(NetMsg);
function g_Net_ClientLightMsgHandler(NetMsg: TMsg): Boolean;
var
MID: Byte;
function g_Net_ClientLightMsgHandler(NetMsg: TMsg): Boolean;
var
MID: Byte;
+ Err: Boolean;
begin
Result := True;
begin
Result := True;
- MID := NetMsg.ReadByte();
+ Err := False;
+ try
+ MID := NetMsg.ReadByte();
+ except
+ MID := 0;
+ Err := True;
+ end;
+
+ //if Err then begin MC_MalformedPacket(S); Exit; end;
case MID of
NET_MSG_GEVENT: MC_RECV_GameEvent(NetMsg);
case MID of
NET_MSG_GEVENT: MC_RECV_GameEvent(NetMsg);
function g_Net_HostMsgHandler(S: pTNetClient; NetMsg: TMsg): Boolean;
var
MID: Byte;
function g_Net_HostMsgHandler(S: pTNetClient; NetMsg: TMsg): Boolean;
var
MID: Byte;
+ Err: Boolean;
begin
Result := True;
begin
Result := True;
- MID := NetMsg.ReadByte();
+ Err := False;
+ try
+ MID := NetMsg.ReadByte();
+ except
+ MID := 0;
+ Err := True;
+ end;
+
+ if Err then begin MH_MalformedPacket(S); Exit; end;
case MID of
NET_MSG_INFO: MH_RECV_Info(S, NetMsg);
case MID of
NET_MSG_INFO: MH_RECV_Info(S, NetMsg);
NET_MSG_RCON_AUTH: MH_RECV_RCONPassword(S, NetMsg);
NET_MSG_RCON_CMD: MH_RECV_RCONCommand(S, NetMsg);
NET_MSG_RCON_AUTH: MH_RECV_RCONPassword(S, NetMsg);
NET_MSG_RCON_CMD: MH_RECV_RCONCommand(S, NetMsg);
- NET_MSG_MAP_REQUEST: MH_RECV_MapRequest(S, NetMsg);
- NET_MSG_RES_REQUEST: MH_RECV_ResRequest(S, NetMsg);
+ //NET_MSG_MAP_REQUEST: MH_RECV_MapRequest(S, NetMsg);
+ //NET_MSG_RES_REQUEST: MH_RECV_ResRequest(S, NetMsg);
NET_MSG_VOTE_EVENT: MH_RECV_Vote(S, NetMsg);
end;
NET_MSG_VOTE_EVENT: MH_RECV_Vote(S, NetMsg);
end;