<URL: http://bugs.freeciv.org/Ticket/Display.html?id=40303 >

 Maybe this patch makes more sense.

 Crash was caused by adjusting player_idx, and setting bogus
player_ptr, for global observer in game_renumber_players.

 S2_1 version:
 - Fixes the bug
 - Adds sanity check for player number received in player_remove_player
 - Reverts my earlier patch

 There is no game.player_ptr or packet_remove_player in S2_2 and
TRUNK. This patch only
 - Revert my earlier patch, but uses proper accessor functions instead
of old implementation


 - ML

diff -Nurd -X.diff_ignore freeciv/client/gui-gtk-2.0/gui_main.c 
freeciv/client/gui-gtk-2.0/gui_main.c
--- freeciv/client/gui-gtk-2.0/gui_main.c       2008-06-22 10:07:27.000000000 
+0300
+++ freeciv/client/gui-gtk-2.0/gui_main.c       2008-06-22 11:21:52.000000000 
+0300
@@ -1487,9 +1487,7 @@
   if (game.player_ptr) {
     char *text;
 
-    if (game.player_ptr == NULL) {
-      text = _("_Ready");
-    } else if (game.player_ptr->is_ready) {
+    if (game.player_ptr->is_ready) {
       text = _("Not _ready");
     } else {
       int num_unready = 0;
diff -Nurd -X.diff_ignore freeciv/client/packhand.c freeciv/client/packhand.c
--- freeciv/client/packhand.c   2008-05-16 01:50:17.000000000 +0300
+++ freeciv/client/packhand.c   2008-06-22 11:02:53.000000000 +0300
@@ -2178,6 +2178,12 @@
 **************************************************************************/
 void handle_player_remove(int player_id)
 {
+  if (player_id < 0 || player_id >= MAX_NUM_PLAYERS) {
+    freelog(LOG_ERROR, "Illegal player_remove packet from server (%d)",
+            player_id);
+    return;
+  }
+
   client_remove_player(player_id);
   update_conn_list_dialog();
 }
diff -Nurd -X.diff_ignore freeciv/common/game.c freeciv/common/game.c
--- freeciv/common/game.c       2008-05-08 00:25:01.000000000 +0300
+++ freeciv/common/game.c       2008-06-22 11:21:01.000000000 +0300
@@ -534,7 +534,7 @@
     assert(city_list_size(game.players[i].cities) == 0);
   }
 
-  if(game.info.player_idx > plrno) {
+  if(game.player_ptr && game.info.player_idx > plrno) {
     game.info.player_idx--;
     game.player_ptr = &game.players[game.info.player_idx];
   }
diff -Nurd -X.diff_ignore freeciv/client/gui-gtk-2.0/gui_main.c 
freeciv/client/gui-gtk-2.0/gui_main.c
--- freeciv/client/gui-gtk-2.0/gui_main.c       2008-06-22 10:07:44.000000000 
+0300
+++ freeciv/client/gui-gtk-2.0/gui_main.c       2008-06-22 11:24:47.000000000 
+0300
@@ -1559,12 +1559,10 @@
 {
   GtkTreeIter it[player_count()];
 
-  if (NULL != client.conn.playing) {
+  if (!client_has_player()) {
     char *text;
 
-    if (!client_has_player()) {
-      text = _("_Ready");
-    } else if (client.conn.playing->is_ready) {
+    if (client_player()->is_ready) {
       text = _("Not _ready");
     } else {
       int num_unready = 0;
_______________________________________________
Freeciv-dev mailing list
Freeciv-dev@gna.org
https://mail.gna.org/listinfo/freeciv-dev

Reply via email to