mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-21 22:13:07 +01:00
Address possible nullptr dereferences
This commit is contained in:
@@ -1844,7 +1844,8 @@ static void window_ride_construction_construct(rct_window* w)
|
||||
_currentTrackSelectionFlags |= TRACK_SELECTION_FLAG_TRACK_PLACE_ACTION_QUEUED;
|
||||
}
|
||||
|
||||
if (dynamic_cast<TrackPlaceActionResult*>(res.get())->GroundFlags & TRACK_ELEMENT_LOCATION_IS_UNDERGROUND)
|
||||
auto tpar = dynamic_cast<TrackPlaceActionResult*>(res.get());
|
||||
if (tpar != nullptr && tpar->GroundFlags & TRACK_ELEMENT_LOCATION_IS_UNDERGROUND)
|
||||
{
|
||||
viewport_set_visibility(1);
|
||||
}
|
||||
|
||||
@@ -2559,17 +2559,18 @@ static money32 try_place_ghost_scenery(
|
||||
{ map_tile.x, map_tile.y, gSceneryPlaceZ, rotation }, quadrant, entryIndex, primaryColour, secondaryColour);
|
||||
smallSceneryPlaceAction.SetFlags(GAME_COMMAND_FLAG_GHOST | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED);
|
||||
auto res = GameActions::Execute(&smallSceneryPlaceAction);
|
||||
if (res->Error != GA_ERROR::OK)
|
||||
auto sspar = dynamic_cast<SmallSceneryPlaceActionResult*>(res.get());
|
||||
if (sspar == nullptr || res->Error != GA_ERROR::OK)
|
||||
return MONEY32_UNDEFINED;
|
||||
|
||||
gSceneryPlaceRotation = static_cast<uint16_t>(parameter_3 & 0xFF);
|
||||
gSceneryPlaceObject.SceneryType = SCENERY_TYPE_SMALL;
|
||||
gSceneryPlaceObject.EntryIndex = entryIndex;
|
||||
|
||||
tileElement = dynamic_cast<SmallSceneryPlaceActionResult*>(res.get())->tileElement;
|
||||
tileElement = sspar->tileElement;
|
||||
gSceneryGhostPosition = { map_tile, tileElement->GetBaseZ() };
|
||||
gSceneryQuadrant = tileElement->AsSmallScenery()->GetSceneryQuadrant();
|
||||
if (dynamic_cast<SmallSceneryPlaceActionResult*>(res.get())->GroundFlags & ELEMENT_IS_UNDERGROUND)
|
||||
if (sspar->GroundFlags & ELEMENT_IS_UNDERGROUND)
|
||||
{
|
||||
// Set underground on
|
||||
viewport_set_visibility(4);
|
||||
@@ -2646,15 +2647,16 @@ static money32 try_place_ghost_scenery(
|
||||
sceneryPlaceAction.SetFlags(
|
||||
GAME_COMMAND_FLAG_GHOST | GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND);
|
||||
auto res = GameActions::Execute(&sceneryPlaceAction);
|
||||
if (res->Error != GA_ERROR::OK)
|
||||
auto lspar = dynamic_cast<LargeSceneryPlaceActionResult*>(res.get());
|
||||
if (lspar == nullptr || res->Error != GA_ERROR::OK)
|
||||
return MONEY32_UNDEFINED;
|
||||
|
||||
gSceneryPlaceRotation = loc.direction;
|
||||
|
||||
tileElement = dynamic_cast<LargeSceneryPlaceActionResult*>(res.get())->tileElement;
|
||||
tileElement = lspar->tileElement;
|
||||
gSceneryGhostPosition = { map_tile, tileElement->GetBaseZ() };
|
||||
|
||||
if (dynamic_cast<LargeSceneryPlaceActionResult*>(res.get())->GroundFlags & ELEMENT_IS_UNDERGROUND)
|
||||
if (lspar->GroundFlags & ELEMENT_IS_UNDERGROUND)
|
||||
{
|
||||
// Set underground on
|
||||
viewport_set_visibility(4);
|
||||
|
||||
@@ -227,6 +227,12 @@ static void track_design_save_add_large_scenery(const CoordsXY& loc, LargeScener
|
||||
rct_large_scenery_tile *sceneryTiles, *tile;
|
||||
int32_t direction, sequence;
|
||||
|
||||
if (tileElement == nullptr)
|
||||
{
|
||||
log_warning("Null tile element");
|
||||
return;
|
||||
}
|
||||
|
||||
int32_t entryType = tileElement->GetEntryIndex();
|
||||
auto entry = object_entry_get_entry(OBJECT_TYPE_LARGE_SCENERY, entryType);
|
||||
sceneryTiles = get_large_scenery_entry(entryType)->large_scenery.tiles;
|
||||
@@ -404,6 +410,12 @@ static void track_design_save_remove_large_scenery(const CoordsXY& loc, LargeSce
|
||||
rct_large_scenery_tile *sceneryTiles, *tile;
|
||||
int32_t direction, sequence;
|
||||
|
||||
if (tileElement == nullptr)
|
||||
{
|
||||
log_warning("Null tile element");
|
||||
return;
|
||||
}
|
||||
|
||||
int32_t entryType = tileElement->GetEntryIndex();
|
||||
auto entry = object_entry_get_entry(OBJECT_TYPE_LARGE_SCENERY, entryType);
|
||||
sceneryTiles = get_large_scenery_entry(entryType)->large_scenery.tiles;
|
||||
|
||||
@@ -87,7 +87,8 @@ money32 place_provisional_track_piece(
|
||||
trackPlaceAction.SetFlags(GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND | GAME_COMMAND_FLAG_GHOST);
|
||||
// This command must not be sent over the network
|
||||
auto res = GameActions::Execute(&trackPlaceAction);
|
||||
result = res->Error == GA_ERROR::OK ? res->Cost : MONEY32_UNDEFINED;
|
||||
auto tpar = dynamic_cast<TrackPlaceActionResult*>(res.get());
|
||||
result = ((tpar == nullptr) || (res->Error == GA_ERROR::OK)) ? res->Cost : MONEY32_UNDEFINED;
|
||||
if (result == MONEY32_UNDEFINED)
|
||||
return result;
|
||||
|
||||
@@ -110,8 +111,7 @@ money32 place_provisional_track_piece(
|
||||
_unkF440C5.z = z;
|
||||
_unkF440C5.direction = trackDirection;
|
||||
_currentTrackSelectionFlags |= TRACK_SELECTION_FLAG_TRACK;
|
||||
viewport_set_visibility(
|
||||
(dynamic_cast<TrackPlaceActionResult*>(res.get())->GroundFlags & TRACK_ELEMENT_LOCATION_IS_UNDERGROUND) ? 1 : 3);
|
||||
viewport_set_visibility((tpar->GroundFlags & TRACK_ELEMENT_LOCATION_IS_UNDERGROUND) ? 1 : 3);
|
||||
if (_currentTrackSlopeEnd != 0)
|
||||
viewport_set_visibility(2);
|
||||
|
||||
|
||||
@@ -1480,7 +1480,12 @@ bool map_can_construct_with_clear_at(
|
||||
{
|
||||
*price += res->Cost;
|
||||
}
|
||||
gMapGroundFlags = dynamic_cast<ConstructClearResult*>(res.get())->GroundFlags;
|
||||
auto ccr = dynamic_cast<ConstructClearResult*>(res.get());
|
||||
if (ccr == nullptr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
gMapGroundFlags = ccr->GroundFlags;
|
||||
return res->Error == GA_ERROR::OK;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user