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. What I don't get is
how ProfilerError could fail to be NULL in the first 'if' above, but
that's a different matter.
While we're at strange refcounting problems, PyModule_AddObject() only
decrefs its last argument if no error occurs. This is probably wrong.
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. But for
example, the following is common:
m = Py_InitModule3("xxx", NULL, module_doc);
Py_INCREF(&Xxx_Type);
PyModule_AddObject(m, "Xxx", (PyObject *)&Xxx_Type);
This generates a segfault if Py_InitModule3() returns NULL (however rare
that situation is).
A bientot,
Armin
_______________________________________________
Python-Dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com