<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