@@ -72,15 +72,14 @@ static inline PyObject* unpack_data(unpack_context* ctx)
7272
7373static inline void unpack_clear (unpack_context * ctx )
7474{
75- unsigned int i ;
76- for (i = 1 ; i < ctx -> top ; i ++ ) {
77- Py_CLEAR (ctx -> stack [i ].obj );
75+ for (unsigned int i = 0 ; i < ctx -> top ; i ++ ) {
7876 /* map_key holds a live reference only while waiting for the value */
7977 if (ctx -> stack [i ].ct == CT_MAP_VALUE ) {
8078 Py_CLEAR (ctx -> stack [i ].map_key );
8179 }
80+ Py_CLEAR (ctx -> stack [i ].obj );
8281 }
83- Py_CLEAR (ctx -> stack [ 0 ]. obj );
82+ unpack_init (ctx );
8483}
8584
8685static inline int unpack_execute (bool construct , unpack_context * ctx , const char * data , Py_ssize_t len , Py_ssize_t * off )
@@ -200,7 +199,7 @@ static inline int unpack_execute(bool construct, unpack_context* ctx, const char
200199 case 0xd5 : // fixext 2
201200 case 0xd6 : // fixext 4
202201 case 0xd7 : // fixext 8
203- again_fixed_trail_if_zero (ACS_EXT_VALUE ,
202+ again_fixed_trail_if_zero (ACS_EXT_VALUE ,
204203 (1 << (((unsigned int )* p ) & 0x03 ))+ 1 ,
205204 _ext_zero );
206205 case 0xd8 : // fixext 16
@@ -344,6 +343,7 @@ static inline int unpack_execute(bool construct, unpack_context* ctx, const char
344343 goto _header_again ;
345344 case CT_MAP_VALUE :
346345 if (construct_cb (_map_item )(user , c -> count , & c -> obj , c -> map_key , obj ) < 0 ) { goto _failed ; }
346+ c -> map_key = NULL ;
347347 if (++ c -> count == c -> size ) {
348348 obj = c -> obj ;
349349 if (construct_cb (_map_end )(user , & obj ) < 0 ) { goto _failed ; }
@@ -406,10 +406,18 @@ static inline int unpack_execute(bool construct, unpack_context* ctx, const char
406406#undef start_container
407407
408408static int unpack_construct (unpack_context * ctx , const char * data , Py_ssize_t len , Py_ssize_t * off ) {
409- return unpack_execute (1 , ctx , data , len , off );
409+ int ret = unpack_execute (1 , ctx , data , len , off );
410+ if (ret == -1 ) {
411+ unpack_clear (ctx );
412+ }
413+ return ret ;
410414}
411415static int unpack_skip (unpack_context * ctx , const char * data , Py_ssize_t len , Py_ssize_t * off ) {
412- return unpack_execute (0 , ctx , data , len , off );
416+ int ret = unpack_execute (0 , ctx , data , len , off );
417+ if (ret == -1 ) {
418+ unpack_clear (ctx );
419+ }
420+ return ret ;
413421}
414422
415423#define unpack_container_header read_array_header
0 commit comments