X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/2658e1c5487d0bb9c6223cf149a48f47e8d10b4d..a9024b1be2e26c3c6b1f67093ddbf7602636ec9f:/apt-pkg/contrib/fileutl.cc 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(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;