From: Richard Mudgett Date: Thu, 8 Oct 2009 16:33:06 +0000 (+0000) Subject: Fix memory leak if chan_misdn config parameter is repeated. X-Git-Tag: 1.4.27-rc3~58 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fd238638a01be3b02a0dbdf68608dc10f86b2533;p=thirdparty%2Fasterisk.git 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: https://origsvn.digium.com/svn/asterisk/branches/1.4@222797 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channels/misdn_config.c b/channels/misdn_config.c index 9d947f726a..fce0915bc2 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; }