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

This is Interesting: Free IT Magazines  
Home > Archive > Apache Mod-Python > July 2006 > Created: (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 Created: (MODPYTHON-181) Memory leak when using handlers in
Graham Dumpleton (JIRA)

2006-07-31, 7:12 am

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.2.8, 3.1.4, 3.3
Reporter: Graham Dumpleton
Assigned To: Graham Dumpleton


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