(svn r8167) -Fix (FS#556): a network client crashes, due to a division by zero, when the connection gets lost at the right moment or when the packet is malformed (server sends size 0 for the map).
authorrubidium
Tue, 16 Jan 2007 22:56:18 +0000
changeset 5954 5100190669ac
parent 5953 7000c5bdd70b
child 5955 d78bc866b1ee
(svn r8167) -Fix (FS#556): a network client crashes, due to a division by zero, when the connection gets lost at the right moment or when the packet is malformed (server sends size 0 for the map).
src/network/network_client.cpp
--- a/src/network/network_client.cpp	Tue Jan 16 22:10:35 2007 +0000
+++ b/src/network/network_client.cpp	Tue Jan 16 22:56:18 2007 +0000
@@ -468,10 +468,19 @@
 
 		_frame_counter = _frame_counter_server = _frame_counter_max = NetworkRecv_uint32(MY_CLIENT, p);
 
-		_network_join_status = NETWORK_JOIN_STATUS_DOWNLOADING;
 		_network_join_kbytes = 0;
 		_network_join_kbytes_total = NetworkRecv_uint32(MY_CLIENT, p) / 1024;
-		InvalidateWindow(WC_NETWORK_STATUS_WINDOW, 0);
+
+		/* If the network connection has been closed due to loss of connection
+		 * or when _network_join_kbytes_total is 0, the join status window will
+		 * do a division by zero. When the connection is lost, we just return
+		 * that. If kbytes_total is 0, the packet must be malformed as a
+		 * savegame less than 1 kilobyte is practically impossible. */
+		if (MY_CLIENT->has_quit) return NETWORK_RECV_STATUS_CONN_LOST;
+		if (_network_join_kbytes_total == 0) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
+
+		_network_join_status = NETWORK_JOIN_STATUS_DOWNLOADING;
+ 		InvalidateWindow(WC_NETWORK_STATUS_WINDOW, 0);
 
 		// The first packet does not contain any more data
 		return NETWORK_RECV_STATUS_OKAY;