X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/afd7b358f94efddb83a2911ec1a21e7280074b1e..5674f6b3163d73260e25ce7d350aaac50071eb0e:/apt-pkg/deb/deblistparser.cc diff --git a/apt-pkg/deb/deblistparser.cc b/apt-pkg/deb/deblistparser.cc index a4a974897..7bef6772c 100644 --- a/apt-pkg/deb/deblistparser.cc +++ b/apt-pkg/deb/deblistparser.cc @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -25,6 +26,8 @@ #include /*}}}*/ +using std::string; + static debListParser::WordList PrioList[] = {{"important",pkgCache::State::Important}, {"required",pkgCache::State::Required}, {"standard",pkgCache::State::Standard}, @@ -71,10 +74,7 @@ string debListParser::Package() { // --------------------------------------------------------------------- /* This will return the Architecture of the package this section describes */ string debListParser::Architecture() { - std::string const Arch = Section.FindS("Architecture"); - if (Arch.empty() == true) - return _config->Find("APT::Architecture"); - return Arch; + return Section.FindS("Architecture"); } /*}}}*/ // ListParser::ArchitectureAll /*{{{*/ @@ -215,15 +215,22 @@ string debListParser::DescriptionLanguage() */ MD5SumValue debListParser::Description_md5() { - string value = Section.FindS("Description-md5"); - - if (value.empty()) + string const value = Section.FindS("Description-md5"); + if (value.empty() == true) { MD5Summation md5; md5.Add((Description() + "\n").c_str()); return md5.Result(); - } else - return MD5SumValue(value); + } + else if (likely(value.size() == 32)) + { + if (likely(value.find_first_not_of("0123456789abcdefABCDEF") == string::npos)) + return MD5SumValue(value); + _error->Error("Malformed Description-md5 line; includes invalid character '%s'", value.c_str()); + return MD5SumValue(); + } + _error->Error("Malformed Description-md5 line; doesn't have the required length (32 != %d) '%s'", (int)value.size(), value.c_str()); + return MD5SumValue(); } /*}}}*/ // ListParser::UsePackage - Update a package structure /*{{{*/ @@ -249,8 +256,14 @@ bool debListParser::UsePackage(pkgCache::PkgIterator &Pkg, return false; if (strcmp(Pkg.Name(),"apt") == 0) - Pkg->Flags |= pkgCache::Flag::Important; - + { + if ((essential == "native" && Pkg->Arch != 0 && myArch == Pkg.Arch()) || + essential == "all") + Pkg->Flags |= pkgCache::Flag::Essential | pkgCache::Flag::Important; + else + Pkg->Flags |= pkgCache::Flag::Important; + } + if (ParseStatus(Pkg,Ver) == false) return false; return true; @@ -522,9 +535,9 @@ const char *debListParser::ParseDepends(const char *Start,const char *Stop, // Skip whitespace for (;I != Stop && isspace(*I) != 0; I++); Start = I; - for (;I != Stop && *I != ')'; I++); - if (I == Stop || Start == I) - return 0; + I = (const char*) memchr(I, ')', Stop - I); + if (I == NULL || Start == I) + return 0; // Skip trailing whitespace const char *End = I; @@ -675,6 +688,9 @@ bool debListParser::ParseProvides(pkgCache::VerIterator &Ver) return _error->Error("Problem parsing Provides line"); if (Op != pkgCache::Dep::NoOp) { _error->Warning("Ignoring Provides line with DepCompareOp for package %s", Package.c_str()); + } else if ((Ver->MultiArch & pkgCache::Version::Foreign) == pkgCache::Version::Foreign) { + if (NewProvidesAllArch(Ver, Package, Version) == false) + return false; } else { if (NewProvides(Ver, Package, Arch, Version) == false) return false; @@ -770,6 +786,7 @@ bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator &FileI, // file. to provide Component pinning we use the section name now FileI->Component = WriteUniqString(component); + // FIXME: Code depends on the fact that Release files aren't compressed FILE* release = fdopen(dup(File.Fd()), "r"); if (release == NULL) return false; @@ -797,37 +814,32 @@ bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator &FileI, } // seperate the tag from the data - for (; buffer[len] != ':' && buffer[len] != '\0'; ++len) - /* nothing */ - ; - if (buffer[len] == '\0') + const char* dataStart = strchr(buffer + len, ':'); + if (dataStart == NULL) continue; - char* dataStart = buffer + len; + len = dataStart - buffer; for (++dataStart; *dataStart == ' '; ++dataStart) /* nothing */ ; - char* dataEnd = dataStart; - for (++dataEnd; *dataEnd != '\0'; ++dataEnd) - /* nothing */ - ; + const char* dataEnd = (const char*)rawmemchr(dataStart, '\0'); // The last char should be a newline, but we can never be sure: #633350 - char* lineEnd = dataEnd; + const char* lineEnd = dataEnd; for (--lineEnd; *lineEnd == '\r' || *lineEnd == '\n'; --lineEnd) /* nothing */ ; ++lineEnd; // which datastorage need to be updated - map_ptrloc* writeTo = NULL; + enum { Suite, Component, Version, Origin, Codename, Label, None } writeTo = None; if (buffer[0] == ' ') ; - #define APT_PARSER_WRITETO(X, Y) else if (strncmp(Y, buffer, len) == 0) writeTo = &X; - APT_PARSER_WRITETO(FileI->Archive, "Suite") - APT_PARSER_WRITETO(FileI->Component, "Component") - APT_PARSER_WRITETO(FileI->Version, "Version") - APT_PARSER_WRITETO(FileI->Origin, "Origin") - APT_PARSER_WRITETO(FileI->Codename, "Codename") - APT_PARSER_WRITETO(FileI->Label, "Label") + #define APT_PARSER_WRITETO(X) else if (strncmp(#X, buffer, len) == 0) writeTo = X; + APT_PARSER_WRITETO(Suite) + APT_PARSER_WRITETO(Component) + APT_PARSER_WRITETO(Version) + APT_PARSER_WRITETO(Origin) + APT_PARSER_WRITETO(Codename) + APT_PARSER_WRITETO(Label) #undef APT_PARSER_WRITETO #define APT_PARSER_FLAGIT(X) else if (strncmp(#X, buffer, len) == 0) \ pkgTagSection::FindFlag(FileI->Flags, pkgCache::Flag:: X, dataStart, lineEnd); @@ -837,19 +849,19 @@ bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator &FileI, // load all data from the line and save it string data; - if (writeTo != NULL) + if (writeTo != None) data.append(dataStart, dataEnd); if (sizeof(buffer) - 1 == (dataEnd - buffer)) { while (fgets(buffer, sizeof(buffer), release) != NULL) { - if (writeTo != NULL) + if (writeTo != None) data.append(buffer); if (strlen(buffer) != sizeof(buffer) - 1) break; } } - if (writeTo != NULL) + if (writeTo != None) { // remove spaces and stuff from the end of the data line for (std::string::reverse_iterator s = data.rbegin(); @@ -859,7 +871,15 @@ bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator &FileI, break; *s = '\0'; } - *writeTo = WriteUniqString(data); + switch (writeTo) { + case Suite: FileI->Archive = WriteUniqString(data); break; + case Component: FileI->Component = WriteUniqString(data); break; + case Version: FileI->Version = WriteUniqString(data); break; + case Origin: FileI->Origin = WriteUniqString(data); break; + case Codename: FileI->Codename = WriteUniqString(data); break; + case Label: FileI->Label = WriteUniqString(data); break; + case None: break; + } } } fclose(release);