summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/contrib/fileutl.cc37
1 files changed, 22 insertions, 15 deletions
diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc
index 1e0f4dc34..9b3618082 100644
--- a/apt-pkg/contrib/fileutl.cc
+++ b/apt-pkg/contrib/fileutl.cc
@@ -922,8 +922,8 @@ bool ChangeOwnerAndPermissionOfFile(char const * const requester, char const * c
class FileFdPrivate { /*{{{*/
protected:
FileFd * const filefd;
- static size_t constexpr buffersize_max = 1024;
- char buffer[buffersize_max];
+ size_t buffersize_max = 0;
+ std::unique_ptr<char> buffer;
unsigned long long buffersize = 0;
public:
int compressed_fd;
@@ -932,7 +932,7 @@ public:
APT::Configuration::Compressor compressor;
unsigned int openmode;
unsigned long long seekpos;
- FileFdPrivate(FileFd * const pfilefd) : filefd(pfilefd),
+ FileFdPrivate(FileFd * const pfilefd) : filefd(pfilefd), buffer(nullptr),
compressed_fd(-1), compressor_pid(-1), is_pipe(false),
openmode(0), seekpos(0) {};
@@ -944,7 +944,7 @@ public:
{
if (buffersize >= Size)
{
- memcpy(To, buffer, Size);
+ memcpy(To, buffer.get(), Size);
if (buffersize == Size)
{
buffersize = 0;
@@ -952,13 +952,13 @@ public:
else
{
buffersize -= Size;
- memmove(buffer, buffer + Size, buffersize);
+ memmove(buffer.get(), buffer.get() + Size, buffersize);
}
return Size;
}
else
{
- memcpy(To, buffer, buffersize);
+ memcpy(To, buffer.get(), buffersize);
Size -= buffersize;
To = static_cast<char *>(To) + buffersize;
tmp = buffersize;
@@ -982,12 +982,19 @@ public:
do {
if (buffersize == 0)
{
+ if (buffer.get() == nullptr)
+ {
+ buffer.reset(new char[Size]);
+ buffersize_max = Size;
+ }
unsigned long long actualread = 0;
- if (filefd->Read(buffer, buffersize_max, &actualread) == false)
+ if (filefd->Read(buffer.get(), buffersize_max, &actualread) == false)
return nullptr;
buffersize = actualread;
if (buffersize == 0)
{
+ buffer.reset(nullptr);
+ buffersize_max = 0;
if (To == InitialTo)
return nullptr;
break;
@@ -996,17 +1003,17 @@ public:
}
unsigned long long const OutputSize = std::min(Size, buffersize);
- char const * const newline = static_cast<char const * const>(memchr(buffer, '\n', OutputSize));
+ char const * const newline = static_cast<char const * const>(memchr(buffer.get(), '\n', OutputSize));
if (newline != nullptr)
{
- size_t length = (newline - buffer);
+ size_t length = (newline - buffer.get());
++length;
- memcpy(To, buffer, length);
+ memcpy(To, buffer.get(), length);
To += length;
if (length < buffersize)
{
buffersize -= length;
- memmove(buffer, buffer + length, buffersize);
+ memmove(buffer.get(), buffer.get() + length, buffersize);
}
else
buffersize = 0;
@@ -1014,11 +1021,11 @@ public:
}
else
{
- memcpy(To, buffer, OutputSize);
+ memcpy(To, buffer.get(), OutputSize);
To += OutputSize;
Size -= OutputSize;
buffersize -= OutputSize;
- memmove(buffer, buffer + OutputSize, buffersize);
+ memmove(buffer.get(), buffer.get() + OutputSize, buffersize);
}
} while (Size > 0);
*To = '\0';
@@ -1176,7 +1183,7 @@ public:
else
{
buffersize -= Over;
- memmove(buffer, buffer + Over, buffersize);
+ memmove(buffer.get(), buffer.get() + Over, buffersize);
return true;
}
if (Over == 0)
@@ -1649,7 +1656,7 @@ public:
else
{
buffersize -= Over;
- memmove(buffer, buffer + Over, buffersize);
+ memmove(buffer.get(), buffer.get() + Over, buffersize);
return true;
}
if (Over == 0)