Merge pull request #235 from FrankStain/master

2Gb buffer size checks fixed for Python Builder
This commit is contained in:
Robert 2015-08-19 23:22:20 +02:00
commit 9689d38bef
1 changed files with 10 additions and 3 deletions

View File

@ -87,13 +87,20 @@ class Builder(object):
__slots__ = ("Bytes", "current_vtable", "head", "minalign", "objectEnd", __slots__ = ("Bytes", "current_vtable", "head", "minalign", "objectEnd",
"vtables") "vtables")
"""
Maximum buffer size constant, in bytes.
Builder will never allow it's buffer grow over this size.
Currently equals 2Gb.
"""
MAX_BUFFER_SIZE = 2**31
def __init__(self, initialSize): def __init__(self, initialSize):
""" """
Initializes a Builder of size `initial_size`. Initializes a Builder of size `initial_size`.
The internal buffer is grown as needed. The internal buffer is grown as needed.
""" """
if not (0 <= initialSize < (2**UOffsetTFlags.bytewidth - 1)): if not (0 <= initialSize <= Builder.MAX_BUFFER_SIZE):
msg = "flatbuffers: Cannot create Builder larger than 2 gigabytes." msg = "flatbuffers: Cannot create Builder larger than 2 gigabytes."
raise BuilderSizeError(msg) raise BuilderSizeError(msg)
@ -238,11 +245,11 @@ class Builder(object):
def growByteBuffer(self): def growByteBuffer(self):
"""Doubles the size of the byteslice, and copies the old data towards """Doubles the size of the byteslice, and copies the old data towards
the end of the new buffer (since we build the buffer backwards).""" the end of the new buffer (since we build the buffer backwards)."""
if not len(self.Bytes) <= 2**20: if len(self.Bytes) == Builder.MAX_BUFFER_SIZE:
msg = "flatbuffers: cannot grow buffer beyond 2 gigabytes" msg = "flatbuffers: cannot grow buffer beyond 2 gigabytes"
raise BuilderSizeError(msg) raise BuilderSizeError(msg)
newSize = len(self.Bytes) * 2 newSize = min(len(self.Bytes) * 2, Builder.MAX_BUFFER_SIZE)
if newSize == 0: if newSize == 0:
newSize = 1 newSize = 1
bytes2 = bytearray(newSize) bytes2 = bytearray(newSize)