aboutsummaryrefslogtreecommitdiffstats
path: root/channels/misdn_config.c
diff options
context:
space:
mode:
authorrmudgett <rmudgett@f38db490-d61c-443f-a65b-d21fe96a405b>2009-10-08 16:33:06 +0000
committerrmudgett <rmudgett@f38db490-d61c-443f-a65b-d21fe96a405b>2009-10-08 16:33:06 +0000
commitba55867984d38a8fd963ae4c577b0e91c6799fca (patch)
tree05ab46d2c9d847667170e202ea15e57f2e5cbf43 /channels/misdn_config.c
parente6b95039ea705a3f11b063c490be08aa1f3acc93 (diff)
Fix memory leak if chan_misdn config parameter is repeated.
Memory leak when the same config option is set more than once in an misdn.conf section. Why must this be considered? Templates! Defining a template with default port options and later adding to or overriding some of them. Patches: memleak-misdn.patch JIRA ABE-1998 git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@222797 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/misdn_config.c')
-rw-r--r--channels/misdn_config.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/channels/misdn_config.c b/channels/misdn_config.c
index 9d947f726..fce0915bc 100644
--- a/channels/misdn_config.c
+++ b/channels/misdn_config.c
@@ -878,6 +878,9 @@ static int _parse (union misdn_cfg_pt *dest, char *value, enum misdn_cfg_type ty
switch (type) {
case MISDN_CTYPE_STR:
+ if (dest->str) {
+ free(dest->str);
+ }
if ((len = strlen(value))) {
dest->str = (char *)malloc((len + 1) * sizeof(char));
strncpy(dest->str, value, len);
@@ -895,18 +898,24 @@ static int _parse (union misdn_cfg_pt *dest, char *value, enum misdn_cfg_type ty
else
pat="%30d";
if (sscanf(value, pat, &tmp)) {
- dest->num = (int *)malloc(sizeof(int));
+ if (!dest->num) {
+ dest->num = (int *)malloc(sizeof(int));
+ }
memcpy(dest->num, &tmp, sizeof(int));
} else
re = -1;
}
break;
case MISDN_CTYPE_BOOL:
- dest->num = (int *)malloc(sizeof(int));
+ if (!dest->num) {
+ dest->num = (int *)malloc(sizeof(int));
+ }
*(dest->num) = (ast_true(value) ? 1 : 0);
break;
case MISDN_CTYPE_BOOLINT:
- dest->num = (int *)malloc(sizeof(int));
+ if (!dest->num) {
+ dest->num = (int *)malloc(sizeof(int));
+ }
if (sscanf(value, "%30d", &tmp)) {
memcpy(dest->num, &tmp, sizeof(int));
} else {
@@ -925,7 +934,9 @@ static int _parse (union misdn_cfg_pt *dest, char *value, enum misdn_cfg_type ty
}
break;
case MISDN_CTYPE_ASTGROUP:
- dest->grp = (ast_group_t *)malloc(sizeof(ast_group_t));
+ if (!dest->grp) {
+ dest->grp = (ast_group_t *)malloc(sizeof(ast_group_t));
+ }
*(dest->grp) = ast_get_group(value);
break;
}