From 0e3f29cc9973dc3c522941858f1f0fb4c6b2cba0 Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
Date: Mon, 23 Nov 2015 15:57:00 +0000
Subject: [PATCH] py: Check that second argument to hasattr is actually a
 string.

Fixes issue #1623.
---
 py/modbuiltins.c         |  4 ++--
 tests/basics/hasattr1.py | 10 ++++++++++
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/py/modbuiltins.c b/py/modbuiltins.c
index dd8499ba6..e39c20b60 100644
--- a/py/modbuiltins.c
+++ b/py/modbuiltins.c
@@ -529,14 +529,14 @@ STATIC mp_obj_t mp_builtin_setattr(mp_obj_t base, mp_obj_t attr, mp_obj_t value)
 MP_DEFINE_CONST_FUN_OBJ_3(mp_builtin_setattr_obj, mp_builtin_setattr);
 
 STATIC mp_obj_t mp_builtin_hasattr(mp_obj_t object_in, mp_obj_t attr_in) {
-    assert(MP_OBJ_IS_QSTR(attr_in));
+    qstr attr = mp_obj_str_get_qstr(attr_in);
 
     mp_obj_t dest[2];
     // TODO: https://docs.python.org/3/library/functions.html?highlight=hasattr#hasattr
     // explicitly says "This is implemented by calling getattr(object, name) and seeing
     // whether it raises an AttributeError or not.", so we should explicitly wrap this
     // in nlr_push and handle exception.
-    mp_load_method_maybe(object_in, MP_OBJ_QSTR_VALUE(attr_in), dest);
+    mp_load_method_maybe(object_in, attr, dest);
 
     return mp_obj_new_bool(dest[0] != MP_OBJ_NULL);
 }
diff --git a/tests/basics/hasattr1.py b/tests/basics/hasattr1.py
index b1c4b5ceb..118a19e57 100644
--- a/tests/basics/hasattr1.py
+++ b/tests/basics/hasattr1.py
@@ -27,3 +27,13 @@ c = C()
 print(hasattr(c, "exists"))
 # TODO
 #print(hasattr(c, "doesnt_exist"))
+
+try:
+    hasattr(1, b'123')
+except TypeError:
+    print('TypeError')
+
+try:
+    hasattr(1, 123)
+except TypeError:
+    print('TypeError')
-- 
GitLab