]> git.saurik.com Git - apt.git/commitdiff
* merged from apt--mvo
authorMichael Vogt <egon@bottom>
Mon, 2 Oct 2006 18:42:47 +0000 (20:42 +0200)
committerMichael Vogt <egon@bottom>
Mon, 2 Oct 2006 18:42:47 +0000 (20:42 +0200)
apt-pkg/tagfile.cc
apt-pkg/tagfile.h
configure.in
debian/changelog
methods/gzip.cc

index 040562fffbb0d5f7ba062edbb068953a58bfe5ea..223618cd19083be23fbfa45b31d14a6ca692c150 100644 (file)
@@ -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();
index f7f8155a527ee8762db6f9cbcd5babbb89970bed..70381ad13acef4d14505e6fc417450ad5681b31a 100644 (file)
@@ -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();
 };
 
index 35d0ea5ee7a39ee5fa96e1936fa01db23e21b9f5..a94cb64177a8cc33a1bf820a0fa69eafbcfdd514 100644 (file)
@@ -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)
index 88eb14871045b2668081a5bc4f54f554394c31d8..4d733313a92eee3e9cfec576eab2a6ea4d083f8d 100644 (file)
@@ -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
 
index a8e816bf34b9b31b843fdc53d8a3c8d7bd399f37..f732c0b8600f227bd98e0fb088038aea4383e8c8 100644 (file)
@@ -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;
    }