From f1e894aefd395b9be608e56998ff0a3cd4223f55 Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Thu, 5 Jun 2025 12:27:54 +0200 Subject: [PATCH] stream: read huge data in blocks on POSIX read() blocks when there is no more data to read. However, we do need to loop when read is divided into blocks. Signed-off-by: Simon Rozman --- include/stdex/stream.hpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/include/stdex/stream.hpp b/include/stdex/stream.hpp index e8dab8759..a35001429 100644 --- a/include/stdex/stream.hpp +++ b/include/stdex/stream.hpp @@ -2260,17 +2260,19 @@ namespace stdex reinterpret_cast(data) += num_read; } #else - auto num_read = ::read(m_h, data, length); - if (num_read < 0) _Unlikely_ { - m_state = state_t::fail; - return 0; + for (size_t to_read = length;;) { + auto num_read = ::read(m_h, data, std::min(to_read, SSIZE_MAX)); + if (num_read < 0) _Unlikely_ { + m_state = to_read < length ? state_t::ok : state_t::fail; + return length - to_read; + } + to_read -= static_cast(num_read); + if (num_read < SSIZE_MAX) { + m_state = to_read < length || !length ? state_t::ok : state_t::eof; + return length - to_read; + } + reinterpret_cast(data) += num_read; } - if (!num_read) _Unlikely_ { - m_state = !length ? state_t::ok : state_t::eof; - return 0; - } - m_state = state_t::ok; - return num_read; #endif }