diff options
author | Michael Vogt <egon@bottom> | 2006-10-02 01:01:05 +0200 |
---|---|---|
committer | Michael Vogt <egon@bottom> | 2006-10-02 01:01:05 +0200 |
commit | e6549dfd43ccf76b6adbe0149b1aa42ea61cb962 (patch) | |
tree | 1fb04b103024c34a005cd4b0715cfebbbfb12104 /apt-pkg/tagfile.cc | |
parent | 81884e2d8038d13a72555ed0febcfcdbadbda429 (diff) | |
parent | 75c541fdeda664bdf0e48e68a2aa5dae7015587c (diff) |
* merged from apt--mvo
Diffstat (limited to 'apt-pkg/tagfile.cc')
-rw-r--r-- | apt-pkg/tagfile.cc | 41 |
1 files changed, 37 insertions, 4 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(); |