Revert skipping reserved byte.

This commit is contained in:
INADA Naoki 2013-02-23 18:11:46 +09:00
parent a6859791a2
commit 38a9ad98c9
2 changed files with 44 additions and 50 deletions

View file

@ -57,7 +57,6 @@ TYPE_IMMEDIATE = 0
TYPE_ARRAY = 1 TYPE_ARRAY = 1
TYPE_MAP = 2 TYPE_MAP = 2
TYPE_RAW = 3 TYPE_RAW = 3
TYPE_RESERVED = 4
DEFAULT_RECURSE_LIMIT=511 DEFAULT_RECURSE_LIMIT=511
@ -338,13 +337,11 @@ class Unpacker(object):
n = struct.unpack(">I", self._fb_read(4, write_bytes))[0] n = struct.unpack(">I", self._fb_read(4, write_bytes))[0]
typ = TYPE_MAP typ = TYPE_MAP
else: else:
typ = TYPE_RESERVED raise UnpackValueError("Unknown header: 0x%x" % b)
return typ, n, obj return typ, n, obj
def _fb_unpack(self, execute=EX_CONSTRUCT, write_bytes=None): def _fb_unpack(self, execute=EX_CONSTRUCT, write_bytes=None):
typ = TYPE_RESERVED typ, n, obj = self._read_header(execute, write_bytes)
while typ == TYPE_RESERVED:
typ, n, obj = self._read_header(execute, write_bytes)
if execute == EX_READ_ARRAY_HEADER: if execute == EX_READ_ARRAY_HEADER:
if typ != TYPE_ARRAY: if typ != TYPE_ARRAY:

View file

@ -422,56 +422,53 @@ _end:
template <unsigned int fixed_offset, unsigned int var_offset> template <unsigned int fixed_offset, unsigned int var_offset>
msgpack_unpack_func(int, _container_header)(msgpack_unpack_struct(_context)* ctx, const char* data, size_t len, size_t* off) msgpack_unpack_func(int, _container_header)(msgpack_unpack_struct(_context)* ctx, const char* data, size_t len, size_t* off)
{ {
for (;;) { assert(len >= *off);
if (len < *off) { uint32_t size;
return 0; const unsigned char *const p = (unsigned char*)data + *off;
}
uint32_t size;
const unsigned char *const p = (unsigned char*)data + *off;
#define inc_offset(inc) \ #define inc_offset(inc) \
if (len - *off < inc) \ if (len - *off < inc) \
return 0; \ return 0; \
*off += inc; *off += inc;
switch (*p) { switch (*p) {
case var_offset: case var_offset:
inc_offset(3); inc_offset(3);
size = _msgpack_load16(uint16_t, p + 1); size = _msgpack_load16(uint16_t, p + 1);
break; break;
case var_offset + 1: case var_offset + 1:
inc_offset(5); inc_offset(5);
size = _msgpack_load32(uint32_t, p + 1); size = _msgpack_load32(uint32_t, p + 1);
break; break;
#ifdef USE_CASE_RANGE #ifdef USE_CASE_RANGE
case fixed_offset + 0x0 ... fixed_offset + 0xf: case fixed_offset + 0x0 ... fixed_offset + 0xf:
#else #else
case fixed_offset + 0x0: case fixed_offset + 0x0:
case fixed_offset + 0x1: case fixed_offset + 0x1:
case fixed_offset + 0x2: case fixed_offset + 0x2:
case fixed_offset + 0x3: case fixed_offset + 0x3:
case fixed_offset + 0x4: case fixed_offset + 0x4:
case fixed_offset + 0x5: case fixed_offset + 0x5:
case fixed_offset + 0x6: case fixed_offset + 0x6:
case fixed_offset + 0x7: case fixed_offset + 0x7:
case fixed_offset + 0x8: case fixed_offset + 0x8:
case fixed_offset + 0x9: case fixed_offset + 0x9:
case fixed_offset + 0xa: case fixed_offset + 0xa:
case fixed_offset + 0xb: case fixed_offset + 0xb:
case fixed_offset + 0xc: case fixed_offset + 0xc:
case fixed_offset + 0xd: case fixed_offset + 0xd:
case fixed_offset + 0xe: case fixed_offset + 0xe:
case fixed_offset + 0xf: case fixed_offset + 0xf:
#endif #endif
++*off; ++*off;
size = ((unsigned int)*p) & 0x0f; size = ((unsigned int)*p) & 0x0f;
break; break;
default: default:
continue; PyErr_SetString(PyExc_ValueError, "Unexpected type header on stream");
} return -1;
msgpack_unpack_callback(_uint32)(&ctx->user, size, &ctx->stack[0].obj); }
return 1; msgpack_unpack_callback(_uint32)(&ctx->user, size, &ctx->stack[0].obj);
} return 1;
} }
#undef SWITCH_RANGE_BEGIN #undef SWITCH_RANGE_BEGIN