diff options
author | David Kalnischkies <kalnischkies@gmail.com> | 2013-07-18 19:22:29 +0200 |
---|---|---|
committer | David Kalnischkies <kalnischkies@gmail.com> | 2013-07-18 21:30:47 +0200 |
commit | 922f07986b93ce7866f89917e3a475e6a4b3941c (patch) | |
tree | 7b162bb3cc2365e0bf2cb10d5d87671e498abb2d /cmdline | |
parent | 61843f539513b3e661dac55717e6d7cc0b8f9b0c (diff) |
fix 'apt-cache search' crash with missing description
Beside the earlier fixed 'apt-cache show', 'showpkg' and 'search' deal
with descriptions. 'showpkg' was fixed by fixing the cache generation
for 'show', but 'search' still segfaulted.
On the upside, it doesn't segfault any longer, on the downside, if a
package has no description at all (aka: not in the Packages file and not
in a Translation-* file) the package can't be found with 'search', even
if we search only by name. That is a shortcoming in the code, but fixing
it means rewriting it completely for dubious gain at best.
So this commit just skips packages without a description and is done.
Closes: 647590
Diffstat (limited to 'cmdline')
-rw-r--r-- | cmdline/apt-cache.cc | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/cmdline/apt-cache.cc b/cmdline/apt-cache.cc index 336ac544b..5d1ee5615 100644 --- a/cmdline/apt-cache.cc +++ b/cmdline/apt-cache.cc @@ -1130,12 +1130,14 @@ bool Dotty(CommandLine &CmdL) static unsigned char const* skipDescriptionFields(unsigned char const * DescP) { + char const * const TagName = "\nDescription"; + size_t const TagLen = strlen(TagName); while ((DescP = (unsigned char*)strchr((char*)DescP, '\n')) != NULL) { if (DescP[1] == ' ') DescP += 2; - else if (strncmp((char*)DescP, "\nDescription", strlen("\nDescription")) == 0) - DescP += strlen("\nDescription"); + else if (strncmp((char*)DescP, TagName, TagLen) == 0) + DescP += TagLen; else break; } @@ -1166,11 +1168,12 @@ bool DisplayRecord(pkgCacheFile &CacheFile, pkgCache::VerIterator V) if (PkgF.Open(I.FileName(), FileFd::ReadOnly, FileFd::Extension) == false) return false; - // Read the record - unsigned char *Buffer = new unsigned char[Cache->HeaderP->MaxVerFileSize+1]; - Buffer[V.FileList()->Size] = '\n'; - if (PkgF.Seek(V.FileList()->Offset) == false || - PkgF.Read(Buffer,V.FileList()->Size) == false) + // Read the record (and ensure that it ends with a newline and NUL) + unsigned char *Buffer = new unsigned char[Cache->HeaderP->MaxVerFileSize+2]; + Buffer[Vf->Size] = '\n'; + Buffer[Vf->Size+1] = '\0'; + if (PkgF.Seek(Vf->Offset) == false || + PkgF.Read(Buffer,Vf->Size) == false) { delete [] Buffer; return false; @@ -1181,7 +1184,7 @@ bool DisplayRecord(pkgCacheFile &CacheFile, pkgCache::VerIterator V) if (DescP != NULL) ++DescP; else - DescP = Buffer + V.FileList()->Size; + DescP = Buffer + Vf->Size; // Write all but Description if (fwrite(Buffer,1,DescP - Buffer,stdout) < (size_t)(DescP - Buffer)) @@ -1211,7 +1214,7 @@ bool DisplayRecord(pkgCacheFile &CacheFile, pkgCache::VerIterator V) const unsigned char *End = (unsigned char*)strstr((char*)DescP, "\nDescription"); if (End == NULL) { - End = &Buffer[V.FileList()->Size]; + End = &Buffer[Vf->Size]; DescP = NULL; } else @@ -1318,7 +1321,11 @@ bool Search(CommandLine &CmdL) pkgCache::VerIterator V = Plcy->GetCandidateVer(P); if (V.end() == false) { - DFList[G->ID].Df = V.TranslatedDescription().FileList(); + pkgCache::DescIterator const D = V.TranslatedDescription(); + //FIXME: packages without a description can't be found + if (D.end() == true) + continue; + DFList[G->ID].Df = D.FileList(); DFList[G->ID].ID = G->ID; } @@ -1333,7 +1340,11 @@ bool Search(CommandLine &CmdL) continue; unsigned long id = Prv.OwnerPkg().Group()->ID; - DFList[id].Df = V.TranslatedDescription().FileList(); + pkgCache::DescIterator const D = V.TranslatedDescription(); + //FIXME: packages without a description can't be found + if (D.end() == true) + continue; + DFList[id].Df = D.FileList(); DFList[id].ID = id; size_t const PrvPatternOffset = id * NumPatterns; |