This patch plugs several memory leaks, all in the
osrf_json_gateway_method_handler function:

1. osrf_locale, allocated by either buffer_release() or strdup().

2. A series of buffers allocated by apacheGetFirstParamValue():

    param_locale
    service
    method
    format
    input_format
    a_l
    tout

As I have noted before, this file doesn't compile on my system because
I haven't installed the Apache headers.  So the patch may require
closer attention than usual.

Scott McKellar
http://home.swbelll.net/mck9/ct/

Developer's Certificate of Origin 1.1 By making a contribution to
this project, I certify that:

(a) The contribution was created in whole or in part by me and I
have the right to submit it under the open source license indicated
in the file; or

(b) The contribution is based upon previous work that, to the best
of my knowledge, is covered under an appropriate open source license
and I have the right under that license to submit that work with
modifications, whether created in whole or in part by me, under the
same open source license (unless I am permitted to submit under a
different license), as indicated in the file; or

(c) The contribution was provided directly to me by some other person
who certified (a), (b) or (c) and I have not modified it; and

(d) In the case of each of (a), (b), or (c), I understand and agree
that this project and the contribution are public and that a record
of the contribution (including all personal information I submit
with it, including my sign-off) is maintained indefinitely and may
be redistributed consistent with this project or the open source
license indicated in the file.
*** ./trunk/src/gateway/osrf_json_gateway.c	2008-01-01 11:42:56.000000000 -0600
--- ./trunk-mod/src/gateway/osrf_json_gateway.c	2008-01-01 22:14:31.000000000 -0600
***************
*** 172,180 ****
  	mparams			= apacheGetParamValues( params, "param" ); /* free me */
  
  	if(format == NULL)
! 		format = "json";
  	if(input_format == NULL)
! 		input_format = format;
  
  	/* set the user defined timeout value */
  	int timeout = 60;
--- 172,180 ----
  	mparams			= apacheGetParamValues( params, "param" ); /* free me */
  
  	if(format == NULL)
! 		format = strdup( "json" );
  	if(input_format == NULL)
! 		input_format = strdup( format );
  
  	/* set the user defined timeout value */
  	int timeout = 60;
***************
*** 182,191 ****
  	if( tout ) {
  		timeout = atoi(tout);
  		osrfLogDebug(OSRF_LOG_MARK, "Client supplied timeout of %d", timeout);
  	}
  
! 	if (a_l)
  		api_level = atoi(a_l);
  
  	if (!strcasecmp(format, "xml")) {
  		isXML = 1;
--- 182,194 ----
  	if( tout ) {
  		timeout = atoi(tout);
  		osrfLogDebug(OSRF_LOG_MARK, "Client supplied timeout of %d", timeout);
+ 		free( tout );
  	}
  
! 	if (a_l) {
  		api_level = atoi(a_l);
+ 		free( a_l );
+ 	}
  
  	if (!strcasecmp(format, "xml")) {
  		isXML = 1;
***************
*** 194,199 ****
--- 197,203 ----
  		ap_set_content_type(r, "text/plain");
  	}
  
+ 	free( format );
  	int ret = OK;
  
  	/* ----------------------------------------------------------------- */
***************
*** 285,291 ****
  
  
  		if( req_id == -1 ) {
! 			osrfLogError(OSRF_LOG_MARK, "I am unable to communcate with opensrf..going away...");
  			/* we don't want to spawn an intense re-forking storm 
  			 * if there is no jabber server.. so give it some time before we die */
  			usleep( 100000 ); /* 100 milliseconds */
--- 289,295 ----
  
  
  		if( req_id == -1 ) {
! 			osrfLogError(OSRF_LOG_MARK, "I am unable to communicate with opensrf..going away...");
  			/* we don't want to spawn an intense re-forking storm 
  			 * if there is no jabber server.. so give it some time before we die */
  			usleep( 100000 ); /* 100 milliseconds */
***************
*** 417,422 ****
--- 421,430 ----
  	osrfLogInfo(OSRF_LOG_MARK, "Completed processing service=%s, method=%s", service, method);
  	string_array_destroy(params);
  	string_array_destroy(mparams);
+ 	free( osrf_locale );
+ 	free( input_format );
+ 	free( method );
+ 	free( service );
  
  	osrfLogDebug(OSRF_LOG_MARK, "Gateway served %d requests", ++numserved);
  	osrfLogClearXid();

Reply via email to