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:25:46 +03:00
commit e45b7c09ec
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
:attr:`~definition.__name__` attribute, and the :attr:`__module__` attribute is undefined
(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.

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
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 */

View File

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

View File

@ -10,6 +10,9 @@ What's New in Python 3.6.0 beta 2
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
compiling it.

View File

@ -4893,6 +4893,12 @@ PyType_Ready(PyTypeObject *type)
_Py_AddToAllObjects((PyObject *)type, 0);
#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) */
base = type->tp_base;
if (base == NULL && type != &PyBaseObject_Type) {