From e605e670b174c07052969bcc46baf408d319032d Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Sun, 17 Oct 2021 14:56:50 -0400 Subject: [PATCH 1/2] Fix vaultOperation Python object leak. This fixes a leak of a Python bound method. Leaking this means that PythonFileMods keys are still loaded when the client exits. These methods are most commonly used by xSimpleImager.py, so the effect of the leak can be observed by simply linking to Relto and quitting with a leak detector active. --- Sources/Plasma/FeatureLib/pfPython/pyVaultNode.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Sources/Plasma/FeatureLib/pfPython/pyVaultNode.cpp b/Sources/Plasma/FeatureLib/pfPython/pyVaultNode.cpp index 15ab3ea6..07d92d9e 100644 --- a/Sources/Plasma/FeatureLib/pfPython/pyVaultNode.cpp +++ b/Sources/Plasma/FeatureLib/pfPython/pyVaultNode.cpp @@ -123,6 +123,8 @@ void pyVaultNode::pyVaultNodeOperationCallback::VaultOperationStarted( UInt32 co PyObject* retVal = PyObject_CallMethod(fCbObject, "vaultOperationStarted", "l", context); Py_XDECREF(retVal); } + + Py_DECREF(func); } } } @@ -150,6 +152,8 @@ void pyVaultNode::pyVaultNodeOperationCallback::VaultOperationComplete( UInt32 c Py_XDECREF(retVal); Py_DECREF(t); } + + Py_DECREF(func); } } } From fd3b9ac5eccc2949465aa00c328e07aa64ca4fc6 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Sun, 17 Oct 2021 15:13:12 -0400 Subject: [PATCH 2/2] Fix reference counting problem in pyVaultNode::AddNode(). This is fixed in H'uru via extensive use of RAII around vault nodes. --- Sources/Plasma/FeatureLib/pfPython/pyVaultNode.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Sources/Plasma/FeatureLib/pfPython/pyVaultNode.cpp b/Sources/Plasma/FeatureLib/pfPython/pyVaultNode.cpp index 07d92d9e..534bc3fc 100644 --- a/Sources/Plasma/FeatureLib/pfPython/pyVaultNode.cpp +++ b/Sources/Plasma/FeatureLib/pfPython/pyVaultNode.cpp @@ -441,7 +441,8 @@ PyObject* pyVaultNode::AddNode(pyVaultNode* pynode, PyObject* cbObject, UInt32 c ); if (newNode) { - newNode->IncRef(); + // No need to increment the newNode's reference count; the pynode + // will steal the current reference. pynode->fNode->DecRef(); pynode->fNode = newNode; }