Discussion:
[python-win32] PyIMAPIProp.GetPropList() and Py_None ref count
Nick Czeczulin
2015-08-13 10:20:25 UTC
Permalink
I noticed that every call to PyIMAPIProp.GetPropList() causes the ref count for Py_None to increase by one. Can someone comment on whether the following patch seems correct, or if more might be needed?

Thanks,
-nick

--- a/com/win32comext/mapi/src/mapilib.i
+++ b/com/win32comext/mapi/src/mapilib.i
@@ -501,6 +501,8 @@
}

%typemap(python,argout) SPropTagArray **OUTPUT {
+ if ($target == Py_None)
+ Py_DECREF($target);
$target = PyMAPIObject_FromSPropTagArray(*$source);
if ($target==NULL) {
$cleanup;
Mark Hammond
2015-08-24 09:10:51 UTC
Permalink
Post by Nick Czeczulin
I noticed that every call to PyIMAPIProp.GetPropList() causes the ref
count for Py_None to increase by one. Can someone comment on whether the
following patch seems correct, or if more might be needed?
At face value it looks wrong, but I'm not sure without more digging what
the correct fix is, or why all other SWIG-based types don't have the
same issue. I'm getting to most of your other issues on SourceForge and
I suspect I wont find time to dig deeper on this before I make another
release as the consequences of this seem fairly small (I'm sure None has
many reference leaks :)

Cheers,

Mark
Post by Nick Czeczulin
Thanks,
-nick
--- a/com/win32comext/mapi/src/mapilib.i
+++ b/com/win32comext/mapi/src/mapilib.i
@@ -501,6 +501,8 @@
}
%typemap(python,argout) SPropTagArray **OUTPUT {
+ if ($target == Py_None)
+ Py_DECREF($target);
$target = PyMAPIObject_FromSPropTagArray(*$source);
if ($target==NULL) {
$cleanup;
_______________________________________________
python-win32 mailing list
https://mail.python.org/mailman/listinfo/python-win32
Nick Czeczulin
2015-08-25 14:35:46 UTC
Permalink
Post by Mark Hammond
Post by Nick Czeczulin
I noticed that every call to PyIMAPIProp.GetPropList() causes the ref
count for Py_None to increase by one. Can someone comment on whether the
following patch seems correct, or if more might be needed?
At face value it looks wrong, but I'm not sure without more digging what
the correct fix is, or why all other SWIG-based types don't have the
same issue. I'm getting to most of your other issues on SourceForge and
I suspect I wont find time to dig deeper on this before I make another
release as the consequences of this seem fairly small (I'm sure None has
many reference leaks :)
I've since submitted a patch after identifying the following in
pythoncom.i without clarifying in the patch description (only noting the
methods impacted):
%typemap(python,out) HRESULT {
$target = Py_None;
Py_INCREF(Py_None);
}

It can be verified in the generated .cpp file (See: GetPropsList):

{
_resultobj = Py_None;
Py_INCREF(Py_None);
}
{
_resultobj = PyMAPIObject_FromSPropTagArray(*_arg1);


Also, browsing mapilib.i's typemaps, only some test $target and call
Py_DECREF(), so the HRESULT typemap might be affecting some of the other
mapi calls as well for other output types. But, I definitely understand
your point on it being better to leak a Py_None ref than the alternative
due to a misunderstanding on my part.

Regarding my other outstanding patches, please ignore #138 for now --
I'd like to update it to be consistent with the updates you made for the
PT_MV_BINARY (#137) patch.

Thanks,
-nick
Post by Mark Hammond
Cheers,
Mark
Post by Nick Czeczulin
Thanks,
-nick
--- a/com/win32comext/mapi/src/mapilib.i
+++ b/com/win32comext/mapi/src/mapilib.i
@@ -501,6 +501,8 @@
}
%typemap(python,argout) SPropTagArray **OUTPUT {
+ if ($target == Py_None)
+ Py_DECREF($target);
$target = PyMAPIObject_FromSPropTagArray(*$source);
if ($target==NULL) {
$cleanup;
_______________________________________________
python-win32 mailing list
https://mail.python.org/mailman/listinfo/python-win32
Loading...