X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/343325f4cc460b709fc929f85bc2a3d4691d63fe..422a2eba84361a8dfd84b549c13037512779c572:/apt-pkg/deb/debsrcrecords.cc diff --git a/apt-pkg/deb/debsrcrecords.cc b/apt-pkg/deb/debsrcrecords.cc index 97f43aca2..d296161d6 100644 --- a/apt-pkg/deb/debsrcrecords.cc +++ b/apt-pkg/deb/debsrcrecords.cc @@ -32,6 +32,24 @@ using std::max; using std::string; +debSrcRecordParser::debSrcRecordParser(std::string const &File,pkgIndexFile const *Index) + : Parser(Index), d(NULL), Tags(&Fd), iOffset(0), Buffer(NULL) +{ + if (File.empty() == false) + { + if (Fd.Open(File, FileFd::ReadOnly, FileFd::Extension)) + Tags.Init(&Fd, 102400); + } +} +std::string debSrcRecordParser::Package() const /*{{{*/ +{ + auto const name = Sect.FindS("Package"); + if (iIndex == nullptr) + return name.empty() ? Sect.FindS("Source") : name; + else + return name; +} + /*}}}*/ // SrcRecordParser::Binaries - Return the binaries field /*{{{*/ // --------------------------------------------------------------------- /* This member parses the binaries field into a pair of class arrays and @@ -44,7 +62,7 @@ const char **debSrcRecordParser::Binaries() const char *Start, *End; if (Sect.Find("Binary", Start, End) == false) return NULL; - for (; isspace(*Start) != 0; ++Start); + for (; isspace_ascii(*Start) != 0; ++Start); if (Start >= End) return NULL; @@ -55,14 +73,17 @@ const char **debSrcRecordParser::Binaries() char* bin = Buffer; do { char* binStartNext = strchrnul(bin, ','); - char* binEnd = binStartNext - 1; - for (; isspace(*binEnd) != 0; --binEnd) - binEnd = 0; + // Found a comma, clean up any space before it + if (binStartNext > Buffer) { + char* binEnd = binStartNext - 1; + for (; binEnd > Buffer && isspace_ascii(*binEnd) != 0; --binEnd) + *binEnd = 0; + } StaticBinList.push_back(bin); if (*binStartNext != ',') break; *binStartNext = '\0'; - for (bin = binStartNext + 1; isspace(*bin) != 0; ++bin) + for (bin = binStartNext + 1; isspace_ascii(*bin) != 0; ++bin) ; } while (*bin != '\0'); StaticBinList.push_back(NULL); @@ -121,9 +142,32 @@ bool debSrcRecordParser::BuildDepends(std::vector &List) +bool debSrcRecordParser::Files(std::vector &F) { - List.erase(List.begin(),List.end()); + std::vector F2; + if (Files2(F2) == false) + return false; + for (std::vector::const_iterator f2 = F2.begin(); f2 != F2.end(); ++f2) + { + pkgSrcRecords::File2 f; +#if __GNUC__ >= 4 + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + f.MD5Hash = f2->MD5Hash; + f.Size = f2->Size; +#if __GNUC__ >= 4 + #pragma GCC diagnostic pop +#endif + f.Path = f2->Path; + f.Type = f2->Type; + F.push_back(f); + } + return true; +} +bool debSrcRecordParser::Files2(std::vector &List) +{ + List.clear(); // Stash the / terminated directory prefix string Base = Sect.FindS("Directory"); @@ -157,12 +201,21 @@ bool debSrcRecordParser::Files(std::vector &List) ParseQuoteWord(C, path) == false) return _error->Error("Error parsing file record in %s of source package %s", checksumField.c_str(), Package().c_str()); + 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()); + } + HashString const hashString(*type, hash); if (Base.empty() == false) path = Base + path; // look if we have a record for this file already - std::vector::iterator file = List.begin(); + std::vector::iterator file = List.begin(); for (; file != List.end(); ++file) if (file->Path == path) break; @@ -170,16 +223,8 @@ bool debSrcRecordParser::Files(std::vector &List) // we have it already, store the new hash and be done if (file != List.end()) { -#if __GNUC__ >= 4 - // set for compatibility only, so warn users not us - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif if (checksumField == "Files") - file->MD5Hash = hash; -#if __GNUC__ >= 4 - #pragma GCC diagnostic pop -#endif + APT_IGNORE_DEPRECATED(file->MD5Hash = hash;) // an error here indicates that we have two different hashes for the same file if (file->Hashes.push_back(hashString) == false) return _error->Error("Error parsing checksum in %s of source package %s", checksumField.c_str(), Package().c_str()); @@ -187,21 +232,17 @@ bool debSrcRecordParser::Files(std::vector &List) } // we haven't seen this file yet - pkgSrcRecords::File F; + pkgSrcRecords::File2 F; F.Path = path; - F.Size = strtoull(size.c_str(), NULL, 10); + F.FileSize = strtoull(size.c_str(), NULL, 10); F.Hashes.push_back(hashString); + F.Hashes.FileSize(F.FileSize); -#if __GNUC__ >= 4 - // set for compatibility only, so warn users not us - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif + APT_IGNORE_DEPRECATED_PUSH + F.Size = F.FileSize; if (checksumField == "Files") F.MD5Hash = hash; -#if __GNUC__ >= 4 - #pragma GCC diagnostic pop -#endif + APT_IGNORE_DEPRECATED_POP // Try to guess what sort of file it is we are getting. string::size_type Pos = F.Path.length()-1; @@ -246,7 +287,7 @@ debSrcRecordParser::~debSrcRecordParser() debDscRecordParser::debDscRecordParser(std::string const &DscFile, pkgIndexFile const *Index) - : debSrcRecordParser(DscFile, Index) + : debSrcRecordParser("", Index) { // support clear signed files if (OpenMaybeClearSignedFile(DscFile, Fd) == false) @@ -256,7 +297,7 @@ debDscRecordParser::debDscRecordParser(std::string const &DscFile, pkgIndexFile } // re-init to ensure the updated Fd is used - Tags.Init(&Fd); + Tags.Init(&Fd, pkgTagFile::SUPPORT_COMMENTS); // read the first (and only) record Step();