diff options
author | Tobias Brunner <tobias@strongswan.org> | 2011-04-14 15:30:47 +0200 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2011-04-14 18:11:45 +0200 |
commit | 6045eaa54aa4cad6837efa4ca07771bd11b9e9d7 (patch) | |
tree | 4ec88ea5b113aad98b5dd19ea564726a2479c839 /src | |
parent | 862ef49f85cf5a7656210022aa6523234e06f2b7 (diff) | |
download | strongswan-6045eaa54aa4cad6837efa4ca07771bd11b9e9d7.tar.bz2 strongswan-6045eaa54aa4cad6837efa4ca07771bd11b9e9d7.tar.xz |
pluto: Fixed potential memory leak in atoaddr.
Diffstat (limited to 'src')
-rw-r--r-- | src/libfreeswan/atoaddr.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/src/libfreeswan/atoaddr.c b/src/libfreeswan/atoaddr.c index 8f1be0a84..a3643801e 100644 --- a/src/libfreeswan/atoaddr.c +++ b/src/libfreeswan/atoaddr.c @@ -45,7 +45,7 @@ struct in_addr *addrp; { struct addrinfo hints, *res; struct netent *ne = NULL; - const char *oops; + const char *oops, *msg = NULL; # define HEXLEN 10 /* strlen("0x11223344") */ # ifndef ATOADDRBUF # define ATOADDRBUF 100 @@ -84,10 +84,18 @@ struct in_addr *addrp; /* next, check that it's a vaguely legal name */ for (q = p; *q != '\0'; q++) + { if (!isprint(*q)) - return "unprintable character in name"; + { + msg = "unprintable character in name"; + goto error; + } + } if (strspn(p, namechars) != srclen) - return "illegal (non-DNS-name) character in name"; + { + msg = "illegal (non-DNS-name) character in name"; + goto error; + } /* try as host name, failing that as /etc/networks network name */ memset(&hints, 0, sizeof(hints)); @@ -98,11 +106,8 @@ struct in_addr *addrp; ne = getnetbyname(p); if (ne == NULL) { - if (p != namebuf) - { - FREE(p); - } - return "name lookup failed"; + msg = "name lookup failed"; + goto error; } addrp->s_addr = htonl(ne->n_net); } @@ -113,12 +118,13 @@ struct in_addr *addrp; freeaddrinfo(res); } +error: if (p != namebuf) { FREE(p); } - return NULL; + return msg; } /* |