@@ -422,53 +422,56 @@ msgpack_unpack_func(int, _execute)(msgpack_unpack_struct(_context)* ctx, const c
422422template <unsigned int fixed_offset, unsigned int var_offset>
423423msgpack_unpack_func (int , _container_header)(msgpack_unpack_struct (_context)* ctx, const char * data, size_t len, size_t * off)
424424{
425- assert (len >= *off);
426- uint32_t size;
427- const unsigned char *const p = (unsigned char *)data + *off;
425+ for (;;) {
426+ if (len < *off) {
427+ return 0 ;
428+ }
429+ uint32_t size;
430+ const unsigned char *const p = (unsigned char *)data + *off;
428431
429432#define inc_offset (inc ) \
430- if (len - *off < inc) \
431- return 0 ; \
432- *off += inc;
433-
434- switch (*p) {
435- case var_offset:
436- inc_offset (3 );
437- size = _msgpack_load16 (uint16_t , p + 1 );
438- break ;
439- case var_offset + 1 :
440- inc_offset (5 );
441- size = _msgpack_load32 (uint32_t , p + 1 );
442- break ;
433+ if (len - *off < inc) \
434+ return 0 ; \
435+ *off += inc;
436+
437+ switch (*p) {
438+ case var_offset:
439+ inc_offset (3 );
440+ size = _msgpack_load16 (uint16_t , p + 1 );
441+ break ;
442+ case var_offset + 1 :
443+ inc_offset (5 );
444+ size = _msgpack_load32 (uint32_t , p + 1 );
445+ break ;
443446#ifdef USE_CASE_RANGE
444- case fixed_offset + 0x0 ... fixed_offset + 0xf :
447+ case fixed_offset + 0x0 ... fixed_offset + 0xf :
445448#else
446- case fixed_offset + 0x0 :
447- case fixed_offset + 0x1 :
448- case fixed_offset + 0x2 :
449- case fixed_offset + 0x3 :
450- case fixed_offset + 0x4 :
451- case fixed_offset + 0x5 :
452- case fixed_offset + 0x6 :
453- case fixed_offset + 0x7 :
454- case fixed_offset + 0x8 :
455- case fixed_offset + 0x9 :
456- case fixed_offset + 0xa :
457- case fixed_offset + 0xb :
458- case fixed_offset + 0xc :
459- case fixed_offset + 0xd :
460- case fixed_offset + 0xe :
461- case fixed_offset + 0xf :
449+ case fixed_offset + 0x0 :
450+ case fixed_offset + 0x1 :
451+ case fixed_offset + 0x2 :
452+ case fixed_offset + 0x3 :
453+ case fixed_offset + 0x4 :
454+ case fixed_offset + 0x5 :
455+ case fixed_offset + 0x6 :
456+ case fixed_offset + 0x7 :
457+ case fixed_offset + 0x8 :
458+ case fixed_offset + 0x9 :
459+ case fixed_offset + 0xa :
460+ case fixed_offset + 0xb :
461+ case fixed_offset + 0xc :
462+ case fixed_offset + 0xd :
463+ case fixed_offset + 0xe :
464+ case fixed_offset + 0xf :
462465#endif
463- ++*off;
464- size = ((unsigned int )*p) & 0x0f ;
465- break ;
466- default :
467- PyErr_SetString (PyExc_ValueError, " Unexpected type header on stream " ) ;
468- return - 1 ;
469- }
470- msgpack_unpack_callback (_uint32)(&ctx-> user , size, &ctx-> stack [ 0 ]. obj ) ;
471- return 1 ;
466+ ++*off;
467+ size = ((unsigned int )*p) & 0x0f ;
468+ break ;
469+ default :
470+ continue ;
471+ }
472+ msgpack_unpack_callback (_uint32)(&ctx-> user , size, &ctx-> stack [ 0 ]. obj );
473+ return 1 ;
474+ }
472475}
473476
474477#undef SWITCH_RANGE_BEGIN
0 commit comments