diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2010-03-12 17:17:58 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2010-03-12 17:17:58 (GMT) |
commit | 624dbf622059250872db3f606066f90ecb7d8786 (patch) | |
tree | dc282c62b834f70c20dce18abec79b465eccf9d0 | |
parent | 3f1af5c42e915775e9cc32224e090b05430a23de (diff) | |
download | cpython-624dbf622059250872db3f606066f90ecb7d8786.zip cpython-624dbf622059250872db3f606066f90ecb7d8786.tar.gz cpython-624dbf622059250872db3f606066f90ecb7d8786.tar.bz2 |
Issue #6697: catch _PyUnicode_AsString() errors in getattr() and setattr()
builtin functions.
-rw-r--r-- | Lib/test/test_builtin.py | 2 | ||||
-rw-r--r-- | Objects/object.c | 17 |
2 files changed, 14 insertions, 5 deletions
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index b4bdf11..5d24000 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -479,6 +479,8 @@ class BuiltinTest(unittest.TestCase): self.assertRaises(TypeError, getattr, sys, 1, "foo") self.assertRaises(TypeError, getattr) self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode)) + # unicode surrogates are not encodable to the default encoding (utf8) + self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E") def test_hasattr(self): import sys diff --git a/Objects/object.c b/Objects/object.c index b0a5471..a332c6c 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -799,8 +799,12 @@ PyObject_GetAttr(PyObject *v, PyObject *name) } if (tp->tp_getattro != NULL) return (*tp->tp_getattro)(v, name); - if (tp->tp_getattr != NULL) - return (*tp->tp_getattr)(v, _PyUnicode_AsString(name)); + if (tp->tp_getattr != NULL) { + char *name_str = _PyUnicode_AsString(name); + if (name_str == NULL) + return NULL; + return (*tp->tp_getattr)(v, name_str); + } PyErr_Format(PyExc_AttributeError, "'%.50s' object has no attribute '%U'", tp->tp_name, name); @@ -840,7 +844,10 @@ PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value) return err; } if (tp->tp_setattr != NULL) { - err = (*tp->tp_setattr)(v, _PyUnicode_AsString(name), value); + char *name_str = _PyUnicode_AsString(name); + if (name_str == NULL) + return -1; + err = (*tp->tp_setattr)(v, name_str, value); Py_DECREF(name); return err; } @@ -1019,8 +1026,8 @@ PyObject_GenericGetAttr(PyObject *obj, PyObject *name) } PyErr_Format(PyExc_AttributeError, - "'%.50s' object has no attribute '%.400s'", - tp->tp_name, _PyUnicode_AsString(name)); + "'%.50s' object has no attribute '%U'", + tp->tp_name, name); done: Py_DECREF(name); return res; |