From 692ba431823499a579ce77453f32c3589866bf5f Mon Sep 17 00:00:00 2001 From: Bananymous Date: Fri, 30 May 2025 22:02:17 +0300 Subject: [PATCH] Kernel: Fix spinlock bugs found by the new spinlock security --- kernel/kernel/Networking/UNIX/Socket.cpp | 5 +++-- kernel/kernel/Terminal/PseudoTerminal.cpp | 20 +++++++++++--------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/kernel/kernel/Networking/UNIX/Socket.cpp b/kernel/kernel/Networking/UNIX/Socket.cpp index b7588c14f8..c21b0181db 100644 --- a/kernel/kernel/Networking/UNIX/Socket.cpp +++ b/kernel/kernel/Networking/UNIX/Socket.cpp @@ -281,10 +281,11 @@ namespace Kernel if (!is_streaming()) m_packet_sizes.push(packet.size()); - epoll_notify(EPOLLIN); - m_packet_thread_blocker.unblock(); m_packet_lock.unlock(state); + + epoll_notify(EPOLLIN); + return {}; } diff --git a/kernel/kernel/Terminal/PseudoTerminal.cpp b/kernel/kernel/Terminal/PseudoTerminal.cpp index 04c2b15e59..0e4e463296 100644 --- a/kernel/kernel/Terminal/PseudoTerminal.cpp +++ b/kernel/kernel/Terminal/PseudoTerminal.cpp @@ -88,18 +88,20 @@ namespace Kernel bool PseudoTerminalMaster::putchar(uint8_t ch) { - SpinLockGuard _(m_buffer_lock); + { + SpinLockGuard _(m_buffer_lock); - if (m_buffer_size >= m_buffer->size()) - return false; + if (m_buffer_size >= m_buffer->size()) + return false; - reinterpret_cast(m_buffer->vaddr())[(m_buffer_tail + m_buffer_size) % m_buffer->size()] = ch; - m_buffer_size++; + reinterpret_cast(m_buffer->vaddr())[(m_buffer_tail + m_buffer_size) % m_buffer->size()] = ch; + m_buffer_size++; + + m_buffer_blocker.unblock(); + } epoll_notify(EPOLLIN); - m_buffer_blocker.unblock(); - return true; } @@ -130,10 +132,10 @@ namespace Kernel m_buffer_size -= to_copy; m_buffer_tail = (m_buffer_tail + to_copy) % m_buffer->size(); - epoll_notify(EPOLLOUT); - m_buffer_lock.unlock(state); + epoll_notify(EPOLLOUT); + return to_copy; }