Apache Mod-Python - Closed: (MODPYTHON-181) Memory leak when using handlers in

This is Interesting: Free IT Magazines  
Home > Archive > Apache Mod-Python > May 2007 > Closed: (MODPYTHON-181) Memory leak when using handlers in





You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

Author Closed: (MODPYTHON-181) Memory leak when using handlers in
Graham Dumpleton (JIRA)

2007-05-01, 7:12 am


[ https://issues.apache.org/jira/brow...ls: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);


Sponsored Links






Free braindumps | Software forum | Database administration forum

Copyright 2003 - 2008 webservertalk.com