]> granicus.if.org Git - python/commitdiff
Fixes for issue 1752184, ensuring type objects are always created
authorGuido van Rossum <guido@python.org>
Fri, 2 Nov 2007 23:07:07 +0000 (23:07 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 2 Nov 2007 23:07:07 +0000 (23:07 +0000)
with a PyUnicode name.

Objects/typeobject.c
Parser/asdl_c.py
Python/Python-ast.c
Python/errors.c

index de31ebfb1adf4f7568fc1a1ccf1bd4157b8e9d1e..44cf5f13acfc569739c31cdfc3706d3ba1482936 100644 (file)
@@ -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;
 
index 2366b1a68775b1fae6bd16bccebaea75745d9f23..798650d6fbc009bef6479768510b854ea4885382 100755 (executable)
@@ -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;
index d89b610a8ae6399d192d6628f86c5d1d6cf4b659..0ccf489d4560d96e6e79977ab444838506211c8a 100644 (file)
@@ -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;
index e543506faac967311d11da34019590c818ed6d15..b45dad46e6258c155335a6f04453680a6a9f2f0a 100644 (file)
@@ -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);