tags 350025 + patch stop The problem is caused because I have a package with a status entry larger then 32k.
Attached is a patch which fixes the problem by the expedient of using mmap instead of a sliding buffer, it has been tempted and works fine. Note, the constructor still has a size argument, it's just not used. I didn't want to change the API, I'll leave that bit of cleanup to the apt maintainers. Thanks. -- 1024D/E65A7801 Zephaniah E. Hull <[EMAIL PROTECTED]> 92ED 94E4 B1E6 3624 226D 5727 4453 008B E65A 7801 CCs of replies from mailing lists are requested. "<green>From</yellow>" "Wow. The green word From is no longer yellow. That's deep, man." -- Marcus Meissner & Lars Balker Rasmussen in the Scary Devil Monastery
diff -ur orig/apt-0.6.43.2/apt-pkg/tagfile.cc apt-0.6.43.2/apt-pkg/tagfile.cc --- orig/apt-0.6.43.2/apt-pkg/tagfile.cc 2005-10-19 15:19:08.000000000 -0400 +++ apt-0.6.43.2/apt-pkg/tagfile.cc 2006-01-27 21:06:14.000000000 -0500 @@ -35,20 +35,20 @@ Fd(*pFd), Size(Size) { - if (Fd.IsOpen() == false) + if (Fd.IsOpen() == false || Fd.Size() == 0) { Buffer = 0; Start = End = Buffer = 0; - Done = true; iOffset = 0; + Map = NULL; return; } - Buffer = new char[Size]; - Start = End = Buffer; - Done = false; + Map = new MMap (Fd, MMap::Public | MMap::ReadOnly); + Buffer = (char *) Map->Data (); + Start = Buffer; + End = Buffer + Map->Size (); iOffset = 0; - Fill(); } /*}}}*/ // TagFile::~pkgTagFile - Destructor /*{{{*/ @@ -56,7 +56,7 @@ /* */ pkgTagFile::~pkgTagFile() { - delete [] Buffer; + delete Map; } /*}}}*/ // TagFile::Step - Advance to the next section /*{{{*/ @@ -64,14 +64,13 @@ /* If the Section Scanner fails we refill the buffer and try again. */ bool pkgTagFile::Step(pkgTagSection &Tag) { + if (Start == End) + return false; + if (Tag.Scan(Start,End - Start) == false) { - if (Fill() == false) - return false; - - if (Tag.Scan(Start,End - Start) == false) - return _error->Error(_("Unable to parse package file %s (1)"), - Fd.Name().c_str()); + return _error->Error(_("Unable to parse package file %s (1)"), + Fd.Name().c_str()); } Start += Tag.size(); iOffset += Tag.size(); @@ -80,50 +79,6 @@ return true; } /*}}}*/ -// TagFile::Fill - Top up the buffer /*{{{*/ -// --------------------------------------------------------------------- -/* This takes the bit at the end of the buffer and puts it at the start - then fills the rest from the file */ -bool pkgTagFile::Fill() -{ - unsigned long EndSize = End - Start; - unsigned long Actual = 0; - - memmove(Buffer,Start,EndSize); - Start = Buffer; - End = Buffer + EndSize; - - if (Done == false) - { - // See if only a bit of the file is left - if (Fd.Read(End,Size - (End - Buffer),&Actual) == false) - return false; - if (Actual != Size - (End - Buffer)) - Done = true; - End += Actual; - } - - if (Done == true) - { - if (EndSize <= 3 && Actual == 0) - return false; - if (Size - (End - Buffer) < 4) - return true; - - // Append a double new line if one does not exist - unsigned int LineCount = 0; - for (const char *E = End - 1; E - End < 6 && (*E == '\n' || *E == '\r'); E--) - if (*E == '\n') - LineCount++; - for (; LineCount < 2; LineCount++) - *End++ = '\n'; - - return true; - } - - return true; -} - /*}}}*/ // TagFile::Jump - Jump to a pre-recorded location in the file /*{{{*/ // --------------------------------------------------------------------- /* This jumps to a pre-recorded file location and reads the record @@ -141,20 +96,7 @@ // Reposition and reload.. iOffset = Offset; - Done = false; - if (Fd.Seek(Offset) == false) - 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; + Start = Buffer + iOffset; if (Tag.Scan(Start,End - Start) == false) return _error->Error(_("Unable to parse package file %s (2)"),Fd.Name().c_str()); @@ -181,7 +123,7 @@ Stop = Section = Start; memset(AlphaIndexes,0,sizeof(AlphaIndexes)); - if (Stop == 0) + if (Stop == 0 || MaxLength == 0) return false; TagCount = 0; @@ -212,6 +154,12 @@ Stop++; } + if ((Stop+1 >= End) && (End[-1] == '\n' || End[-1] == '\r')) + { + Indexes[TagCount] = (End - 1) - Section; + return true; + } + return false; } /*}}}*/ diff -ur orig/apt-0.6.43.2/apt-pkg/tagfile.h apt-0.6.43.2/apt-pkg/tagfile.h --- orig/apt-0.6.43.2/apt-pkg/tagfile.h 2005-10-19 15:19:08.000000000 -0400 +++ apt-0.6.43.2/apt-pkg/tagfile.h 2006-01-27 20:22:47.000000000 -0500 @@ -25,6 +25,7 @@ #endif #include <apt-pkg/fileutl.h> +#include <apt-pkg/mmap.h> #include <stdio.h> class pkgTagSection @@ -69,15 +70,13 @@ class pkgTagFile { FileFd &Fd; + MMap *Map; char *Buffer; char *Start; char *End; - bool Done; unsigned long iOffset; unsigned long Size; - bool Fill(); - public: bool Step(pkgTagSection &Section);
signature.asc
Description: Digital signature