From 49dcb6b60b344182e2432194aa5f7f1007f854d6 Mon Sep 17 00:00:00 2001 From: Pratik Mankawde <3397372+pratikmankawde@users.noreply.github.com> Date: Wed, 4 Feb 2026 13:17:31 +0000 Subject: [PATCH] fix memory leak in LocalValue Signed-off-by: Pratik Mankawde <3397372+pratikmankawde@users.noreply.github.com> --- .../workflows/reusable-build-test-config.yml | 2 +- include/xrpl/basics/LocalValue.h | 22 +++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/.github/workflows/reusable-build-test-config.yml b/.github/workflows/reusable-build-test-config.yml index 5ea4cc4405..3d4ac34502 100644 --- a/.github/workflows/reusable-build-test-config.yml +++ b/.github/workflows/reusable-build-test-config.yml @@ -233,7 +233,7 @@ jobs: env: BUILD_NPROC: ${{ steps.nproc.outputs.nproc }} run: | - ./xrpld --unittest --unittest-jobs "${BUILD_NPROC}" + ./xrpld --unittest # Pipeline should fail if the separate tests failed. - name: Check results of the SeparateTests diff --git a/include/xrpl/basics/LocalValue.h b/include/xrpl/basics/LocalValue.h index 58ad586223..99538a0ff2 100644 --- a/include/xrpl/basics/LocalValue.h +++ b/include/xrpl/basics/LocalValue.h @@ -42,11 +42,29 @@ struct LocalValues std::unordered_map> values; }; +// Wrapper to ensure proper cleanup when thread exits +struct LocalValuesHolder +{ + LocalValues* ptr = nullptr; + + ~LocalValuesHolder() + { + if (ptr && !ptr->onCoro) + delete ptr; + } +}; + +inline LocalValuesHolder& +getLocalValuesHolder() +{ + thread_local LocalValuesHolder holder; + return holder; +} + inline LocalValues*& getLocalValuesPtr() { - thread_local LocalValues* ptr = nullptr; - return ptr; + return getLocalValuesHolder().ptr; } inline LocalValues*