From: Derrick Brashear Date: Mon, 8 Mar 2010 20:58:42 +0000 (-0500) Subject: afsdb lookup shouldn't leak memory on realname lookup X-Git-Tag: openafs-devel-1_5_73~59 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=81b7f1b010789cc6a345454c677e69bf2e5c8a3b;p=packages%2Fo%2Fopenafs.git afsdb lookup shouldn't leak memory on realname lookup when looking up the "real" cell name, avoid leaking memory. the strdup is inside a loop and would leak memory for each host returned above one. Change-Id: I36cc9bd27ddc831121f47046daaab11f752012fe Reviewed-on: http://gerrit.openafs.org/1538 Reviewed-by: Jeffrey Altman Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear --- diff --git a/src/auth/cellconfig.c b/src/auth/cellconfig.c index 20099789b..dc93411ba 100644 --- a/src/auth/cellconfig.c +++ b/src/auth/cellconfig.c @@ -1120,7 +1120,8 @@ afsconf_LookupServer(const char *service, const char *protocol, * right AFSDB type. Write down the true cell name that * the resolver gave us above. */ - realCellName = strdup(host); + if (!realCellName) + realCellName = strdup(host); } code = dn_expand(answer, answer + len, p + 2, host, sizeof(host)); @@ -1151,8 +1152,9 @@ afsconf_LookupServer(const char *service, const char *protocol, if ((strncmp(host + 1, IANAname, strlen(IANAname)) == 0) && (strncmp(host + strlen(IANAname) + 3, protocol, strlen(protocol)) == 0)) { - realCellName = strdup(host + strlen(IANAname) + - strlen(protocol) + 4); + if (!realCellName) + realCellName = strdup(host + strlen(IANAname) + + strlen(protocol) + 4); } code = dn_expand(answer, answer + len, p + 6, host, sizeof(host)); @@ -1193,17 +1195,18 @@ afsconf_LookupServer(const char *service, const char *protocol, *p = tolower(*p); } - *arealCellName = realCellName; - *numServers = server_num; *ttl = minttl ? (time(0) + minttl) : 0; - if ( *numServers > 0 ) + if ( *numServers > 0 ) { code = 0; - else + *arealCellName = realCellName; + } else code = AFSCONF_NOTFOUND; findservererror: + if (code && realCellName) + free(realCellName); free(dotcellname); return code; } @@ -1244,9 +1247,11 @@ afsconf_GetAfsdbInfo(char *acellName, char *aservice, acellInfo->hostAddr[i].sin_family = AF_INET; acellInfo->hostAddr[i].sin_port = ports[i]; - if (realCellName) + if (realCellName) { strlcpy(acellInfo->name, realCellName, sizeof(acellInfo->name)); + free(realCellName); + } } acellInfo->linkedCell = NULL; /* no linked cell */ acellInfo->flags = 0;