[Freeswitch-svn] [commit] r5626 - freeswitch/trunk/src/mod/languages/mod_python

Freeswitch SVN greenlizard at freeswitch.org
Mon Aug 20 12:43:42 EDT 2007


Author: greenlizard
Date: Mon Aug 20 12:43:42 2007
New Revision: 5626

Modified:
   freeswitch/trunk/src/mod/languages/mod_python/freeswitch_python.cpp

Log:
fix a bug introduced in last mod_python commit on greenlizard branch where dtmfs will segfault the switch due to an incorrect Py_XDECREF.

Modified: freeswitch/trunk/src/mod/languages/mod_python/freeswitch_python.cpp
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_python/freeswitch_python.cpp	(original)
+++ freeswitch/trunk/src/mod/languages/mod_python/freeswitch_python.cpp	Mon Aug 20 12:43:42 2007
@@ -109,7 +109,7 @@
 
    PyObject *func, *arglist;
    PyObject *pyresult;
-   PyObject* headerdict;
+   PyObject *headerdict;
 
    char *resultStr;
    char *funcargs;
@@ -159,6 +159,10 @@
 	 headerdict = PyDict_New();	
 	 for (hp = event->headers; hp; hp = hp->next) {
 	   switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Adding event header to result");	
+	
+	   // TODO: create PyObject pointers for name and value
+	   // and explicitly decref them.  all ref counting stuff is 
+	   // a mess and needs to be tested and looked at closer.
 	   PyDict_SetItem(headerdict, 
 					  Py_BuildValue("s", hp->name),
 					  Py_BuildValue("s", hp->value));
@@ -172,7 +176,9 @@
 						  "headers",
 						  headerdict);
 
-	 //arglist = Py_BuildValue("(sis)", event->body, itype, funcargs);
+	 Py_XDECREF(headerdict);                          
+
+
    }
    else {
         switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unknown input type: %d\n", itype);	
@@ -189,10 +195,9 @@
    did_swap_in = end_allow_threads();
 	
    pyresult = PyEval_CallObject(func, arglist);    
-   
+
 
    Py_XDECREF(arglist);                           // Trash arglist
-   Py_XDECREF(headerdict);                          
 
    if (pyresult && pyresult != Py_None) {                       
        resultStr = (char *) PyString_AsString(pyresult);
@@ -200,7 +205,7 @@
        return cbresult;
    }
    else {
-       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Python callback\n returned None");
+       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Python callback\n returned None");
        PyErr_Print();
        PyErr_Clear();
    }



More information about the Freeswitch-svn mailing list