From 81b7f1b010789cc6a345454c677e69bf2e5c8a3b Mon Sep 17 00:00:00 2001 From: Derrick Brashear Date: Mon, 8 Mar 2010 15:58:42 -0500 Subject: [PATCH] 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 --- src/auth/cellconfig.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) 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; -- 2.39.5