From 8a647acda62a1a86386d6ce0d8ccfa5902899634 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Wed, 15 Jul 2026 12:19:17 +0200 Subject: kstd: fix shared_ptr constructor race --- libs/kstd/kstd/bits/shared_ptr.hpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/libs/kstd/kstd/bits/shared_ptr.hpp b/libs/kstd/kstd/bits/shared_ptr.hpp index ce4bfb7f..f4aed34e 100644 --- a/libs/kstd/kstd/bits/shared_ptr.hpp +++ b/libs/kstd/kstd/bits/shared_ptr.hpp @@ -266,11 +266,18 @@ namespace kstd : pointer(nullptr) , control(nullptr) { - if (other.control != nullptr && other.control->shared_count != 0) + if (other.control) { - pointer = other.pointer; - control = other.control; - ++(control->shared_count); + auto count = other.control->shared_count.load(std::memory_order::relaxed); + while (count != 0 && !other.control->shared_count.compare_exchange_weak( + count, count + 1, std::memory_order::acquire, std::memory_order::relaxed)) + ; + + if (count != 0) + { + pointer = other.pointer; + control = other.control; + } } } -- cgit v1.2.3