diff options
-rw-r--r-- | apt-pkg/contrib/fileutl.cc | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc index c4ff36a13..aa5831f58 100644 --- a/apt-pkg/contrib/fileutl.cc +++ b/apt-pkg/contrib/fileutl.cc @@ -932,7 +932,7 @@ protected: bool empty() { return bufferend <= bufferstart; } unsigned long long size() { return bufferend-bufferstart; } void reset() { bufferend = bufferstart = 0; } - ssize_t read(void *to, unsigned long long requested_size) + ssize_t read(void *to, unsigned long long requested_size) APT_MUSTCHECK { if (size() < requested_size) requested_size = size(); @@ -995,19 +995,15 @@ public: unsigned long long const OutputSize = std::min(Size, buffer.size()); char const * const newline = static_cast<char const * const>(memchr(buffer.get(), '\n', OutputSize)); + // Read until end of line or up to Size bytes from the buffer. + unsigned long long actualread = buffer.read(To, + (newline != nullptr) + ? (newline - buffer.get()) + 1 + : OutputSize); + To += actualread; + Size -= actualread; if (newline != nullptr) - { - size_t length = (newline - buffer.get()) + 1; - buffer.read(To, length); - To += length; break; - } - else - { - buffer.read(To, OutputSize); - To += OutputSize; - Size -= OutputSize; - } } while (Size > 0); *To = '\0'; return InitialTo; |