summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/tagfile.cc41
-rw-r--r--apt-pkg/tagfile.h7
-rw-r--r--configure.in2
-rw-r--r--debian/changelog4
-rw-r--r--methods/gzip.cc2
5 files changed, 46 insertions, 10 deletions
diff --git a/apt-pkg/tagfile.cc b/apt-pkg/tagfile.cc
index 040562fff..223618cd1 100644
--- a/apt-pkg/tagfile.cc
+++ b/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();
diff --git a/apt-pkg/tagfile.h b/apt-pkg/tagfile.h
index f7f8155a5..70381ad13 100644
--- a/apt-pkg/tagfile.h
+++ b/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();
};
diff --git a/configure.in b/configure.in
index 35d0ea5ee..a94cb6417 100644
--- a/configure.in
+++ b/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)
diff --git a/debian/changelog b/debian/changelog
index 88eb14871..4d733313a 100644
--- a/debian/changelog
+++ b/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
diff --git a/methods/gzip.cc b/methods/gzip.cc
index a8e816bf3..f732c0b86 100644
--- a/methods/gzip.cc
+++ b/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;
}