@@ -46,7 +46,7 @@ cdef extern from "unpack.h":
4646 Py_ssize_t count
4747
4848 ctypedef int (* execute_fn)(unpack_context* ctx, const char * data,
49- Py_ssize_t len , Py_ssize_t* off) except ? - 1
49+ Py_ssize_t len , Py_ssize_t* off) except - 1
5050 execute_fn unpack_construct
5151 execute_fn unpack_skip
5252 execute_fn read_array_header
@@ -190,24 +190,23 @@ def unpackb(object packed, *, object object_hook=None, object list_hook=None,
190190 use_list, raw, timestamp, strict_map_key, cerr,
191191 max_str_len, max_bin_len, max_array_len, max_map_len, max_ext_len)
192192 ret = unpack_construct(& ctx, buf, buf_len, & off)
193+ if ret == 1 :
194+ obj = unpack_data(& ctx)
195+ if off < buf_len:
196+ # buf may point into a temporary contiguous copy owned by view,
197+ # so the extra data must be copied out before releasing view.
198+ raise ExtraData(obj, PyBytes_FromStringAndSize(buf+ off, buf_len- off))
199+ return obj
193200 finally :
194201 PyBuffer_Release(& view);
195202
196- if ret == 1 :
197- obj = unpack_data(& ctx)
198- if off < buf_len:
199- raise ExtraData(obj, PyBytes_FromStringAndSize(buf+ off, buf_len- off))
200- return obj
201-
202203 unpack_clear(& ctx)
203204 if ret == 0 :
204205 raise ValueError (" Unpack failed: incomplete input" )
205206 elif ret == - 2 :
206207 raise FormatError
207208 elif ret == - 3 :
208209 raise StackError
209- elif PyErr_Occurred():
210- raise
211210 else :
212211 raise ValueError (" Unpack failed: error = %d " % (ret,))
213212
@@ -502,8 +501,6 @@ cdef class Unpacker:
502501 raise FormatError
503502 elif ret == - 3 :
504503 raise StackError
505- elif PyErr_Occurred():
506- raise
507504 else :
508505 raise ValueError (" Unpack failed: error = %d " % (ret,))
509506 finally :
0 commit comments