Sfoglia il codice sorgente

* merged from apt--mvo

Michael Vogt 20 anni fa
parent
commit
591c8c170e
5 ha cambiato i file con 46 aggiunte e 10 eliminazioni
  1. 37 4
      apt-pkg/tagfile.cc
  2. 4 3
      apt-pkg/tagfile.h
  3. 1 1
      configure.in
  4. 3 1
      debian/changelog
  5. 1 1
      methods/gzip.cc

+ 37 - 4
apt-pkg/tagfile.cc

@@ -59,19 +59,52 @@ pkgTagFile::~pkgTagFile()
    delete [] Buffer;
 }
 									/*}}}*/
+// 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. */
+/* If the Section Scanner fails we refill the buffer and try again. 
+ * If that fails too, double the buffer size and try again until a
+ * maximum buffer is reached.
+ */
 bool pkgTagFile::Step(pkgTagSection &Tag)
 {
-   if (Tag.Scan(Start,End - Start) == false)
+   while (Tag.Scan(Start,End - Start) == false)
    {
       if (Fill() == false)
 	 return false;
       
-      if (Tag.Scan(Start,End - Start) == false)
+      if(Tag.Scan(Start,End - Start))
+	 break;
+
+      if (Resize() == false)
 	 return _error->Error(_("Unable to parse package file %s (1)"),
-			      Fd.Name().c_str());
+				 Fd.Name().c_str());
    }
    Start += Tag.size();
    iOffset += Tag.size();

+ 4 - 3
apt-pkg/tagfile.h

@@ -75,16 +75,17 @@ class pkgTagFile
    bool Done;
    unsigned long iOffset;
    unsigned long Size;
-   
+
    bool Fill();
-   
+   bool Resize();
+
    public:
 
    bool Step(pkgTagSection &Section);
    inline unsigned long Offset() {return iOffset;};
    bool Jump(pkgTagSection &Tag,unsigned long Offset);
 
-   pkgTagFile(FileFd *F,unsigned long Size = 64*1024);
+   pkgTagFile(FileFd *F,unsigned long Size = 32*1024);
    ~pkgTagFile();
 };
 

+ 1 - 1
configure.in

@@ -18,7 +18,7 @@ AC_CONFIG_AUX_DIR(buildlib)
 AC_CONFIG_HEADER(include/config.h:buildlib/config.h.in include/apti18n.h:buildlib/apti18n.h.in)
 
 dnl -- SET THIS TO THE RELEASE VERSION --
-AC_DEFINE_UNQUOTED(VERSION,"0.6.45.1")
+AC_DEFINE_UNQUOTED(VERSION,"0.6.46.1")
 PACKAGE="apt"
 AC_DEFINE_UNQUOTED(PACKAGE,"$PACKAGE")
 AC_SUBST(PACKAGE)

+ 3 - 1
debian/changelog

@@ -13,8 +13,10 @@ apt (0.6.46.1) unstable; urgency=low
     * fi.po: Updated to 514t. Closes: #390149
     * eu.po: Updated to 514t. Closes: #389725
     * vi.po: Updated to 514t. Closes: #388555
+  * make the internal buffer in pkgTagFile grow dynamically
+    (closes: #388708)
   
- --
+ -- Michael Vogt <mvo@debian.org>  Mon,  2 Oct 2006 20:42:20 +0200
 
 apt (0.6.46) unstable; urgency=low
 

+ 1 - 1
methods/gzip.cc

@@ -55,7 +55,7 @@ bool GzipMethod::Fetch(FetchItem *Itm)
    // if the file is empty, just rename it and return
    if(From.Size() == 0) 
    {
-      Rename(Path, Itm->DestFile);
+      rename(Path.c_str(), Itm->DestFile.c_str());
       return true;
    }