From 0c160a08f2228045437a94ea6e00306ace8dbfb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Fri, 15 Mar 2002 13:40:30 +0000 Subject: Patch #517521: Consider byte strings before Unicode strings in PyObject_Get/SetAttr. --- Objects/object.c | 112 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 60 insertions(+), 52 deletions(-) diff --git a/Objects/object.c b/Objects/object.c index bcc129c..26ddd13 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1085,21 +1085,23 @@ PyObject_GetAttr(PyObject *v, PyObject *name) { PyTypeObject *tp = v->ob_type; + if (!PyString_Check(name)) { #ifdef Py_USING_UNICODE - /* The Unicode to string conversion is done here because the - existing tp_getattro slots expect a string object as name - and we wouldn't want to break those. */ - if (PyUnicode_Check(name)) { - name = _PyUnicode_AsDefaultEncodedString(name, NULL); - if (name == NULL) - return NULL; - } - else + /* The Unicode to string conversion is done here because the + existing tp_getattro slots expect a string object as name + and we wouldn't want to break those. */ + if (PyUnicode_Check(name)) { + name = _PyUnicode_AsDefaultEncodedString(name, NULL); + if (name == NULL) + return NULL; + } + else #endif - if (!PyString_Check(name)) { - PyErr_SetString(PyExc_TypeError, - "attribute name must be string"); - return NULL; + { + PyErr_SetString(PyExc_TypeError, + "attribute name must be string"); + return NULL; + } } if (tp->tp_getattro != NULL) return (*tp->tp_getattro)(v, name); @@ -1129,21 +1131,23 @@ PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value) PyTypeObject *tp = v->ob_type; int err; + if (!PyString_Check(name)){ #ifdef Py_USING_UNICODE - /* The Unicode to string conversion is done here because the - existing tp_setattro slots expect a string object as name - and we wouldn't want to break those. */ - if (PyUnicode_Check(name)) { - name = PyUnicode_AsEncodedString(name, NULL, NULL); - if (name == NULL) - return -1; - } - else + /* The Unicode to string conversion is done here because the + existing tp_setattro slots expect a string object as name + and we wouldn't want to break those. */ + if (PyUnicode_Check(name)) { + name = PyUnicode_AsEncodedString(name, NULL, NULL); + if (name == NULL) + return -1; + } + else #endif - if (!PyString_Check(name)){ - PyErr_SetString(PyExc_TypeError, - "attribute name must be string"); - return -1; + { + PyErr_SetString(PyExc_TypeError, + "attribute name must be string"); + return -1; + } } else Py_INCREF(name); @@ -1217,21 +1221,23 @@ PyObject_GenericGetAttr(PyObject *obj, PyObject *name) descrgetfunc f; PyObject **dictptr; + if (!PyString_Check(name)){ #ifdef Py_USING_UNICODE - /* The Unicode to string conversion is done here because the - existing tp_setattro slots expect a string object as name - and we wouldn't want to break those. */ - if (PyUnicode_Check(name)) { - name = PyUnicode_AsEncodedString(name, NULL, NULL); - if (name == NULL) - return NULL; - } - else + /* The Unicode to string conversion is done here because the + existing tp_setattro slots expect a string object as name + and we wouldn't want to break those. */ + if (PyUnicode_Check(name)) { + name = PyUnicode_AsEncodedString(name, NULL, NULL); + if (name == NULL) + return NULL; + } + else #endif - if (!PyString_Check(name)){ - PyErr_SetString(PyExc_TypeError, - "attribute name must be string"); - return NULL; + { + PyErr_SetString(PyExc_TypeError, + "attribute name must be string"); + return NULL; + } } else Py_INCREF(name); @@ -1291,21 +1297,23 @@ PyObject_GenericSetAttr(PyObject *obj, PyObject *name, PyObject *value) PyObject **dictptr; int res = -1; + if (!PyString_Check(name)){ #ifdef Py_USING_UNICODE - /* The Unicode to string conversion is done here because the - existing tp_setattro slots expect a string object as name - and we wouldn't want to break those. */ - if (PyUnicode_Check(name)) { - name = PyUnicode_AsEncodedString(name, NULL, NULL); - if (name == NULL) - return -1; - } - else + /* The Unicode to string conversion is done here because the + existing tp_setattro slots expect a string object as name + and we wouldn't want to break those. */ + if (PyUnicode_Check(name)) { + name = PyUnicode_AsEncodedString(name, NULL, NULL); + if (name == NULL) + return -1; + } + else #endif - if (!PyString_Check(name)){ - PyErr_SetString(PyExc_TypeError, - "attribute name must be string"); - return -1; + { + PyErr_SetString(PyExc_TypeError, + "attribute name must be string"); + return -1; + } } else Py_INCREF(name); -- cgit v0.12