From 91d68513de5b182103393ee4abd3eb37db905bee Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Thu, 30 Jun 2022 23:55:28 +0200 Subject: [PATCH] fix possible segfault by realloc --- src/config/ConfigManager.cpp | 11 ++++++++++- src/managers/KeybindManager.cpp | 10 +++++++++- src/render/Renderer.cpp | 12 +++++++----- src/render/Renderer.hpp | 2 +- 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 215d71c0..26503f7e 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -1054,11 +1054,20 @@ void CConfigManager::dispatchExecOnce() { } void CConfigManager::performMonitorReload() { + + bool overAgain = false; + for (auto& m : g_pCompositor->m_vMonitors) { auto rule = getMonitorRuleFor(m->szName); - g_pHyprRenderer->applyMonitorRule(m.get(), &rule); + if (!g_pHyprRenderer->applyMonitorRule(m.get(), &rule)) { + overAgain = true; + break; + } } + if (overAgain) + performMonitorReload(); + m_bWantsMonitorReload = false; } diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index e2a26781..f5554f57 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -894,10 +894,18 @@ void CKeybindManager::toggleSpecialWorkspace(std::string args) { } void CKeybindManager::forceRendererReload(std::string args) { + bool overAgain = false; + for (auto& m : g_pCompositor->m_vMonitors) { auto rule = g_pConfigManager->getMonitorRuleFor(m->szName); - g_pHyprRenderer->applyMonitorRule(m.get(), &rule, true); + if (!g_pHyprRenderer->applyMonitorRule(m.get(), &rule, true)) { + overAgain = true; + break; + } } + + if (overAgain) + forceRendererReload(args); } void CKeybindManager::resizeActive(std::string args) { diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 97c2de73..eaa3cd90 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -643,7 +643,7 @@ DAMAGETRACKINGMODES CHyprRenderer::damageTrackingModeFromStr(const std::string& return DAMAGE_TRACKING_INVALID; } -void CHyprRenderer::applyMonitorRule(SMonitor* pMonitor, SMonitorRule* pMonitorRule, bool force) { +bool CHyprRenderer::applyMonitorRule(SMonitor* pMonitor, SMonitorRule* pMonitorRule, bool force) { Debug::log(LOG, "Applying monitor rule for %s", pMonitor->szName.c_str()); @@ -653,13 +653,13 @@ void CHyprRenderer::applyMonitorRule(SMonitor* pMonitor, SMonitorRule* pMonitorR wlr_output_commit(pMonitor->output); Events::listener_monitorDestroy(nullptr, pMonitor->output); - return; + return false; } // Check if the rule isn't already applied if (!force && DELTALESSTHAN(pMonitor->vecPixelSize.x, pMonitorRule->resolution.x, 1) && DELTALESSTHAN(pMonitor->vecPixelSize.y, pMonitorRule->resolution.y, 1) && DELTALESSTHAN(pMonitor->refreshRate, pMonitorRule->refreshRate, 1) && pMonitor->scale == pMonitorRule->scale && DELTALESSTHAN(pMonitor->vecPosition.x, pMonitorRule->offset.x, 1) && DELTALESSTHAN(pMonitor->vecPosition.y, pMonitorRule->offset.y, 1) && pMonitor->transform == pMonitorRule->transform) { Debug::log(LOG, "Not applying a new rule to %s because it's already applied!", pMonitor->szName.c_str()); - return; + return true; } wlr_output_set_scale(pMonitor->output, pMonitorRule->scale); @@ -709,7 +709,7 @@ void CHyprRenderer::applyMonitorRule(SMonitor* pMonitor, SMonitorRule* pMonitorR if (!PREFERREDMODE) { Debug::log(ERR, "Monitor %s has NO PREFERRED MODE, and an INVALID one was requested: %ix%i@%2f", (int)pMonitorRule->resolution.x, (int)pMonitorRule->resolution.y, (float)pMonitorRule->refreshRate); - return; + return true; } // Preferred is valid @@ -740,7 +740,7 @@ void CHyprRenderer::applyMonitorRule(SMonitor* pMonitor, SMonitorRule* pMonitorR if (!wlr_output_commit(pMonitor->output)) { Debug::log(ERR, "Couldn't commit output named %s", pMonitor->output->name); - return; + return true; } int x, y; @@ -762,6 +762,8 @@ void CHyprRenderer::applyMonitorRule(SMonitor* pMonitor, SMonitorRule* pMonitorR // frame skip pMonitor->framesToSkip = 1; + + return true; } void CHyprRenderer::ensureCursorRenderingMode() { diff --git a/src/render/Renderer.hpp b/src/render/Renderer.hpp index 43a241ed..ff9fd4ea 100644 --- a/src/render/Renderer.hpp +++ b/src/render/Renderer.hpp @@ -28,7 +28,7 @@ public: void damageBox(wlr_box*); void damageBox(const int& x, const int& y, const int& w, const int& h); void damageMonitor(SMonitor*); - void applyMonitorRule(SMonitor*, SMonitorRule*, bool force = false); + bool applyMonitorRule(SMonitor*, SMonitorRule*, bool force = false); bool shouldRenderWindow(CWindow*, SMonitor*); bool shouldRenderWindow(CWindow*); void ensureCursorRenderingMode();