summaryrefslogtreecommitdiff
path: root/ftparchive/sources.cc
diff options
context:
space:
mode:
authorDavid Kalnischkies <david@kalnischkies.de>2015-01-09 01:03:31 +0100
committerDavid Kalnischkies <david@kalnischkies.de>2015-01-10 13:31:14 +0100
commit31be38d205406d4c756684e20b93d62c4701e091 (patch)
tree2a909c180563e5e662a7578ed162b0d6401d9a96 /ftparchive/sources.cc
parentd13f2ef5dd2cf41d7abd7f309a9e8965a77d2a63 (diff)
128 KiB DSC files ought to be enough for everyone
Your mileage may vary, but don't worry: There is more than one way to do it, but our one size fits all is not a bigger hammer, but an entire roundhouse kick! So brace yourself for the tl;dr: The limit is gone.* Beware: This fixes also the problem that a double newline is unconditionally added 'later' which is an overcommitment in case the dsc filesize is limit-2 <= x <= limit. * limited to numbers fitting into an unsigned long long. Closes: 774893
Diffstat (limited to 'ftparchive/sources.cc')
-rw-r--r--ftparchive/sources.cc41
1 files changed, 27 insertions, 14 deletions
diff --git a/ftparchive/sources.cc b/ftparchive/sources.cc
index d0878a70a..ab976b490 100644
--- a/ftparchive/sources.cc
+++ b/ftparchive/sources.cc
@@ -1,5 +1,5 @@
#include <string>
-#include <iostream>
+#include <sstream>
// for memcpy
#include <cstring>
@@ -9,17 +9,19 @@
#include "sources.h"
-bool DscExtract::TakeDsc(const void *newData, unsigned long newSize)
+bool DscExtract::TakeDsc(const void *newData, unsigned long long newSize)
{
- if(newSize > maxSize)
- return _error->Error("DSC data is too large %lu!", newSize);
-
if (newSize == 0)
{
+ // adding two newlines 'off record' for pkgTagSection.Scan() calls
+ Data = "\n\n";
Length = 0;
return true;
}
- memcpy(Data, newData, newSize);
+
+ Data = std::string((const char*)newData, newSize);
+ // adding two newlines 'off record' for pkgTagSection.Scan() calls
+ Data.append("\n\n");
Length = newSize;
return true;
@@ -27,20 +29,31 @@ bool DscExtract::TakeDsc(const void *newData, unsigned long newSize)
bool DscExtract::Read(std::string FileName)
{
+ Data.clear();
+ Length = 0;
+
FileFd F;
if (OpenMaybeClearSignedFile(FileName, F) == false)
return false;
-
- unsigned long long const FSize = F.FileSize();
- if(FSize > maxSize)
- return _error->Error("DSC file '%s' is too large!",FileName.c_str());
-
- if (F.Read(Data, FSize) == false)
- return false;
- Length = FSize;
IsClearSigned = (FileName != F.Name());
+ std::ostringstream data;
+ char buffer[1024];
+ do {
+ unsigned long long actual = 0;
+ if (F.Read(buffer, sizeof(buffer)-1, &actual) == false)
+ return _error->Errno("read", "Failed to read dsc file %s", FileName.c_str());
+ if (actual == 0)
+ break;
+ Length += actual;
+ buffer[actual] = '\0';
+ data << buffer;
+ } while(true);
+
+ // adding two newlines 'off record' for pkgTagSection.Scan() calls
+ data << "\n\n";
+ Data = data.str();
return true;
}