diff options
| author | Dan Halbert <halbert@adafruit.com> | 2019-06-26 20:39:50 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-06-26 20:39:50 -0400 |
| commit | c562b1923885d67fd349e48da841715f3a5522dd (patch) | |
| tree | 28d712c6767304b37ff09fa8abcc7176ab8b5385 /py/persistentcode.c | |
| parent | f77abbd96095890a016ff6acc183b6de4d7ceb26 (diff) | |
| parent | fe507db45f7fa21c6de4aafb288a7f83d9903f71 (diff) | |
Validate mpy load
Diffstat (limited to 'py/persistentcode.c')
| -rw-r--r-- | py/persistentcode.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/py/persistentcode.c b/py/persistentcode.c index f6de782ed..eb69bd407 100644 --- a/py/persistentcode.c +++ b/py/persistentcode.c @@ -102,20 +102,35 @@ STATIC void extract_prelude(const byte **ip, const byte **ip2, bytecode_prelude_ #include "py/parsenum.h" +STATIC void raise_corrupt_mpy(void) { + mp_raise_RuntimeError(translate("Corrupt .mpy file")); +} + STATIC int read_byte(mp_reader_t *reader) { - return reader->readbyte(reader->data); + mp_uint_t b = reader->readbyte(reader->data); + if (b == MP_READER_EOF) { + raise_corrupt_mpy(); + } + return b; } STATIC void read_bytes(mp_reader_t *reader, byte *buf, size_t len) { while (len-- > 0) { - *buf++ = reader->readbyte(reader->data); + mp_uint_t b =reader->readbyte(reader->data); + if (b == MP_READER_EOF) { + raise_corrupt_mpy(); + } + *buf++ = b; } } STATIC size_t read_uint(mp_reader_t *reader) { size_t unum = 0; for (;;) { - byte b = reader->readbyte(reader->data); + mp_uint_t b = reader->readbyte(reader->data); + if (b == MP_READER_EOF) { + raise_corrupt_mpy(); + } unum = (unum << 7) | (b & 0x7f); if ((b & 0x80) == 0) { break; @@ -145,11 +160,12 @@ STATIC mp_obj_t load_obj(mp_reader_t *reader) { return mp_obj_new_str_from_vstr(obj_type == 's' ? &mp_type_str : &mp_type_bytes, &vstr); } else if (obj_type == 'i') { return mp_parse_num_integer(vstr.buf, vstr.len, 10, NULL); - } else { - assert(obj_type == 'f' || obj_type == 'c'); + } else if (obj_type == 'f' || obj_type == 'c') { return mp_parse_num_decimal(vstr.buf, vstr.len, obj_type == 'c', false, NULL); } } + raise_corrupt_mpy(); + return MP_OBJ_FROM_PTR(&mp_const_none_obj); } STATIC void load_bytecode_qstrs(mp_reader_t *reader, byte *ip, byte *ip_top) { |
