diff options
author | Richard Mudgett <rmudgett@digium.com> | 2011-06-03 22:15:56 +0000 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2011-06-03 22:15:56 +0000 |
commit | c8548bad22d2f9644c9d03b6a6121e59d7afe131 (patch) | |
tree | a49ef550a58ca5a70488b1635cdeab8727fa2736 /cel/cel_radius.c | |
parent | 31bcafab5bbdba6533ff50a2ebeb3e0ab1d0cc92 (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/cel_radius.c')
-rw-r--r-- | cel/cel_radius.c | 22 |
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; |