diff options
| author | Julian Andres Klode <jak@debian.org> | 2021-06-09 09:35:44 +0000 |
|---|---|---|
| committer | Julian Andres Klode <jak@debian.org> | 2021-06-09 09:35:44 +0000 |
| commit | 416d468b84eb432ef1cbe7d3e80955bbdef035c7 (patch) | |
| tree | 76d8caf99645fce37adc593ab4ae9c208b2d1945 /apt-pkg/deb | |
| parent | aeae140b11220c8ca3692ef690bc51578f197992 (diff) | |
| parent | a2406cda4dd0aca523183ed6a8b651f06e0e63f9 (diff) | |
Merge branch 'fix/uriencodefilename' into 'main'
URI encode filename fields (again)
See merge request apt-team/apt!175
Diffstat (limited to 'apt-pkg/deb')
| -rw-r--r-- | apt-pkg/deb/debsrcrecords.cc | 30 |
1 files changed, 14 insertions, 16 deletions
diff --git a/apt-pkg/deb/debsrcrecords.cc b/apt-pkg/deb/debsrcrecords.cc index 89f3f1667..1fd0fdc12 100644 --- a/apt-pkg/deb/debsrcrecords.cc +++ b/apt-pkg/deb/debsrcrecords.cc @@ -23,6 +23,7 @@ #include <algorithm> #include <string> +#include <sstream> #include <vector> #include <ctype.h> #include <stdlib.h> @@ -170,6 +171,7 @@ bool debSrcRecordParser::Files(std::vector<pkgSrcRecords::File> &List) std::vector<std::string> const compExts = APT::Configuration::getCompressorExtensions(); + auto const &posix = std::locale::classic(); for (char const * const * type = HashString::SupportedHashes(); *type != NULL; ++type) { // derive field from checksum type @@ -182,27 +184,23 @@ bool debSrcRecordParser::Files(std::vector<pkgSrcRecords::File> &List) string const Files = Sect.FindS(checksumField.c_str()); if (Files.empty() == true) continue; + std::istringstream ss(Files); + ss.imbue(posix); - // Iterate over the entire list grabbing each triplet - const char *C = Files.c_str(); - while (*C != 0) + while (ss.good()) { - string hash, size, path; - - // Parse each of the elements - if (ParseQuoteWord(C, hash) == false || - ParseQuoteWord(C, size) == false || - ParseQuoteWord(C, path) == false) - return _error->Error("Error parsing file record in %s of source package %s", checksumField.c_str(), Package().c_str()); - + std::string hash, path; + unsigned long long size; if (iIndex == nullptr && checksumField == "Files") { - // the Files field has a different format than the rest in deb-changes files std::string ignore; - if (ParseQuoteWord(C, ignore) == false || - ParseQuoteWord(C, path) == false) - return _error->Error("Error parsing file record in %s of source package %s", checksumField.c_str(), Package().c_str()); + ss >> hash >> size >> ignore >> ignore >> path; } + else + ss >> hash >> size >> path; + + if (ss.fail() || hash.empty() || path.empty()) + return _error->Error("Error parsing file record in %s of source package %s", checksumField.c_str(), Package().c_str()); HashString const hashString(*type, hash); if (Base.empty() == false) @@ -226,7 +224,7 @@ bool debSrcRecordParser::Files(std::vector<pkgSrcRecords::File> &List) // we haven't seen this file yet pkgSrcRecords::File F; F.Path = path; - F.FileSize = strtoull(size.c_str(), NULL, 10); + F.FileSize = size; F.Hashes.push_back(hashString); F.Hashes.FileSize(F.FileSize); |
