Issue #18287: PyType_Ready() now checks that tp_name is not NULL.

Original patch by Niklas Koep.
This commit is contained in:
Serhiy Storchaka 2016-10-07 23:24:35 +03:00
parent 8793b21525
commit de0574bdab
5 changed files with 15 additions and 2 deletions

View File

@ -116,7 +116,8 @@ type objects) *must* have the :attr:`ob_size` field.
If no dot is present, the entire :c:member:`~PyTypeObject.tp_name` field is made accessible as the If no dot is present, the entire :c:member:`~PyTypeObject.tp_name` field is made accessible as the
:attr:`~definition.__name__` attribute, and the :attr:`__module__` attribute is undefined :attr:`~definition.__name__` attribute, and the :attr:`__module__` attribute is undefined
(unless explicitly set in the dictionary, as explained above). This means your (unless explicitly set in the dictionary, as explained above). This means your
type will be impossible to pickle. type will be impossible to pickle. Additionally, it will not be listed in
module documentations created with pydoc.
This field is not inherited by subtypes. This field is not inherited by subtypes.

View File

@ -129,7 +129,9 @@ our objects and in some error messages, for example::
Note that the name is a dotted name that includes both the module name and the Note that the name is a dotted name that includes both the module name and the
name of the type within the module. The module in this case is :mod:`noddy` and name of the type within the module. The module in this case is :mod:`noddy` and
the type is :class:`Noddy`, so we set the type name to :class:`noddy.Noddy`. :: the type is :class:`Noddy`, so we set the type name to :class:`noddy.Noddy`.
One side effect of using an undotted name is that the pydoc documentation tool
will not list the new type in the module documentation. ::
sizeof(noddy_NoddyObject), /* tp_basicsize */ sizeof(noddy_NoddyObject), /* tp_basicsize */

View File

@ -775,6 +775,7 @@ Jeff Knupp
Kubilay Kocak Kubilay Kocak
Greg Kochanski Greg Kochanski
Manvisha Kodali Manvisha Kodali
Niklas Koep
Damon Kohler Damon Kohler
Marko Kohtala Marko Kohtala
Vajrasky Kok Vajrasky Kok

View File

@ -10,6 +10,9 @@ Release date: TBA
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #18287: PyType_Ready() now checks that tp_name is not NULL.
Original patch by Niklas Koep.
- Issue #24098: Fixed possible crash when AST is changed in process of - Issue #24098: Fixed possible crash when AST is changed in process of
compiling it. compiling it.

View File

@ -4820,6 +4820,12 @@ PyType_Ready(PyTypeObject *type)
_Py_AddToAllObjects((PyObject *)type, 0); _Py_AddToAllObjects((PyObject *)type, 0);
#endif #endif
if (type->tp_name == NULL) {
PyErr_Format(PyExc_SystemError,
"Type does not define the tp_name field.");
goto error;
}
/* Initialize tp_base (defaults to BaseObject unless that's us) */ /* Initialize tp_base (defaults to BaseObject unless that's us) */
base = type->tp_base; base = type->tp_base;
if (base == NULL && type != &PyBaseObject_Type) { if (base == NULL && type != &PyBaseObject_Type) {