[asterisk-commits] rmudgett: trunk r321927 - in /trunk: ./ cdr/cdr_radius.c cel/cel_radius.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri Jun 3 17:16:00 CDT 2011


Author: rmudgett
Date: Fri Jun  3 17:15:56 2011
New Revision: 321927

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=321927
Log:
Merged revisions 321926 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.8

........
  r321926 | rmudgett | 2011-06-03 17:09:36 -0500 (Fri, 03 Jun 2011) | 18 lines
  
  Asterisk crash when unloading cdr_radius/cel_radius.
  
  The rc_openlog() API call is passed a string that is used by openlog() to
  format log messages.  The openlog() does not copy the string it just keeps
  a pointer to it.  When the module is unloaded, the string is gone from
  memory.  Depending upon module load order and if the other module then has
  an error, a crash happens.
  
  * Pass rc_openlog() a strdup'd string with the understanding that there
  will be a small memory leak if the cdr_radius/cel_radius modules are
  unloaded.
  
  * Call rc_destroy() to free the rc handle memory when the module is
  unloaded.
  
  JIRA AST-483
  JIRA SWP-3062
........

Modified:
    trunk/   (props changed)
    trunk/cdr/cdr_radius.c
    trunk/cel/cel_radius.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.8-merged' - no diff available.

Modified: trunk/cdr/cdr_radius.c
URL: http://svnview.digium.com/svn/asterisk/trunk/cdr/cdr_radius.c?view=diff&rev=321927&r1=321926&r2=321927
==============================================================================
--- trunk/cdr/cdr_radius.c (original)
+++ trunk/cdr/cdr_radius.c Fri Jun  3 17:15:56 2011
@@ -224,6 +224,10 @@
 static int unload_module(void)
 {
 	ast_cdr_unregister(name);
+	if (rh) {
+		rc_destroy(rh);
+		rh = NULL;
+	}
 	return 0;
 }
 
@@ -243,8 +247,17 @@
 	} else
 		return AST_MODULE_LOAD_DECLINE;
 
-	/* start logging */
-	rc_openlog("asterisk");
+	/*
+	 * start logging
+	 *
+	 * NOTE: Yes this causes a slight memory leak if the module is
+	 * unloaded.  However, it is better than a crash if cdr_radius
+	 * and cel_radius are both loaded.
+	 */
+	tmp = ast_strdup("asterisk");
+	if (tmp) {
+		rc_openlog((char *) tmp);
+	}
 
 	/* read radiusclient-ng config file */
 	if (!(rh = rc_read_config(radiuscfg))) {
@@ -255,11 +268,18 @@
 	/* read radiusclient-ng dictionaries */
 	if (rc_read_dictionary(rh, rc_conf_str(rh, "dictionary"))) {
 		ast_log(LOG_NOTICE, "Cannot load radiusclient-ng dictionary file.\n");
-		return AST_MODULE_LOAD_DECLINE;
-	}
-
-	ast_cdr_register(name, desc, radius_log);
-	return AST_MODULE_LOAD_SUCCESS;
+		rc_destroy(rh);
+		rh = NULL;
+		return AST_MODULE_LOAD_DECLINE;
+	}
+
+	if (ast_cdr_register(name, desc, radius_log)) {
+		rc_destroy(rh);
+		rh = NULL;
+		return AST_MODULE_LOAD_DECLINE;
+	} else {
+		return AST_MODULE_LOAD_SUCCESS;
+	}
 }
 
 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "RADIUS CDR Backend",

Modified: trunk/cel/cel_radius.c
URL: http://svnview.digium.com/svn/asterisk/trunk/cel/cel_radius.c?view=diff&rev=321927&r1=321926&r2=321927
==============================================================================
--- trunk/cel/cel_radius.c (original)
+++ trunk/cel/cel_radius.c Fri Jun  3 17:15:56 2011
@@ -206,6 +206,10 @@
 	if (event_sub) {
 		event_sub = ast_event_unsubscribe(event_sub);
 	}
+	if (rh) {
+		rc_destroy(rh);
+		rh = NULL;
+	}
 	return AST_MODULE_LOAD_SUCCESS;
 }
 
@@ -225,8 +229,17 @@
 		return AST_MODULE_LOAD_DECLINE;
 	}
 
-	/* start logging */
-	rc_openlog("asterisk");
+	/*
+	 * start logging
+	 *
+	 * NOTE: Yes this causes a slight memory leak if the module is
+	 * unloaded.  However, it is better than a crash if cdr_radius
+	 * and cel_radius are both loaded.
+	 */
+	tmp = ast_strdup("asterisk");
+	if (tmp) {
+		rc_openlog((char *) tmp);
+	}
 
 	/* read radiusclient-ng config file */
 	if (!(rh = rc_read_config(radiuscfg))) {
@@ -237,12 +250,15 @@
 	/* read radiusclient-ng dictionaries */
 	if (rc_read_dictionary(rh, rc_conf_str(rh, "dictionary"))) {
 		ast_log(LOG_NOTICE, "Cannot load radiusclient-ng dictionary file.\n");
+		rc_destroy(rh);
+		rh = NULL;
 		return AST_MODULE_LOAD_DECLINE;
 	}
 
 	event_sub = ast_event_subscribe(AST_EVENT_CEL, radius_log, "CEL Radius Logging", NULL, AST_EVENT_IE_END);
-
 	if (!event_sub) {
+		rc_destroy(rh);
+		rh = NULL;
 		return AST_MODULE_LOAD_DECLINE;
 	} else {
 		return AST_MODULE_LOAD_SUCCESS;




More information about the asterisk-commits mailing list