From 29840057e9ebaf22cdae32e12eb234f081d33998 Mon Sep 17 00:00:00 2001 From: B2krobbery <150381094+B2krobbery@users.noreply.github.com> Date: Fri, 24 Apr 2026 13:17:25 +0530 Subject: [PATCH] process: free argv allocations on execvp failure --- src/os/Process.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/os/Process.cpp b/src/os/Process.cpp index 335d6b1..a7d2e9a 100644 --- a/src/os/Process.cpp +++ b/src/os/Process.cpp @@ -66,7 +66,7 @@ bool Hyprutils::OS::CProcess::runSync() { std::vector argsC; argsC.emplace_back(strdup(m_impl->binary.c_str())); for (auto& arg : m_impl->args) { - // TODO: does this leak? Can we just pipe c_str() as the strings won't be realloc'd? + // Arguments are duplicated for execvp; if execvp fails, they must be freed. argsC.emplace_back(strdup(arg.c_str())); } @@ -77,8 +77,13 @@ bool Hyprutils::OS::CProcess::runSync() { setenv(n.c_str(), v.c_str(), 1); } - execvp(m_impl->binary.c_str(), argsC.data()); - exit(1); + if (execvp(m_impl->binary.c_str(), argsC.data()) == -1) { + for (auto ptr : argsC) { + if (ptr) + free(ptr); + } + _exit(1); + } } else { // parent close(outPipe[1]);