diff options
author | Stephen Kyle <stephen.kyle@arm.com> | 2016-04-01 10:51:40 +0100 |
---|---|---|
committer | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2016-04-01 16:36:00 +0300 |
commit | b475327ffa24a95d9855b9ed38cdd8fe13487f4d (patch) | |
tree | 86214e2a37e77664184a99d390e6801c2d917c5a | |
parent | 6a051a8e0ba6b16001c72df0b77697caba2756c4 (diff) | |
download | micropython-b475327ffa24a95d9855b9ed38cdd8fe13487f4d.tar.gz micropython-b475327ffa24a95d9855b9ed38cdd8fe13487f4d.zip |
py/map: Prevent map resize failure from destroying map.
-rw-r--r-- | py/map.c | 7 |
1 files changed, 5 insertions, 2 deletions
@@ -118,11 +118,14 @@ void mp_map_clear(mp_map_t *map) { STATIC void mp_map_rehash(mp_map_t *map) { mp_uint_t old_alloc = map->alloc; + mp_uint_t new_alloc = get_doubling_prime_greater_or_equal_to(map->alloc + 1); mp_map_elem_t *old_table = map->table; - map->alloc = get_doubling_prime_greater_or_equal_to(map->alloc + 1); + mp_map_elem_t *new_table = m_new0(mp_map_elem_t, new_alloc); + // If we reach this point, table resizing succeeded, now we can edit the old map. + map->alloc = new_alloc; map->used = 0; map->all_keys_are_qstrs = 1; - map->table = m_new0(mp_map_elem_t, map->alloc); + map->table = new_table; for (mp_uint_t i = 0; i < old_alloc; i++) { if (old_table[i].key != MP_OBJ_NULL && old_table[i].key != MP_OBJ_SENTINEL) { mp_map_lookup(map, old_table[i].key, MP_MAP_LOOKUP_ADD_IF_NOT_FOUND)->value = old_table[i].value; |