# HG changeset patch # User Darkvater # Date 1162329356 0 # Node ID 21e84e53c7320d7b2ad3349e0661cedc114c8c1f # Parent 0fdfbb61f14679d8dd9772b0916091d1e4394b70 (svn r7022) -Fix [FS#292]: Properly guard against viewing company-sensitive information from invalid players (eg spectators) which could lead to crashes. diff -r 0fdfbb61f146 -r 21e84e53c732 airport_gui.c --- a/airport_gui.c Tue Oct 31 17:13:12 2006 +0000 +++ b/airport_gui.c Tue Oct 31 21:15:56 2006 +0000 @@ -133,7 +133,8 @@ void ShowBuildAirToolbar(void) { - if (_current_player == PLAYER_SPECTATOR) return; + if (!IsValidPlayer(_current_player)) return; + DeleteWindowById(WC_BUILD_TOOLBAR, 0); AllocateWindowDescFront(&_air_toolbar_desc, 0); if (_patches.link_terraform_toolbar) ShowTerraformToolbar(); diff -r 0fdfbb61f146 -r 21e84e53c732 dock_gui.c --- a/dock_gui.c Tue Oct 31 17:13:12 2006 +0000 +++ b/dock_gui.c Tue Oct 31 21:15:56 2006 +0000 @@ -214,7 +214,8 @@ void ShowBuildDocksToolbar(void) { - if (_current_player == PLAYER_SPECTATOR) return; + if (!IsValidPlayer(_current_player)) return; + DeleteWindowById(WC_BUILD_TOOLBAR, 0); AllocateWindowDesc(&_build_docks_toolbar_desc); if (_patches.link_terraform_toolbar) ShowTerraformToolbar(); diff -r 0fdfbb61f146 -r 21e84e53c732 industry_gui.c --- a/industry_gui.c Tue Oct 31 17:13:12 2006 +0000 +++ b/industry_gui.c Tue Oct 31 21:15:56 2006 +0000 @@ -268,7 +268,7 @@ void ShowBuildIndustryWindow(void) { - if (_current_player == PLAYER_SPECTATOR) return; + if (!IsValidPlayer(_current_player)) return; AllocateWindowDescFront(_industry_window_desc[_patches.build_rawmaterial_ind][_opt_ptr->landscape],0); } diff -r 0fdfbb61f146 -r 21e84e53c732 main_gui.c --- a/main_gui.c Tue Oct 31 17:13:12 2006 +0000 +++ b/main_gui.c Tue Oct 31 21:15:56 2006 +0000 @@ -1821,30 +1821,26 @@ } break; case WE_KEYPRESS: { - PlayerID local = (_local_player != PLAYER_SPECTATOR) ? _local_player : 0; - switch (e->we.keypress.keycode) { - case WKC_F1: case WKC_PAUSE: - ToolbarPauseClick(w); - break; + case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(w); break; case WKC_F2: ShowGameOptions(); break; case WKC_F3: MenuClickSaveLoad(0); break; case WKC_F4: ShowSmallMap(); break; case WKC_F5: ShowTownDirectory(); break; case WKC_F6: ShowSubsidiesList(); break; - case WKC_F7: ShowPlayerStations(local); break; - case WKC_F8: ShowPlayerFinances(local); break; - case WKC_F9: ShowPlayerCompany(local); break; + case WKC_F7: ShowPlayerStations(_local_player); break; + case WKC_F8: ShowPlayerFinances(_local_player); break; + case WKC_F9: ShowPlayerCompany(_local_player); break; case WKC_F10:ShowOperatingProfitGraph(); break; case WKC_F11: ShowCompanyLeagueTable(); break; case WKC_F12: ShowBuildIndustryWindow(); break; - case WKC_SHIFT | WKC_F1: ShowVehicleListWindow(local, INVALID_STATION, VEH_Train); break; - case WKC_SHIFT | WKC_F2: ShowVehicleListWindow(local, INVALID_STATION, VEH_Road); break; - case WKC_SHIFT | WKC_F3: ShowVehicleListWindow(local, INVALID_STATION, VEH_Ship); break; - case WKC_SHIFT | WKC_F4: ShowVehicleListWindow(local, INVALID_STATION, VEH_Aircraft); break; + case WKC_SHIFT | WKC_F1: ShowVehicleListWindow(_local_player, INVALID_STATION, VEH_Train); break; + case WKC_SHIFT | WKC_F2: ShowVehicleListWindow(_local_player, INVALID_STATION, VEH_Road); break; + case WKC_SHIFT | WKC_F3: ShowVehicleListWindow(_local_player, INVALID_STATION, VEH_Ship); break; + case WKC_SHIFT | WKC_F4: ShowVehicleListWindow(_local_player, INVALID_STATION, VEH_Aircraft); break; case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(w); break; case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(w); break; - case WKC_SHIFT | WKC_F7: ShowBuildRailToolbar(_last_built_railtype,-1); break; + case WKC_SHIFT | WKC_F7: ShowBuildRailToolbar(_last_built_railtype, -1); break; case WKC_SHIFT | WKC_F8: ShowBuildRoadToolbar(); break; case WKC_SHIFT | WKC_F9: ShowBuildDocksToolbar(); break; case WKC_SHIFT | WKC_F10:ShowBuildAirToolbar(); break; diff -r 0fdfbb61f146 -r 21e84e53c732 misc_gui.c --- a/misc_gui.c Tue Oct 31 17:13:12 2006 +0000 +++ b/misc_gui.c Tue Oct 31 21:15:56 2006 +0000 @@ -450,6 +450,7 @@ void ShowBuildTreesToolbar(void) { + if (!IsValidPlayer(_current_player)) return; AllocateWindowDescFront(&_build_trees_desc, 0); } diff -r 0fdfbb61f146 -r 21e84e53c732 player_gui.c --- a/player_gui.c Tue Oct 31 17:13:12 2006 +0000 +++ b/player_gui.c Tue Oct 31 21:15:56 2006 +0000 @@ -219,24 +219,24 @@ PlayerFinancesWndProc }; -static const WindowDesc * const desc_table[2*2] = { - &_player_finances_desc,&_player_finances_small_desc, - &_other_player_finances_desc,&_other_player_finances_small_desc, -}; - static void DoShowPlayerFinances(PlayerID player, bool show_small, bool show_stickied) { Window *w; int mode; + static const WindowDesc * const desc_table[2 * 2] = { + &_player_finances_desc, &_player_finances_small_desc, + &_other_player_finances_desc, &_other_player_finances_small_desc, + }; + + if (!IsValidPlayer(player)) return; + mode = (player != _local_player) * 2 + show_small; w = AllocateWindowDescFront(desc_table[mode], player); if (w != NULL) { w->caption_color = w->window_number; WP(w,def_d).data_1 = mode; - if (show_stickied) { - w->flags4 |= WF_STICKY; - } + if (show_stickied) w->flags4 |= WF_STICKY; } } @@ -878,6 +878,8 @@ { Window *w; + if (!IsValidPlayer(player)) return; + w = AllocateWindowDescFront(&_player_company_desc, player); if (w != NULL) w->caption_color = w->window_number; } diff -r 0fdfbb61f146 -r 21e84e53c732 rail_gui.c --- a/rail_gui.c Tue Oct 31 17:13:12 2006 +0000 +++ b/rail_gui.c Tue Oct 31 21:15:56 2006 +0000 @@ -589,7 +589,7 @@ { Window *w; - if (_current_player == PLAYER_SPECTATOR) return; + if (!IsValidPlayer(_current_player)) return; if (!ValParamRailtype(railtype)) return; // don't recreate the window if we're clicking on a button and the window exists. diff -r 0fdfbb61f146 -r 21e84e53c732 road_gui.c --- a/road_gui.c Tue Oct 31 17:13:12 2006 +0000 +++ b/road_gui.c Tue Oct 31 21:15:56 2006 +0000 @@ -318,7 +318,8 @@ void ShowBuildRoadToolbar(void) { - if (_current_player == PLAYER_SPECTATOR) return; + if (!IsValidPlayer(_current_player)) return; + DeleteWindowById(WC_BUILD_TOOLBAR, 0); AllocateWindowDesc(&_build_road_desc); if (_patches.link_terraform_toolbar) ShowTerraformToolbar(); diff -r 0fdfbb61f146 -r 21e84e53c732 station_gui.c --- a/station_gui.c Tue Oct 31 17:13:12 2006 +0000 +++ b/station_gui.c Tue Oct 31 21:15:56 2006 +0000 @@ -506,6 +506,8 @@ { Window *w; + if (!IsValidPlayer(player)) return; + w = AllocateWindowDescFront(&_player_stations_desc, player); if (w != NULL) { w->caption_color = (byte)w->window_number; diff -r 0fdfbb61f146 -r 21e84e53c732 terraform_gui.c --- a/terraform_gui.c Tue Oct 31 17:13:12 2006 +0000 +++ b/terraform_gui.c Tue Oct 31 21:15:56 2006 +0000 @@ -274,6 +274,6 @@ void ShowTerraformToolbar(void) { - if (_current_player == PLAYER_SPECTATOR) return; + if (!IsValidPlayer(_current_player)) return; AllocateWindowDescFront(&_terraform_desc, 0); } diff -r 0fdfbb61f146 -r 21e84e53c732 vehicle_gui.c --- a/vehicle_gui.c Tue Oct 31 17:13:12 2006 +0000 +++ b/vehicle_gui.c Tue Oct 31 21:15:56 2006 +0000 @@ -1856,8 +1856,11 @@ static void ShowVehicleListWindowLocal(PlayerID player, byte vehicle_type, StationID station, OrderID order, uint16 depot_airport_index) { Window *w; - WindowNumber num = (vehicle_type << 11) | player; + WindowNumber num; + if (!IsValidPlayer(player)) return; + + num = (vehicle_type << 11) | player; if (order != INVALID_ORDER) { num |= (order << 16) | VLW_SHARED_ORDERS; } else if (depot_airport_index != INVALID_STATION) {