From f2846e8e08e03699399eb4262d34d5835552ce97 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 1 Feb 2020 09:43:28 +0100 Subject: [PATCH] Kernel: Allow short writes to DoubleBuffer DoubleBuffer is the internal buffer for things like TTY, FIFO, sockets, etc. If you try to write more than the buffer can hold, it will now do a short write instead of asserting. This is likely to expose issues at higher levels, and we'll have to deal with them as they are discovered. --- Kernel/DoubleBuffer.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Kernel/DoubleBuffer.cpp b/Kernel/DoubleBuffer.cpp index 43941cf999..daefb98be5 100644 --- a/Kernel/DoubleBuffer.cpp +++ b/Kernel/DoubleBuffer.cpp @@ -59,19 +59,21 @@ ssize_t DoubleBuffer::write(const u8* data, ssize_t size) { if (!size) return 0; + ASSERT(size > 0); LOCKER(m_lock); - ASSERT(size <= (ssize_t)space_for_writing()); + ssize_t bytes_to_write = min(static_cast(size), m_space_for_writing); u8* write_ptr = m_write_buffer->data + m_write_buffer->size; - m_write_buffer->size += size; + m_write_buffer->size += bytes_to_write; compute_lockfree_metadata(); - memcpy(write_ptr, data, size); - return size; + memcpy(write_ptr, data, bytes_to_write); + return bytes_to_write; } ssize_t DoubleBuffer::read(u8* data, ssize_t size) { if (!size) return 0; + ASSERT(size > 0); LOCKER(m_lock); if (m_read_buffer_index >= m_read_buffer->size && m_write_buffer->size != 0) flip();