aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-06-14 15:43:44 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-06-14 15:43:44 +0200
commitdbd599ec79e26e9e726afdde19b3aa6ca7648cda (patch)
treea25e38cc3b7d7afb4494f0d01429e544d6ee610d
parentdd6537650ca7446a30b54aced340e17ad1b19f10 (diff)
parent672ed2067f48f3a1d6d6f8a6f97c4e76cc664bc3 (diff)
downloadkernel-dbd599ec79e26e9e726afdde19b3aa6ca7648cda.tar.xz
kernel-dbd599ec79e26e9e726afdde19b3aa6ca7648cda.zip
Merge branch 'fmorgner/develop/fix-shared-ptr-leaks' into 'develop'
Fix kstd::shared_ptr based leaks (and potential double-frees) See merge request teachos/kernel!51
-rw-r--r--kernel/include/kernel/filesystem/dentry.hpp4
-rw-r--r--kernel/src/filesystem/dentry.cpp8
-rw-r--r--libs/kstd/kstd/bits/shared_ptr.hpp6
3 files changed, 9 insertions, 9 deletions
diff --git a/kernel/include/kernel/filesystem/dentry.hpp b/kernel/include/kernel/filesystem/dentry.hpp
index 478596a..096a6bb 100644
--- a/kernel/include/kernel/filesystem/dentry.hpp
+++ b/kernel/include/kernel/filesystem/dentry.hpp
@@ -46,7 +46,7 @@ namespace kernel::filesystem
@brief Get the parent dentry.
@return A reference to the parent dentry.
*/
- [[nodiscard]] auto parent() const -> kstd::shared_ptr<dentry> const &;
+ [[nodiscard]] auto parent() const -> kstd::shared_ptr<dentry>;
/**
@brief Get the name of the dentry.
@@ -94,7 +94,7 @@ namespace kernel::filesystem
private:
kstd::string m_name;
- kstd::shared_ptr<dentry> m_parent;
+ kstd::weak_ptr<dentry> m_parent;
kstd::vector<kstd::shared_ptr<dentry>> m_children;
kstd::shared_ptr<inode> m_inode;
uint32_t m_flags;
diff --git a/kernel/src/filesystem/dentry.cpp b/kernel/src/filesystem/dentry.cpp
index 3d8e01a..01de276 100644
--- a/kernel/src/filesystem/dentry.cpp
+++ b/kernel/src/filesystem/dentry.cpp
@@ -34,9 +34,9 @@ namespace kernel::filesystem
return m_inode;
}
- auto dentry::parent() const -> kstd::shared_ptr<dentry> const &
+ auto dentry::parent() const -> kstd::shared_ptr<dentry>
{
- return m_parent;
+ return m_parent.lock();
}
auto dentry::name() const -> std::string_view
@@ -48,7 +48,7 @@ namespace kernel::filesystem
{
kstd::string path = m_name;
- auto parent = m_parent;
+ auto parent = this->parent();
while (parent)
{
auto parent_name = parent->m_name;
@@ -61,7 +61,7 @@ namespace kernel::filesystem
path = parent_name + "/" + path;
}
- parent = parent->m_parent;
+ parent = parent->parent();
}
return path;
diff --git a/libs/kstd/kstd/bits/shared_ptr.hpp b/libs/kstd/kstd/bits/shared_ptr.hpp
index 8930095..57a89c0 100644
--- a/libs/kstd/kstd/bits/shared_ptr.hpp
+++ b/libs/kstd/kstd/bits/shared_ptr.hpp
@@ -21,7 +21,7 @@ namespace kstd
std::atomic<std::size_t> shared_count;
std::atomic<std::size_t> weak_count;
- explicit shared_control_block(std::size_t shared = 1, std::size_t weak = 0)
+ explicit shared_control_block(std::size_t shared = 1, std::size_t weak = 1)
: shared_count(shared)
, weak_count(weak)
{}
@@ -146,7 +146,7 @@ namespace kstd
{
if (control != nullptr)
{
- if (--(control->weak_count) == 0 && control->shared_count == 0)
+ if (--(control->weak_count) == 0)
{
delete control;
}
@@ -579,7 +579,7 @@ namespace kstd
delete pointer;
pointer = nullptr;
- if (control->weak_count == 0)
+ if (--(control->weak_count) == 0)
{
delete control;
}