From 6978325323208c395d135f19847a8ad0b13f93f9 Mon Sep 17 00:00:00 2001 From: Christian Tismer Date: Fri, 26 Oct 2018 16:58:09 +0200 Subject: Fix Memory Leak Caused By Wrong Limited API Default When a type has nullptr as tp_dealloc, there apply different defaults. Static types had object_dealloc as default, while new heaptypes created with type_new have subtype_dealloc as default. A problem was now that PyType_FromSpec also has subtype_dealloc as default. But that is wrong, because a type that was written with the static type approach is already written with object_dealloc in mind and takes somehow care about further issues with that type. When we now convert this type and suddenly use subtype_dealloc instead of object_dealloc, things get pretty wrong. Finding that out was pretty hard and took quite long to understand. The fix was then very easy and is the best proof: Replacing our former (wrong) solution of supplying an SbkDummyDealloc with a function object_dealloc works perfectly, and the leakage completely vanished. The documentation now is also corrected. Task-number: PYSIDE-832 Change-Id: Ifc20c28172eb5663cd5e60dac52e0a43acfb626c Reviewed-by: Friedemann Kleint --- sources/pyside2/PySide2/QtQml/pysideqmlregistertype.cpp | 4 ++-- sources/pyside2/libpyside/pysideclassinfo.cpp | 2 +- sources/pyside2/libpyside/pysidemetafunction.cpp | 2 +- sources/pyside2/libpyside/pysideqflags.cpp | 2 +- sources/pyside2/libpyside/pysidesignal.cpp | 6 +++--- sources/pyside2/libpyside/pysideslot.cpp | 2 +- sources/pyside2/libpyside/pysideweakref.cpp | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) (limited to 'sources/pyside2') diff --git a/sources/pyside2/PySide2/QtQml/pysideqmlregistertype.cpp b/sources/pyside2/PySide2/QtQml/pysideqmlregistertype.cpp index 0b427c251..1a1f09511 100644 --- a/sources/pyside2/PySide2/QtQml/pysideqmlregistertype.cpp +++ b/sources/pyside2/PySide2/QtQml/pysideqmlregistertype.cpp @@ -235,7 +235,7 @@ void propListTpFree(void* self) static PyType_Slot PropertyListType_slots[] = { {Py_tp_init, (void *)propListTpInit}, {Py_tp_free, (void *)propListTpFree}, - {Py_tp_dealloc, (void *)SbkDummyDealloc}, + {Py_tp_dealloc, (void *)object_dealloc}, {0, 0} }; static PyType_Spec PropertyListType_spec = { @@ -449,7 +449,7 @@ static PyType_Slot QtQml_VolatileBoolType_slots[] = { {Py_tp_str, (void *)reinterpret_cast(QtQml_VolatileBoolObject_str)}, {Py_tp_methods, (void *)QtQml_VolatileBoolObject_methods}, {Py_tp_new, (void *)QtQml_VolatileBoolObject_new}, - {Py_tp_dealloc, (void *)SbkDummyDealloc}, + {Py_tp_dealloc, (void *)object_dealloc}, {0, 0} }; static PyType_Spec QtQml_VolatileBoolType_spec = { diff --git a/sources/pyside2/libpyside/pysideclassinfo.cpp b/sources/pyside2/libpyside/pysideclassinfo.cpp index 24a0c642b..5593825c3 100644 --- a/sources/pyside2/libpyside/pysideclassinfo.cpp +++ b/sources/pyside2/libpyside/pysideclassinfo.cpp @@ -60,7 +60,7 @@ static PyType_Slot PySideClassInfoType_slots[] = { {Py_tp_init, (void *)classInfoTpInit}, {Py_tp_new, (void *)classInfoTpNew}, {Py_tp_free, (void *)classInfoFree}, - {Py_tp_dealloc, (void *)SbkDummyDealloc}, + {Py_tp_dealloc, (void *)object_dealloc}, {0, 0} }; static PyType_Spec PySideClassInfoType_spec = { diff --git a/sources/pyside2/libpyside/pysidemetafunction.cpp b/sources/pyside2/libpyside/pysidemetafunction.cpp index 9839a1098..a9fbbc7fc 100644 --- a/sources/pyside2/libpyside/pysidemetafunction.cpp +++ b/sources/pyside2/libpyside/pysidemetafunction.cpp @@ -62,7 +62,7 @@ static PyType_Slot PySideMetaFunctionType_slots[] = { {Py_tp_call, (void *)functionCall}, {Py_tp_new, (void *)PyType_GenericNew}, {Py_tp_free, (void *)functionFree}, - {Py_tp_dealloc, (void *)SbkDummyDealloc}, + {Py_tp_dealloc, (void *)object_dealloc}, {0, 0} }; static PyType_Spec PySideMetaFunctionType_spec = { diff --git a/sources/pyside2/libpyside/pysideqflags.cpp b/sources/pyside2/libpyside/pysideqflags.cpp index 7a8fa2a05..684628e57 100644 --- a/sources/pyside2/libpyside/pysideqflags.cpp +++ b/sources/pyside2/libpyside/pysideqflags.cpp @@ -151,7 +151,7 @@ namespace QFlags #endif {Py_tp_new, (void *)PySideQFlagsNew}, {Py_tp_richcompare, (void *)PySideQFlagsRichCompare}, - {Py_tp_dealloc, (void *)SbkDummyDealloc}, + {Py_tp_dealloc, (void *)object_dealloc}, {0, 0} }; static PyType_Spec SbkNewQFlagsType_spec = { diff --git a/sources/pyside2/libpyside/pysidesignal.cpp b/sources/pyside2/libpyside/pysidesignal.cpp index 2d423a634..c3dc65968 100644 --- a/sources/pyside2/libpyside/pysidesignal.cpp +++ b/sources/pyside2/libpyside/pysidesignal.cpp @@ -103,7 +103,7 @@ static PyType_Slot PySideSignalMetaType_slots[] = { {Py_tp_methods, (void *)Signal_methods}, {Py_tp_base, (void *)&PyType_Type}, {Py_tp_free, (void *)PyObject_GC_Del}, - {Py_tp_dealloc, (void *)SbkDummyDealloc}, + {Py_tp_dealloc, (void *)object_dealloc}, {0, 0} }; static PyType_Spec PySideSignalMetaType_spec = { @@ -135,7 +135,7 @@ static PyType_Slot PySideSignalType_slots[] = { {Py_tp_init, (void *)signalTpInit}, {Py_tp_new, (void *)PyType_GenericNew}, {Py_tp_free, (void *)signalFree}, - {Py_tp_dealloc, (void *)SbkDummyDealloc}, + {Py_tp_dealloc, (void *)object_dealloc}, {0, 0} }; static PyType_Spec PySideSignalType_spec = { @@ -174,7 +174,7 @@ static PyType_Slot PySideSignalInstanceType_slots[] = { {Py_tp_methods, (void *)SignalInstance_methods}, {Py_tp_new, (void *)PyType_GenericNew}, {Py_tp_free, (void *)signalInstanceFree}, - {Py_tp_dealloc, (void *)SbkDummyDealloc}, + {Py_tp_dealloc, (void *)object_dealloc}, {0, 0} }; static PyType_Spec PySideSignalInstanceType_spec = { diff --git a/sources/pyside2/libpyside/pysideslot.cpp b/sources/pyside2/libpyside/pysideslot.cpp index fddff54fa..6ae664c42 100644 --- a/sources/pyside2/libpyside/pysideslot.cpp +++ b/sources/pyside2/libpyside/pysideslot.cpp @@ -66,7 +66,7 @@ static PyType_Slot PySideSlotType_slots[] = { {Py_tp_call, (void *)slotCall}, {Py_tp_init, (void *)slotTpInit}, {Py_tp_new, (void *)PyType_GenericNew}, - {Py_tp_dealloc, (void *)SbkDummyDealloc}, + {Py_tp_dealloc, (void *)object_dealloc}, {0, 0} }; static PyType_Spec PySideSlotType_spec = { diff --git a/sources/pyside2/libpyside/pysideweakref.cpp b/sources/pyside2/libpyside/pysideweakref.cpp index 906aafd7c..6c38d39c4 100644 --- a/sources/pyside2/libpyside/pysideweakref.cpp +++ b/sources/pyside2/libpyside/pysideweakref.cpp @@ -53,7 +53,7 @@ static PyObject* CallableObject_call(PyObject* callable_object, PyObject* args, static PyType_Slot PySideCallableObjectType_slots[] = { {Py_tp_call, (void *)CallableObject_call}, - {Py_tp_dealloc, (void *)SbkDummyDealloc}, + {Py_tp_dealloc, (void *)object_dealloc}, {0, 0} }; static PyType_Spec PySideCallableObjectType_spec = { -- cgit v1.2.3