From 41bad6c97c60918af640e8d4c558316edd1bd9c7 Mon Sep 17 00:00:00 2001 From: Kae <80987908+Novaenia@users.noreply.github.com> Date: Sat, 1 Jun 2024 21:32:27 +1000 Subject: [PATCH] fix MaterialDatabase::radiantLight null deref when material/matmod ID does not exist --- source/game/StarLiquidsDatabase.hpp | 12 +++++------- source/game/StarMaterialDatabase.hpp | 8 ++++---- source/game/StarWorldClient.cpp | 6 ++---- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/source/game/StarLiquidsDatabase.hpp b/source/game/StarLiquidsDatabase.hpp index 707be70..fa319c0 100644 --- a/source/game/StarLiquidsDatabase.hpp +++ b/source/game/StarLiquidsDatabase.hpp @@ -89,14 +89,12 @@ inline LiquidSettingsConstPtr LiquidsDatabase::liquidSettings(LiquidId liquidId) } inline Vec3F LiquidsDatabase::radiantLight(LiquidLevel level) const { - if (level.liquid >= m_settings.size()) - return Vec3F(); + if (level.liquid < m_settings.size()) { + if (auto const& settings = m_settings[level.liquid]) + return settings->radiantLightLevel * level.level; + } - auto const& settings = m_settings[level.liquid]; - if (!settings) - return Vec3F(); - - return settings->radiantLightLevel * level.level; + return Vec3F(); } } diff --git a/source/game/StarMaterialDatabase.hpp b/source/game/StarMaterialDatabase.hpp index 8e4f350..b890e30 100644 --- a/source/game/StarMaterialDatabase.hpp +++ b/source/game/StarMaterialDatabase.hpp @@ -239,13 +239,13 @@ inline Vec3F MaterialDatabase::radiantLight(MaterialId materialId, ModId modId) Vec3F radiantLight; if (materialId < m_materials.size()) { auto const& mat = m_materials[materialId]; - if (mat->materialRenderProfile) + if (mat && mat->materialRenderProfile) radiantLight += mat->materialRenderProfile->radiantLight; } if (modId < m_mods.size()) { - auto const& mat = m_mods[modId]; - if (mat->modRenderProfile) - radiantLight += mat->modRenderProfile->radiantLight; + auto const& mod = m_mods[modId]; + if (mod && mod->modRenderProfile) + radiantLight += mod->modRenderProfile->radiantLight; } return radiantLight; } diff --git a/source/game/StarWorldClient.cpp b/source/game/StarWorldClient.cpp index 91f1d39..ef5daa2 100644 --- a/source/game/StarWorldClient.cpp +++ b/source/game/StarWorldClient.cpp @@ -1631,6 +1631,7 @@ RpcPromise WorldClient::interact(InteractRequest const& request) } void WorldClient::lightingTileGather() { + int64_t start = Time::monotonicMicroseconds(); Vec3F environmentLight = m_sky->environmentLight().toRgbF(); float undergroundLevel = m_worldTemplate->undergroundLevel(); auto liquidsDatabase = Root::singleton().liquidsDatabase(); @@ -1638,7 +1639,6 @@ void WorldClient::lightingTileGather() { // Each column in tileEvalColumns is guaranteed to be no larger than the sector size. - size_t lights = 0; m_tileArray->tileEvalColumns(m_lightingCalculator.calculationRegion(), [&](Vec2I const& pos, ClientTile const* column, size_t ySize) { size_t baseIndex = m_lightingCalculator.baseIndexFor(pos); for (size_t y = 0; y < ySize; ++y) { @@ -1655,12 +1655,10 @@ void WorldClient::lightingTileGather() { if (tile.backgroundLightTransparent && pos[1] + y > undergroundLevel) light += environmentLight; } - if (light.max() > 0.0f) - ++lights; m_lightingCalculator.setCellIndex(baseIndex + y, light, !tile.foregroundLightTransparent); } }); - LogMap::set("client_render_world_async_light_tiles", toString(lights)); + LogMap::set("client_render_world_async_light_gather", strf(u8"{:05d}\u00b5s", Time::monotonicMicroseconds() - start)); } void WorldClient::lightingCalc() {