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 }