diff options
| author | Benjamin Peterson <benjamin@python.org> | 2012-03-16 15:58:46 (GMT) |
|---|---|---|
| committer | Benjamin Peterson <benjamin@python.org> | 2012-03-16 15:58:46 (GMT) |
| commit | dbc52f8a0d3c496e642dbc92c684f873e67f3127 (patch) | |
| tree | 25e405ed6e834b60e012cf7b461f19de9c78e508 /Objects/classobject.c | |
| parent | 6e7832b04caf33196a56c153821631d33bbb3bff (diff) | |
| download | cpython-dbc52f8a0d3c496e642dbc92c684f873e67f3127.zip cpython-dbc52f8a0d3c496e642dbc92c684f873e67f3127.tar.gz cpython-dbc52f8a0d3c496e642dbc92c684f873e67f3127.tar.bz2 | |
check for string attribute names in old-style classes (closes #14334)
Diffstat (limited to 'Objects/classobject.c')
| -rw-r--r-- | Objects/classobject.c | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/Objects/classobject.c b/Objects/classobject.c index 161906a..2c9c216 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -225,10 +225,16 @@ static PyObject * class_getattr(register PyClassObject *op, PyObject *name) { register PyObject *v; - register char *sname = PyString_AsString(name); + register char *sname; PyClassObject *klass; descrgetfunc f; + if (!PyString_Check(name)) { + PyErr_SetString(PyExc_TypeError, "attribute name must be a string"); + return NULL; + } + + sname = PyString_AsString(name); if (sname[0] == '_' && sname[1] == '_') { if (strcmp(sname, "__dict__") == 0) { if (PyEval_GetRestricted()) { @@ -336,6 +342,10 @@ class_setattr(PyClassObject *op, PyObject *name, PyObject *v) "classes are read-only in restricted mode"); return -1; } + if (!PyString_Check(name)) { + PyErr_SetString(PyExc_TypeError, "attribute name must be a string"); + return -1; + } sname = PyString_AsString(name); if (sname[0] == '_' && sname[1] == '_') { Py_ssize_t n = PyString_Size(name); @@ -699,7 +709,14 @@ static PyObject * instance_getattr1(register PyInstanceObject *inst, PyObject *name) { register PyObject *v; - register char *sname = PyString_AsString(name); + register char *sname; + + if (!PyString_Check(name)) { + PyErr_SetString(PyExc_TypeError, "attribute name must be a string"); + return NULL; + } + + sname = PyString_AsString(name); if (sname[0] == '_' && sname[1] == '_') { if (strcmp(sname, "__dict__") == 0) { if (PyEval_GetRestricted()) { @@ -810,7 +827,14 @@ static int instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v) { PyObject *func, *args, *res, *tmp; - char *sname = PyString_AsString(name); + char *sname; + + if (!PyString_Check(name)) { + PyErr_SetString(PyExc_TypeError, "attribute name must be a string"); + return -1; + } + + sname = PyString_AsString(name); if (sname[0] == '_' && sname[1] == '_') { Py_ssize_t n = PyString_Size(name); if (sname[n-1] == '_' && sname[n-2] == '_') { |
