diff options
author | Michael Vogt <michael.vogt@ubuntu.com> | 2006-10-02 00:58:53 +0200 |
---|---|---|
committer | Michael Vogt <michael.vogt@ubuntu.com> | 2006-10-02 00:58:53 +0200 |
commit | 75c541fdeda664bdf0e48e68a2aa5dae7015587c (patch) | |
tree | 17c3f78fd38e4de1b5877bda0512e54b80098c08 /apt-pkg/tagfile.cc | |
parent | c407612f82f02ed97ec879e48e3cd1c187b4f5ea (diff) |
* apt-pkg/tagfile.cc,h:
- make the internal buffer grow dynamically if required
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(); |