mirror of
https://github.com/msgpack/msgpack-python.git
synced 2025-11-10 06:21:03 +00:00
Fix reading more than read_size.
This commit is contained in:
parent
56ec7ee1b1
commit
0297b36bda
1 changed files with 14 additions and 17 deletions
|
|
@ -278,8 +278,8 @@ cdef class Unpacker(object):
|
||||||
|
|
||||||
`unicode_errors` is used for decoding bytes.
|
`unicode_errors` is used for decoding bytes.
|
||||||
|
|
||||||
`max_buffer_size` limits size of data waiting unpacked. 0 means unlimited
|
`max_buffer_size` limits size of data waiting unpacked.
|
||||||
(default).
|
0 means system's INT_MAX (default).
|
||||||
Raises `BufferFull` exception when it is insufficient.
|
Raises `BufferFull` exception when it is insufficient.
|
||||||
You shoud set this parameter when unpacking data from untrasted source.
|
You shoud set this parameter when unpacking data from untrasted source.
|
||||||
|
|
||||||
|
|
@ -332,11 +332,11 @@ cdef class Unpacker(object):
|
||||||
raise ValueError("`file_like.read` must be a callable.")
|
raise ValueError("`file_like.read` must be a callable.")
|
||||||
if not max_buffer_size:
|
if not max_buffer_size:
|
||||||
max_buffer_size = INT_MAX
|
max_buffer_size = INT_MAX
|
||||||
|
if read_size > max_buffer_size:
|
||||||
|
raise ValueError("read_size should be less or equal to max_buffer_size")
|
||||||
if not read_size:
|
if not read_size:
|
||||||
read_size = min(max_buffer_size, 1024**2)
|
read_size = min(max_buffer_size, 1024**2)
|
||||||
self.max_buffer_size = max_buffer_size
|
self.max_buffer_size = max_buffer_size
|
||||||
if read_size > max_buffer_size:
|
|
||||||
raise ValueError("read_size should be less or equal to max_buffer_size")
|
|
||||||
self.read_size = read_size
|
self.read_size = read_size
|
||||||
self.buf = <char*>malloc(read_size)
|
self.buf = <char*>malloc(read_size)
|
||||||
if self.buf == NULL:
|
if self.buf == NULL:
|
||||||
|
|
@ -419,18 +419,15 @@ cdef class Unpacker(object):
|
||||||
self.buf_size = buf_size
|
self.buf_size = buf_size
|
||||||
self.buf_tail = tail + _buf_len
|
self.buf_tail = tail + _buf_len
|
||||||
|
|
||||||
# prepare self.buf from file_like
|
cdef read_from_file(self):
|
||||||
cdef fill_buffer(self):
|
next_bytes = self.file_like_read(
|
||||||
if self.file_like is not None:
|
min(self.read_size,
|
||||||
next_bytes = self.file_like_read(
|
self.max_buffer_size - (self.buf_tail - self.buf_head)
|
||||||
max(self.read_size,
|
))
|
||||||
self.max_buffer_size - (self.buf_tail - self.buf_head)
|
if next_bytes:
|
||||||
))
|
self.append_buffer(PyBytes_AsString(next_bytes), PyBytes_Size(next_bytes))
|
||||||
if next_bytes:
|
else:
|
||||||
self.append_buffer(PyBytes_AsString(next_bytes),
|
self.file_like = None
|
||||||
PyBytes_Size(next_bytes))
|
|
||||||
else:
|
|
||||||
self.file_like = None
|
|
||||||
|
|
||||||
cpdef unpack(self):
|
cpdef unpack(self):
|
||||||
"""unpack one object"""
|
"""unpack one object"""
|
||||||
|
|
@ -443,7 +440,7 @@ cdef class Unpacker(object):
|
||||||
return o
|
return o
|
||||||
elif ret == 0:
|
elif ret == 0:
|
||||||
if self.file_like is not None:
|
if self.file_like is not None:
|
||||||
self.fill_buffer()
|
self.read_from_file()
|
||||||
continue
|
continue
|
||||||
raise StopIteration("No more unpack data.")
|
raise StopIteration("No more unpack data.")
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue