From e845c0f92244ad45a204420e23ebeb53c1a9bd79 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 2 Nov 2007 23:07:07 +0000 Subject: Fixes for issue 1752184, ensuring type objects are always created with a PyUnicode name. --- Objects/typeobject.c | 15 ++++++++++++--- Parser/asdl_c.py | 2 +- Python/Python-ast.c | 2 +- Python/errors.c | 2 +- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Objects/typeobject.c b/Objects/typeobject.c index de31ebf..44cf5f1 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -45,6 +45,7 @@ type_set_name(PyTypeObject *type, PyObject *value, void *context) { PyHeapTypeObject* et; char *tp_name; + PyObject *tmp; if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) { PyErr_Format(PyExc_TypeError, @@ -62,14 +63,22 @@ type_set_name(PyTypeObject *type, PyObject *value, void *context) type->tp_name, Py_Type(value)->tp_name); return -1; } - tp_name = PyUnicode_AsString(value); - if (tp_name == NULL) + + /* Check absence of null characters */ + tmp = PyUnicode_FromStringAndSize("\0", 1); + if (tmp == NULL) return -1; - if (strlen(tp_name) != (size_t)PyUnicode_GET_SIZE(value)) { + if (PyUnicode_Contains(value, tmp) != 0) { + Py_DECREF(tmp); PyErr_Format(PyExc_ValueError, "__name__ must not contain null bytes"); return -1; } + Py_DECREF(tmp); + + tp_name = PyUnicode_AsString(value); + if (tp_name == NULL) + return -1; et = (PyHeapTypeObject*)type; diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 2366b1a..798650d 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -415,7 +415,7 @@ static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int } PyTuple_SET_ITEM(fnames, i, field); } - result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){sOss}", + result = PyObject_CallFunction((PyObject*)&PyType_Type, "U(O){sOss}", type, base, "_fields", fnames, "__module__", "_ast"); Py_DECREF(fnames); return (PyTypeObject*)result; diff --git a/Python/Python-ast.c b/Python/Python-ast.c index d89b610..0ccf489 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -410,7 +410,7 @@ static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int } PyTuple_SET_ITEM(fnames, i, field); } - result = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){sOss}", + result = PyObject_CallFunction((PyObject*)&PyType_Type, "U(O){sOss}", type, base, "_fields", fnames, "__module__", "_ast"); Py_DECREF(fnames); return (PyTypeObject*)result; diff --git a/Python/errors.c b/Python/errors.c index e543506..b45dad4 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -608,7 +608,7 @@ PyErr_NewException(const char *name, PyObject *base, PyObject *dict) goto failure; } /* Create a real new-style class. */ - result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO", + result = PyObject_CallFunction((PyObject *)&PyType_Type, "UOO", dot+1, bases, dict); failure: Py_XDECREF(bases); -- cgit v0.12