diff -ru apt-0.7.20.2/apt-pkg/tagfile.cc apt-0.7.20.2+iPhone/apt-pkg/tagfile.cc
--- apt-0.7.20.2/apt-pkg/tagfile.cc	2009-04-19 02:42:49.000000000 +0000
+++ apt-0.7.20.2+iPhone/apt-pkg/tagfile.cc	2009-04-19 03:28:33.000000000 +0000
@@ -28,11 +28,12 @@
 // ---------------------------------------------------------------------
 /* */
 pkgTagFile::pkgTagFile(FileFd *pFd,unsigned long Size) :
-     Fd(*pFd),
-     Size(Size)
+     Fd(*pFd)
 {
-   if (Fd.IsOpen() == false)
+   if (Fd.IsOpen() == false || Fd.Size() == 0)
    {
+      _error->Discard();
+      Map = NULL;
       Buffer = 0;
       Start = End = Buffer = 0;
       Done = true;
@@ -40,7 +40,8 @@
       return;
    }
    
-   Buffer = new char[Size];
+   Map = new MMap(*pFd, MMap::ReadOnly);
+   Buffer = reinterpret_cast<char *>(Map->Data());
    Start = End = Buffer;
    Done = false;
    iOffset = 0;
@@ -52,36 +53,9 @@
 /* */
 pkgTagFile::~pkgTagFile()
 {
-   delete [] Buffer;
+   delete Map;
 }
 									/*}}}*/
-// TagFile::Resize - Resize the internal buffer				/*{{{*/
-// ---------------------------------------------------------------------
-/* Resize the internal buffer (double it in size). Fail if a maximum size
- * size is reached.
- */
-bool pkgTagFile::Resize()
-{
-   char *tmp;
-   unsigned long EndSize = End - Start;
-
-   // fail is the buffer grows too big
-   if(Size > 1024*1024+1)
-      return false;
-
-   // get new buffer and use it
-   tmp = new char[2*Size];
-   memcpy(tmp, Buffer, Size);
-   Size = Size*2;
-   delete [] Buffer;
-   Buffer = tmp;
-
-   // update the start/end pointers to the new buffer
-   Start = Buffer;
-   End = Start + EndSize;
-   return true;
-}
-									/*}}}*/
 // TagFile::Step - Advance to the next section				/*{{{*/
 // ---------------------------------------------------------------------
 /* If the Section Scanner fails we refill the buffer and try again. 
@@ -90,15 +64,11 @@
  */
 bool pkgTagFile::Step(pkgTagSection &Tag)
 {
-   while (Tag.Scan(Start,End - Start) == false)
+   if (Tag.Scan(Start,End - Start) == false)
    {
-      if (Fill() == false)
-	 return false;
-      
-      if(Tag.Scan(Start,End - Start))
-	 break;
-
-      if (Resize() == false)
+      if (Start == End)
+         return false;
+      else
 	 return _error->Error(_("Unable to parse package file %s (1)"),
 				 Fd.Name().c_str());
    }
@@ -115,41 +85,11 @@
    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;
-   }
-   
+   unsigned int Size(Map->Size());
+   End = Buffer + Size;
+   if (iOffset >= Size)
+      return false;
+   Start = Buffer + iOffset;
    return true;
 }
 									/*}}}*/
@@ -171,20 +111,11 @@
    // 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;
-   
    if (Tag.Scan(Start,End - Start) == false)
       return _error->Error(_("Unable to parse package file %s (2)"),Fd.Name().c_str());
    
@@ -228,14 +161,16 @@
 
       Stop = (const char *)memchr(Stop,'\n',End - Stop);
       
-      if (Stop == 0)
-	 return false;
+      if (Stop == 0) {
+         Stop = End;
+         goto end;
+      }
 
       for (; Stop+1 < End && Stop[1] == '\r'; Stop++);
 
       // Double newline marks the end of the record
-      if (Stop+1 < End && Stop[1] == '\n')
-      {
+      if (Stop+1 == End || Stop[1] == '\n')
+      end: {
 	 Indexes[TagCount] = Stop - Section;
 	 TrimRecord(false,End);
 	 return true;
diff -ru apt-0.7.20.2/apt-pkg/tagfile.h apt-0.7.20.2+iPhone/apt-pkg/tagfile.h
--- apt-0.7.20.2/apt-pkg/tagfile.h	2009-02-07 15:09:35.000000000 +0000
+++ apt-0.7.20.2+iPhone/apt-pkg/tagfile.h	2009-04-19 03:04:07.000000000 +0000
@@ -21,6 +21,7 @@
 #define PKGLIB_TAGFILE_H
 
 
+#include <apt-pkg/mmap.h>
 #include <apt-pkg/fileutl.h>
 #include <stdio.h>
     
@@ -71,10 +72,9 @@
    char *End;
    bool Done;
    unsigned long iOffset;
-   unsigned long Size;
+   MMap *Map;
 
    bool Fill();
-   bool Resize();
 
    public:
 
