[ 
http://issues.apache.org/jira/browse/MODPYTHON-181?page=comments#action_12425493
 ] 
            
Graham Dumpleton commented on MODPYTHON-181:
--------------------------------------------

Note that you will not actually see this change in the trunk now as changes 
related to MODPYTHON-155 have eliminated it, with the same handler list object 
now being kept for the whole life of the request and simply reused.

> 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