summaryrefslogtreecommitdiff
path: root/apt-pkg/tagfile.cc
diff options
context:
space:
mode:
authorMichael Vogt <egon@tas>2006-12-07 12:06:54 +0100
committerMichael Vogt <egon@tas>2006-12-07 12:06:54 +0100
commit3ca658384917297fdb75112a2b2df26054678934 (patch)
treedeadcb5d3688dc15ecc95b0c54941191b90ea513 /apt-pkg/tagfile.cc
parentc7d9068f8c352b1ba6b43bd1fffb88542bee19a9 (diff)
parent1c05ebd6da9491d316997a98db1451f7b0526603 (diff)
merged from apt--mvo
Diffstat (limited to 'apt-pkg/tagfile.cc')
-rw-r--r--apt-pkg/tagfile.cc41
1 files changed, 37 insertions, 4 deletions
diff --git a/apt-pkg/tagfile.cc b/apt-pkg/tagfile.cc
index 029511336..8700dd17d 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();