@@ -422,56 +422,53 @@ 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- for (;;) {
426- if (len < *off) {
427- return 0 ;
428- }
429- uint32_t size;
430- const unsigned char *const p = (unsigned char *)data + *off;
425+ assert (len >= *off);
426+ uint32_t size;
427+ const unsigned char *const p = (unsigned char *)data + *off;
431428
432429#define inc_offset (inc ) \
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 ;
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 ;
446443#ifdef USE_CASE_RANGE
447- case fixed_offset + 0x0 ... fixed_offset + 0xf :
444+ case fixed_offset + 0x0 ... fixed_offset + 0xf :
448445#else
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 :
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 :
465462#endif
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- }
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 ;
475472}
476473
477474#undef SWITCH_RANGE_BEGIN
0 commit comments