X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/90d642804ca96ba640d2c2fbd0620b69670ee827..204fbdcce67a08d33a5e7eb3ca9e7a9ae80918c5:/apt-pkg/tagfile.cc diff --git a/apt-pkg/tagfile.cc b/apt-pkg/tagfile.cc index bdfa302d8..53e1e5e8b 100644 --- a/apt-pkg/tagfile.cc +++ b/apt-pkg/tagfile.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: tagfile.cc,v 1.21 1999/01/31 07:01:11 jgg Exp $ +// $Id: tagfile.cc,v 1.24 1999/02/22 03:30:06 jgg Exp $ /* ###################################################################### Fast scanner for RFC-822 type header information @@ -46,7 +46,7 @@ bool pkgTagFile::Step(pkgTagSection &Tag) return false; if (Tag.Scan(Start,End - Start) == false) - return _error->Error("Unable to parse package file %s",Fd.Name().c_str()); + return _error->Error("Unable to parse package file %s (1)",Fd.Name().c_str()); } Start += Tag.size(); iOffset += Tag.size(); @@ -116,11 +116,22 @@ bool pkgTagFile::Jump(pkgTagSection &Tag,unsigned long Offset) return false; End = Start = Buffer; + if (Fill() == false) + return false; + + if (Tag.Scan(Start,End - Start) == true) + return true; + + // This appends a double new line (for the real eof handling) if (Fill() == false) return false; if (Tag.Scan(Start,End - Start) == false) - return _error->Error("Unable to parse package file"); + { + cout << string(Start,End) << endl; + return _error->Error("Unable to parse package file %s (2)",Fd.Name().c_str()); + } + return true; } /*}}}*/ @@ -139,7 +150,7 @@ bool pkgTagSection::Scan(const char *Start,unsigned long MaxLength) return false; TagCount = 0; - while (TagCount < sizeof(Indexes)/sizeof(Indexes[0])) + while (TagCount < sizeof(Indexes)/sizeof(Indexes[0]) && Stop < End) { // Start a new index and add it to the hash if (isspace(Stop[0]) == 0) @@ -155,10 +166,11 @@ bool pkgTagSection::Scan(const char *Start,unsigned long MaxLength) if (Stop == 0) return false; + for (; Stop[1] == '\r' && Stop+1 < End; Stop++); - // Double newline or end of file marks the end of the record - if (Stop+1 >= End || Stop[1] == '\n') + // Double newline marks the end of the record + if (Stop+1 < End && Stop[1] == '\n') { Indexes[TagCount] = Stop - Section; for (; (Stop[0] == '\n' || Stop[0] == '\r') && Stop < End; Stop++); @@ -167,7 +179,7 @@ bool pkgTagSection::Scan(const char *Start,unsigned long MaxLength) Stop++; } - + return false; } /*}}}*/ @@ -203,9 +215,12 @@ bool pkgTagSection::Find(const char *Tag,const char *&Start, // Strip off the gunk from the start end Start = C; End = Section + Indexes[I+1]; + if (Start >= End) + return _error->Error("Internal parsing error"); + for (; (isspace(*Start) != 0 || *Start == ':') && Start < End; Start++); for (; isspace(End[-1]) != 0 && End > Start; End--); - + return true; } @@ -277,5 +292,3 @@ bool pkgTagSection::FindFlag(const char *Tag,unsigned long &Flags, return true; } /*}}}*/ - -