summaryrefslogtreecommitdiff
path: root/cel
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2011-06-03 22:15:56 +0000
committerRichard Mudgett <rmudgett@digium.com>2011-06-03 22:15:56 +0000
commitc8548bad22d2f9644c9d03b6a6121e59d7afe131 (patch)
treea49ef550a58ca5a70488b1635cdeab8727fa2736 /cel
parent31bcafab5bbdba6533ff50a2ebeb3e0ab1d0cc92 (diff)
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 ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@321927 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'cel')
-rw-r--r--cel/cel_radius.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/cel/cel_radius.c b/cel/cel_radius.c
index 6ffd9fef8..f5ccb5f8a 100644
--- a/cel/cel_radius.c
+++ b/cel/cel_radius.c
@@ -206,6 +206,10 @@ static int unload_module(void)
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 @@ static int load_module(void)
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 @@ static int load_module(void)
/* 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;