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.