[ http://issues.apache.org/jira/browse/MODPYTHON-181?page=all ]

Graham Dumpleton resolved MODPYTHON-181.
----------------------------------------

    Fix Version/s: 3.3
       Resolution: Fixed

> Memory leak when using handlers in multiple phases at same time.
> ----------------------------------------------------------------
>
>                 Key: MODPYTHON-181
>                 URL: http://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.
-
If you think it was sent incorrectly contact one of the administrators: 
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to