diff options
| author | Dan Halbert <halbert@adafruit.com> | 2019-06-27 18:48:03 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-06-27 18:48:03 -0400 |
| commit | f0a112ef5d04fc17a49ad8e2d74e5e23f3c40dd5 (patch) | |
| tree | 81ca7ee2cf4f8b47316c916bc9b53e47c53cda2b /py/persistentcode.c | |
| parent | 72ea216dceff146ff654e6652e5535064dfe69ee (diff) | |
| parent | 0cce7fcaa3295d18f4fb7e10821ab692d5b2f4d7 (diff) | |
Merge pull request #1975 from tannewt/merge_in_4024.1.0-beta.1
Merge in 4.0.2
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) { |
