You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mod_python-dev@quetz.apache.org by "Graham Dumpleton (JIRA)" <ji...@apache.org> on 2007/05/01 12:39:15 UTC
[jira] Closed: (MODPYTHON-181) Memory leak when using handlers in
multiple phases at same time.
[ https://issues.apache.org/jira/browse/MODPYTHON-181?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Graham Dumpleton closed MODPYTHON-181.
--------------------------------------
> Memory leak when using handlers in multiple phases at same time.
> ----------------------------------------------------------------
>
> Key: MODPYTHON-181
> URL: https://issues.apache.org/jira/browse/MODPYTHON-181
> Project: mod_python
> Issue Type: Bug
> Components: core
> Affects Versions: 3.1.4, 3.3, 3.2.8
> Reporter: Graham Dumpleton
> Assigned To: Graham Dumpleton
> Fix For: 3.3
>
>
> When using handlers against multiple phases, ie.,
> # .htaccess
> PythonFixupHandler handlers
> AddHandler mod_python .py
> PythonHandler handlers
> # handlers.py
> from mod_python import apache
> def handler(req):
> req.content_type = 'text/plain'
> req.write('handler')
> return apache.OK
> def fixuphandler(req):
> return apache.OK
> mod_python will leak memory on each request, which Apache child process sizes blowing out quite quickly.
> The problem code is in python_handler() in 'src/mod_python.c'. Specifically the code does:
> if (!hle) {
> /* create a handler list object from dynamically registered handlers */
> request_obj->hlo = (hlistobject *)MpHList_FromHLEntry(dynhle, 1);
> }
> else {
> /* create a handler list object */
> request_obj->hlo = (hlistobject *)MpHList_FromHLEntry(hle, 1);
> /* add dynamically registered handlers, if any */
> if (dynhle) {
> MpHList_Append(request_obj->hlo, dynhle);
> }
> }
> Problem is that request_obj->hlo can already be set by a prior phase's handler and by simply assigning to request_obj->hlo you get a memory leak as it refers to an existing Python object and it isn't being decref'd.
> Thus, before this 'if' statement, it would appear that the following should
> be inserted.
> if (request_obj->hlo)
> Py_DECREF(request_obj->hlo);
> or:
> Py_XDECREF(request_obj->hlo);
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.