summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2015-12-30 19:41:53 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2015-12-30 19:41:53 (GMT)
commit288cb25f1a208fe09b9e06ba479e11c1157da4b5 (patch)
treea9c7e5673542a3e02c7450eff13d5fc87a8a212f
parent58f8833e4cbb8ee434de616a70e85220f0e48031 (diff)
parent42bf8fc90158072ff0136a7c8bfa0b0dba3a70d6 (diff)
downloadcpython-288cb25f1a208fe09b9e06ba479e11c1157da4b5.zip
cpython-288cb25f1a208fe09b9e06ba479e11c1157da4b5.tar.gz
cpython-288cb25f1a208fe09b9e06ba479e11c1157da4b5.tar.bz2
Issue #25961: Disallowed null characters in the type name.
Simplified testing for null characters in __name__ setter.
-rw-r--r--Misc/NEWS2
-rw-r--r--Objects/typeobject.c32
2 files changed, 17 insertions, 17 deletions
diff --git a/Misc/NEWS b/Misc/NEWS
index 6333401..1c5d800 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,8 @@ Release date: tba
Core and Builtins
-----------------
+- Issue #25961: Disallowed null characters in the type name.
+
- Issue #25973: Fix segfault when an invalid nonlocal statement binds a name
starting with two underscores.
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 78ef6ac..c62255c 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -401,8 +401,8 @@ type_qualname(PyTypeObject *type, void *context)
static int
type_set_name(PyTypeObject *type, PyObject *value, void *context)
{
- char *tp_name;
- PyObject *tmp;
+ const char *tp_name;
+ Py_ssize_t name_size;
if (!check_set_special_type_attr(type, value, "__name__"))
return -1;
@@ -413,21 +413,14 @@ type_set_name(PyTypeObject *type, PyObject *value, void *context)
return -1;
}
- /* Check absence of null characters */
- tmp = PyUnicode_FromStringAndSize("\0", 1);
- if (tmp == NULL)
+ tp_name = PyUnicode_AsUTF8AndSize(value, &name_size);
+ if (tp_name == NULL)
return -1;
- if (PyUnicode_Contains(value, tmp) != 0) {
- Py_DECREF(tmp);
- PyErr_Format(PyExc_ValueError,
- "__name__ must not contain null bytes");
+ if (strlen(tp_name) != (size_t)name_size) {
+ PyErr_SetString(PyExc_ValueError,
+ "type name must not contain null characters");
return -1;
}
- Py_DECREF(tmp);
-
- tp_name = _PyUnicode_AsString(value);
- if (tp_name == NULL)
- return -1;
type->tp_name = tp_name;
Py_INCREF(value);
@@ -2284,8 +2277,8 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
PyTypeObject *type = NULL, *base, *tmptype, *winner;
PyHeapTypeObject *et;
PyMemberDef *mp;
- Py_ssize_t i, nbases, nslots, slotoffset, add_dict, add_weak;
- int j, may_add_dict, may_add_weak;
+ Py_ssize_t i, nbases, nslots, slotoffset, name_size;
+ int j, may_add_dict, may_add_weak, add_dict, add_weak;
_Py_IDENTIFIER(__qualname__);
_Py_IDENTIFIER(__slots__);
@@ -2508,9 +2501,14 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
type->tp_as_sequence = &et->as_sequence;
type->tp_as_mapping = &et->as_mapping;
type->tp_as_buffer = &et->as_buffer;
- type->tp_name = _PyUnicode_AsString(name);
+ type->tp_name = PyUnicode_AsUTF8AndSize(name, &name_size);
if (!type->tp_name)
goto error;
+ if (strlen(type->tp_name) != (size_t)name_size) {
+ PyErr_SetString(PyExc_ValueError,
+ "type name must not contain null characters");
+ goto error;
+ }
/* Set tp_base and tp_bases */
type->tp_bases = bases;