From 100112134d52437b6ad3ab9e0f1edc1f39f9361c Mon Sep 17 00:00:00 2001 From: Tim Schumacher Date: Sun, 8 Jan 2023 21:57:16 +0100 Subject: [PATCH] LibCore: Allow zero-sized spans in `Stream::*_entire_buffer` There is no particular reason why we shouldn't allow zero-sized reads or writes here, and this actually might cause issues with our common stream-to-stream copy pattern if we end up at an unfortunate offset where the next read would be zero-sized and trigger EOF only after that. --- Userland/Libraries/LibCore/Stream.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/Userland/Libraries/LibCore/Stream.cpp b/Userland/Libraries/LibCore/Stream.cpp index 6e328b791d..9d9292ccaa 100644 --- a/Userland/Libraries/LibCore/Stream.cpp +++ b/Userland/Libraries/LibCore/Stream.cpp @@ -24,10 +24,8 @@ namespace Core::Stream { ErrorOr Stream::read_entire_buffer(Bytes buffer) { - VERIFY(buffer.size()); - size_t nread = 0; - do { + while (nread < buffer.size()) { if (is_eof()) return Error::from_string_literal("Reached end-of-file before filling the entire buffer"); @@ -41,7 +39,7 @@ ErrorOr Stream::read_entire_buffer(Bytes buffer) } nread += result.value().size(); - } while (nread < buffer.size()); + } return {}; } @@ -93,10 +91,8 @@ ErrorOr Stream::discard(size_t discarded_bytes) ErrorOr Stream::write_entire_buffer(ReadonlyBytes buffer) { - VERIFY(buffer.size()); - size_t nwritten = 0; - do { + while (nwritten < buffer.size()) { auto result = write(buffer.slice(nwritten)); if (result.is_error()) { if (result.error().is_errno() && result.error().code() == EINTR) { @@ -107,7 +103,7 @@ ErrorOr Stream::write_entire_buffer(ReadonlyBytes buffer) } nwritten += result.value(); - } while (nwritten < buffer.size()); + } return {}; }