[Python-Dev] refcounting vs PyModule_AddObject
Michael Hudson
mwh at python.net
Wed Jun 15 16:17:02 CEST 2005
Armin Rigo <arigo at tunes.org> writes:
> Hi Michael,
>
> On Wed, Jun 15, 2005 at 01:35:35PM +0100, Michael Hudson wrote:
>> if (ProfilerError == NULL)
>> ProfilerError = PyErr_NewException("hotshot.ProfilerError",
>> NULL, NULL);
>> if (ProfilerError != NULL) {
>> Py_INCREF(ProfilerError);
>> PyModule_AddObject(module, "ProfilerError", ProfilerError);
>> }
>
> I think the Py_INCREF is needed here. The ProfilerError is a global
> variable that needs the extra reference. Otherwise, a malicious user
> could do "del _hotshot.ProfilerError" and have it garbage-collected
> under the feet of _hotshot.c which still uses it.
Hmm. Point. But then how doesn't this apply to things like 'del
thread._local'? (after my recent fix)
> What I don't get is how ProfilerError could fail to be NULL in the
> first 'if' above, but that's a different matter.
Well, could it fail to be NULL in the multiple interpreters case?
Though I'm not at all sure that reusing is wise in that case...
> While we're at strange refcounting problems, PyModule_AddObject() only
> decrefs its last argument if no error occurs. This is probably wrong.
Quite probably :-/
> In general I've found that the C modules' init code is fragile. This
> might be due to the idea that it runs only once anyway, and global
> C-module objects are immortal anyway, so sloppiness sneaks in.
Oh yes.
Cheers,
mwh
--
It's actually a corruption of "starling". They used to be carried.
Since they weighed a full pound (hence the name), they had to be
carried by two starlings in tandem, with a line between them.
-- Alan J Rosenthal explains "Pounds Sterling" on asr
More information about the Python-Dev
mailing list