summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2018-02-07 15:44:29 +1100
committerDamien George <damien.p.george@gmail.com>2018-02-07 15:44:29 +1100
commitb45c8c17f0f295e919a90659d4c1880a47b228c1 (patch)
tree97baec306a8914ce429d3802862239b2bf4b485c
parentcc92c0572e2b6dba3c5897d5778704aaccbb567e (diff)
py/objtype: Check and prevent delete/store on a fixed locals map.
Note that the check for elem!=NULL is removed for the MP_MAP_LOOKUP_ADD_IF_NOT_FOUND case because mp_map_lookup will always return non-NULL for such a case.
-rw-r--r--py/objtype.c12
-rw-r--r--tests/basics/del_attr.py7
-rw-r--r--tests/basics/setattr1.py7
3 files changed, 20 insertions, 6 deletions
diff --git a/py/objtype.c b/py/objtype.c
index 33757287a..7df349ce9 100644
--- a/py/objtype.c
+++ b/py/objtype.c
@@ -975,21 +975,21 @@ STATIC void type_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
if (self->locals_dict != NULL) {
assert(self->locals_dict->base.type == &mp_type_dict); // MicroPython restriction, for now
mp_map_t *locals_map = &self->locals_dict->map;
+ if (locals_map->is_fixed) {
+ // can't apply delete/store to a fixed map
+ return;
+ }
if (dest[1] == MP_OBJ_NULL) {
// delete attribute
mp_map_elem_t *elem = mp_map_lookup(locals_map, MP_OBJ_NEW_QSTR(attr), MP_MAP_LOOKUP_REMOVE_IF_FOUND);
- // note that locals_map may be in ROM, so remove will fail in that case
if (elem != NULL) {
dest[0] = MP_OBJ_NULL; // indicate success
}
} else {
// store attribute
mp_map_elem_t *elem = mp_map_lookup(locals_map, MP_OBJ_NEW_QSTR(attr), MP_MAP_LOOKUP_ADD_IF_NOT_FOUND);
- // note that locals_map may be in ROM, so add will fail in that case
- if (elem != NULL) {
- elem->value = dest[1];
- dest[0] = MP_OBJ_NULL; // indicate success
- }
+ elem->value = dest[1];
+ dest[0] = MP_OBJ_NULL; // indicate success
}
}
}
diff --git a/tests/basics/del_attr.py b/tests/basics/del_attr.py
index bec7afb84..8487b97e3 100644
--- a/tests/basics/del_attr.py
+++ b/tests/basics/del_attr.py
@@ -30,3 +30,10 @@ try:
del c.x
except AttributeError:
print("AttributeError")
+
+# try to del an attribute of a built-in class
+try:
+ del int.to_bytes
+except (AttributeError, TypeError):
+ # uPy raises AttributeError, CPython raises TypeError
+ print('AttributeError/TypeError')
diff --git a/tests/basics/setattr1.py b/tests/basics/setattr1.py
index 9693aca81..e4acb14ca 100644
--- a/tests/basics/setattr1.py
+++ b/tests/basics/setattr1.py
@@ -16,3 +16,10 @@ try:
setattr(a, b'var3', 1)
except TypeError:
print('TypeError')
+
+# try setattr on a built-in function
+try:
+ setattr(int, 'to_bytes', 1)
+except (AttributeError, TypeError):
+ # uPy raises AttributeError, CPython raises TypeError
+ print('AttributeError/TypeError')