From f0a114f4e515ce7034b7c1bcb65cf3d98b3d2ac9 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Tue, 18 Aug 2026 09:39:06 +0300 Subject: [PATCH] Kernel: Fix shm object freeing and track lpid I was deleting based on the key instead of the id which of course does not work :D --- .../kernel/Memory/SharedMemoryObject.h | 4 +++- kernel/kernel/Memory/SharedMemoryObject.cpp | 20 +++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/kernel/include/kernel/Memory/SharedMemoryObject.h b/kernel/include/kernel/Memory/SharedMemoryObject.h index 2a6d8a86..0f09cec9 100644 --- a/kernel/include/kernel/Memory/SharedMemoryObject.h +++ b/kernel/include/kernel/Memory/SharedMemoryObject.h @@ -27,8 +27,9 @@ namespace Kernel private: struct Object : public BAN::RefCounted { - Object(key_t key, shmid_ds info) + Object(key_t key, int id, shmid_ds info) : key(key) + , id(id) , info(info) { } ~Object(); @@ -36,6 +37,7 @@ namespace Kernel bool can_current_process_access(int flags) const; const key_t key; + const int id; shmid_ds info; Mutex mutex; diff --git a/kernel/kernel/Memory/SharedMemoryObject.cpp b/kernel/kernel/Memory/SharedMemoryObject.cpp index 94a8f252..d97a7aab 100644 --- a/kernel/kernel/Memory/SharedMemoryObject.cpp +++ b/kernel/kernel/Memory/SharedMemoryObject.cpp @@ -93,7 +93,15 @@ namespace Kernel const pid_t pid = process.pid(); const mode_t mode = shmflg & 0777; - auto object = TRY(BAN::RefPtr::create(key, shmid_ds { + const int shmid = ({ + int id; + do { + id = Random::get() & BAN::numeric_limits::max(); + } while (m_ids.contains(shmid)); + id; + }); + + auto object = TRY(BAN::RefPtr::create(key, shmid, shmid_ds { .shm_perm = { .uid = uid, .gid = gid, @@ -111,12 +119,6 @@ namespace Kernel })); TRY(object->paddrs.resize(BAN::Math::div_round_up(size, PAGE_SIZE), 0)); - auto generate_id = []() { return Random::get() & BAN::numeric_limits::max(); }; - - int shmid = generate_id(); - while (m_ids.contains(shmid)) - shmid = generate_id(); - if (key != IPC_PRIVATE) TRY(m_ids.insert(key, shmid)); @@ -222,14 +224,16 @@ namespace Kernel LockGuard _(m_object->mutex); m_object->info.shm_nattch++; m_object->info.shm_atime = SystemTimer::get().real_time().tv_sec; + m_object->info.shm_lpid = Process::current().pid(); } SharedMemoryObject::~SharedMemoryObject() { LockGuard _(m_object->mutex); if (--m_object->info.shm_nattch == 0 && m_object->marked_for_deletion) - SharedMemoryObjectManager::get().m_objects.remove(m_object->key); + SharedMemoryObjectManager::get().m_objects.remove(m_object->id); m_object->info.shm_dtime = SystemTimer::get().real_time().tv_sec; + m_object->info.shm_lpid = Process::current().pid(); } BAN::ErrorOr> SharedMemoryObject::clone(PageTable& new_page_table)