diff options
-rw-r--r-- | py/binary.c | 6 | ||||
-rw-r--r-- | py/modstruct.c | 3 | ||||
-rw-r--r-- | py/objarray.c | 3 | ||||
-rw-r--r-- | tests/basics/struct2.py | 12 |
4 files changed, 17 insertions, 7 deletions
diff --git a/py/binary.c b/py/binary.c index d22e0f342..6450478cc 100644 --- a/py/binary.c +++ b/py/binary.c @@ -33,6 +33,7 @@ #include "py/binary.h" #include "py/smallint.h" #include "py/objint.h" +#include "py/runtime.h" // Helpers to work with binary-encoded data @@ -100,6 +101,11 @@ size_t mp_binary_get_size(char struct_type, char val_type, mp_uint_t *palign) { } } } + + if (size == 0) { + mp_raise_ValueError("bad typecode"); + } + if (palign != NULL) { *palign = align; } diff --git a/py/modstruct.c b/py/modstruct.c index 88411ff0f..3c99ef1d8 100644 --- a/py/modstruct.c +++ b/py/modstruct.c @@ -113,9 +113,6 @@ STATIC mp_obj_t struct_calcsize(mp_obj_t fmt_in) { } else { mp_uint_t align; size_t sz = mp_binary_get_size(fmt_type, *fmt, &align); - if (sz == 0) { - mp_raise_ValueError("unsupported format"); - } while (cnt--) { // Apply alignment size = (size + align - 1) & ~(align - 1); diff --git a/py/objarray.c b/py/objarray.c index 8e1d32f0f..ed666df8f 100644 --- a/py/objarray.c +++ b/py/objarray.c @@ -94,9 +94,6 @@ STATIC void array_print(const mp_print_t *print, mp_obj_t o_in, mp_print_kind_t #if MICROPY_PY_BUILTINS_BYTEARRAY || MICROPY_PY_ARRAY STATIC mp_obj_array_t *array_new(char typecode, mp_uint_t n) { int typecode_size = mp_binary_get_size('@', typecode, NULL); - if (typecode_size == 0) { - mp_raise_msg(&mp_type_ValueError, "bad typecode"); - } mp_obj_array_t *o = m_new_obj(mp_obj_array_t); #if MICROPY_PY_BUILTINS_BYTEARRAY && MICROPY_PY_ARRAY o->base.type = (typecode == BYTEARRAY_TYPECODE) ? &mp_type_bytearray : &mp_type_array; diff --git a/tests/basics/struct2.py b/tests/basics/struct2.py index 6dd963260..e3f8bbebf 100644 --- a/tests/basics/struct2.py +++ b/tests/basics/struct2.py @@ -26,7 +26,17 @@ print(struct.calcsize('0s1s0H2H')) print(struct.unpack('<0s1s0H2H', b'01234')) print(struct.pack('<0s1s0H2H', b'abc', b'abc', 258, 515)) -# check that zero of an unknown type raises an exception +# check that unknown types raise an exception +try: + struct.unpack('z', b'1') +except: + print('Exception') + +try: + struct.pack('z', (b'1',)) +except: + print('Exception') + try: struct.calcsize('0z') except: |