From a92efe581f3b6a37f3217684a7174efb50bb6ef9 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 12 Feb 2026 01:35:57 +0300 Subject: [PATCH] fix: assets access attempts in headless mode leading to segfaults --- src/engine/Engine.cpp | 2 +- src/logic/scripting/lua/libs/libassets.cpp | 12 ++++++++++++ src/logic/scripting/lua/libs/libgui.cpp | 3 +++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp index 0f34cb031..60973437c 100644 --- a/src/engine/Engine.cpp +++ b/src/engine/Engine.cpp @@ -420,7 +420,7 @@ EngineSettings& Engine::getSettings() { } Assets* Engine::getAssets() { - return assets->getStorage(); + return assets ? assets->getStorage() : nullptr; } AssetsLoader& Engine::acquireBackgroundLoader() { diff --git a/src/logic/scripting/lua/libs/libassets.cpp b/src/logic/scripting/lua/libs/libassets.cpp index 0921f1b9c..27d376542 100644 --- a/src/logic/scripting/lua/libs/libassets.cpp +++ b/src/logic/scripting/lua/libs/libassets.cpp @@ -26,6 +26,9 @@ static void load_texture( } static int l_request_texture(lua::State* L) { + if (engine->isHeadless()) { + throw std::runtime_error("not available in headless mode"); + } std::string filename = lua::require_string(L, 1); std::string alias = lua::require_string(L, 2); auto& loader = engine->acquireBackgroundLoader(); @@ -34,6 +37,9 @@ static int l_request_texture(lua::State* L) { } static int l_load_texture(lua::State* L) { + if (engine->isHeadless()) { + throw std::runtime_error("not available in headless mode"); + } if (lua::isstring(L, 3) && lua::require_lstring(L, 3) != "png") { throw std::runtime_error("unsupportd image format"); } @@ -61,6 +67,9 @@ static int l_load_texture(lua::State* L) { } static int l_parse_model(lua::State* L) { + if (engine->isHeadless()) { + throw std::runtime_error("not available in headless mode"); + } auto format = lua::require_lstring(L, 1); auto string = lua::require_lstring(L, 2); auto name = lua::require_string(L, 3); @@ -79,6 +88,9 @@ static int l_parse_model(lua::State* L) { } static int l_to_canvas(lua::State* L) { + if (engine->isHeadless()) { + throw std::runtime_error("not available in headless mode"); + } auto& assets = *engine->getAssets(); auto alias = lua::require_lstring(L, 1); diff --git a/src/logic/scripting/lua/libs/libgui.cpp b/src/logic/scripting/lua/libs/libgui.cpp index fe4cabada..0ec5e6475 100644 --- a/src/logic/scripting/lua/libs/libgui.cpp +++ b/src/logic/scripting/lua/libs/libgui.cpp @@ -32,6 +32,9 @@ using namespace scripting; static DocumentNode get_document_node_impl( lua::State*, const std::string& name, const std::string& nodeName, bool throwable=true ) { + if (engine->isHeadless()) { + throw std::runtime_error("not available in headless mode"); + } auto doc = engine->getAssets()->get(name); if (doc == nullptr) { if (throwable) {