(svn r10075) -Fix [FS#844]: small memory leak on some early returns.
authorrubidium
Sat, 09 Jun 2007 04:01:40 +0000
changeset 6836 c8f93252c5d0
parent 6835 31c89aab2d61
child 6837 c23256acb73b
(svn r10075) -Fix [FS#844]: small memory leak on some early returns.
src/network/network_server.cpp
--- a/src/network/network_server.cpp	Sat Jun 09 02:05:51 2007 +0000
+++ b/src/network/network_server.cpp	Sat Jun 09 04:01:40 2007 +0000
@@ -832,8 +832,6 @@
 	const NetworkClientInfo *ci;
 	byte callback;
 
-	CommandPacket *cp = MallocT<CommandPacket>(1);
-
 	// The client was never joined.. so this is impossible, right?
 	//  Ignore the packet, give the client a warning, and close his connection
 	if (cs->status < STATUS_DONE_MAP || cs->has_quit) {
@@ -841,6 +839,7 @@
 		return;
 	}
 
+	CommandPacket *cp = MallocT<CommandPacket>(1);
 	cp->player = (Owner)p->Recv_uint8();
 	cp->cmd    = p->Recv_uint32();
 	cp->p1     = p->Recv_uint32();
@@ -850,7 +849,10 @@
 
 	callback = p->Recv_uint8();
 
-	if (cs->has_quit) return;
+	if (cs->has_quit) {
+		free(cp);
+		return;
+	}
 
 	ci = DEREF_CLIENT_INFO(cs);
 
@@ -858,11 +860,13 @@
 	if (!IsValidCommand(cp->cmd)) {
 		IConsolePrintF(_icolour_err, "WARNING: invalid command from client %d (IP: %s).", ci->client_index, GetPlayerIP(ci));
 		SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED);
+		free(cp);
 		return;
 	}
 
 	if (!CheckCommandFlags(cp, ci)) {
 		SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_KICKED);
+		free(cp);
 		return;
 	}
 
@@ -874,6 +878,7 @@
 		IConsolePrintF(_icolour_err, "WARNING: player %d (IP: %s) tried to execute a command as player %d, kicking...",
 		               ci->client_playas + 1, GetPlayerIP(ci), cp->player + 1);
 		SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_PLAYER_MISMATCH);
+		free(cp);
 		return;
 	}
 
@@ -885,6 +890,7 @@
 	if (cp->cmd == CMD_PLAYER_CTRL) {
 		if (cp->p1 != 0) {
 			SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_CHEATER);
+			free(cp);
 			return;
 		}