Issue #25961: Disallowed null characters in the type name.

Simplified testing for null characters in __name__ setter.
This commit is contained in:
Serhiy Storchaka 2015-12-30 21:40:49 +02:00
parent beb652ccc1
commit 42bf8fc901
2 changed files with 20 additions and 29 deletions

View File

@ -10,6 +10,8 @@ Release date: tba
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #25961: Disallowed null characters in the type name.
- Issue #25973: Fix segfault when an invalid nonlocal statement binds a name - Issue #25973: Fix segfault when an invalid nonlocal statement binds a name
starting with two underscores. starting with two underscores.

View File

@ -401,9 +401,8 @@ type_qualname(PyTypeObject *type, void *context)
static int static int
type_set_name(PyTypeObject *type, PyObject *value, void *context) type_set_name(PyTypeObject *type, PyObject *value, void *context)
{ {
PyHeapTypeObject* et; const char *tp_name;
char *tp_name; Py_ssize_t name_size;
PyObject *tmp;
if (!check_set_special_type_attr(type, value, "__name__")) if (!check_set_special_type_attr(type, value, "__name__"))
return -1; return -1;
@ -414,33 +413,18 @@ type_set_name(PyTypeObject *type, PyObject *value, void *context)
return -1; return -1;
} }
/* Check absence of null characters */ tp_name = PyUnicode_AsUTF8AndSize(value, &name_size);
tmp = PyUnicode_FromStringAndSize("\0", 1);
if (tmp == NULL)
return -1;
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) if (tp_name == NULL)
return -1; return -1;
if (strlen(tp_name) != (size_t)name_size) {
et = (PyHeapTypeObject*)type; PyErr_SetString(PyExc_ValueError,
"type name must not contain null characters");
Py_INCREF(value); return -1;
}
/* Wait until et is a sane state before Py_DECREF'ing the old et->ht_name
value. (Bug #16447.) */
tmp = et->ht_name;
et->ht_name = value;
type->tp_name = tp_name; type->tp_name = tp_name;
Py_DECREF(tmp); Py_INCREF(value);
Py_SETREF(((PyHeapTypeObject*)type)->ht_name, value);
return 0; return 0;
} }
@ -2285,8 +2269,8 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
PyTypeObject *type = NULL, *base, *tmptype, *winner; PyTypeObject *type = NULL, *base, *tmptype, *winner;
PyHeapTypeObject *et; PyHeapTypeObject *et;
PyMemberDef *mp; PyMemberDef *mp;
Py_ssize_t i, nbases, nslots, slotoffset, add_dict, add_weak; Py_ssize_t i, nbases, nslots, slotoffset, name_size;
int j, may_add_dict, may_add_weak; int j, may_add_dict, may_add_weak, add_dict, add_weak;
_Py_IDENTIFIER(__qualname__); _Py_IDENTIFIER(__qualname__);
_Py_IDENTIFIER(__slots__); _Py_IDENTIFIER(__slots__);
@ -2509,9 +2493,14 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
type->tp_as_sequence = &et->as_sequence; type->tp_as_sequence = &et->as_sequence;
type->tp_as_mapping = &et->as_mapping; type->tp_as_mapping = &et->as_mapping;
type->tp_as_buffer = &et->as_buffer; 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) if (!type->tp_name)
goto error; 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 */ /* Set tp_base and tp_bases */
type->tp_bases = bases; type->tp_bases = bases;