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 /cdr/cdr_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 'cdr/cdr_radius.c')
-rw-r--r-- | cdr/cdr_radius.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/cdr/cdr_radius.c b/cdr/cdr_radius.c index 3a6190942..bf613284d 100644 --- a/cdr/cdr_radius.c +++ b/cdr/cdr_radius.c @@ -224,6 +224,10 @@ return_cleanup: static int unload_module(void) { ast_cdr_unregister(name); + if (rh) { + rc_destroy(rh); + rh = NULL; + } return 0; } @@ -243,8 +247,17 @@ static int load_module(void) } 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 @@ 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; } - ast_cdr_register(name, desc, radius_log); - return AST_MODULE_LOAD_SUCCESS; + 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", |