1
0
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:
Michał Janiszewski
2020-04-19 22:35:24 +02:00
parent 5f97637d5e
commit c4b6897635
5 changed files with 31 additions and 11 deletions

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;
}