diff options
author | Jeremie Courreges-Anglas <jca@cvs.openbsd.org> | 2018-06-19 11:28:12 +0000 |
---|---|---|
committer | Jeremie Courreges-Anglas <jca@cvs.openbsd.org> | 2018-06-19 11:28:12 +0000 |
commit | 9461db4e963d9472a1c6997b4322f2420e8ec301 (patch) | |
tree | 7634295568efd5e60994b01044bf0448cce305ac | |
parent | 57436230755cc8f123e77d7f7ac1a438cba5e871 (diff) |
Plug getaddrinfo(3) memory leak
choose_server() calls getaddrinfo(3) but never frees the result.
Minimal fix that relies on getaddrinfo(3) only updating the "res"
pointer if the call was successful.
While here, call freeaddrinfo(3) earlier in whois(), less code and less
overall memory used since whois() can recurse.
ok millert@ tb@ benno@
-rw-r--r-- | usr.bin/whois/whois.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/usr.bin/whois/whois.c b/usr.bin/whois/whois.c index fe1fa224a66..13df7a7b9f1 100644 --- a/usr.bin/whois/whois.c +++ b/usr.bin/whois/whois.c @@ -1,4 +1,4 @@ -/* $OpenBSD: whois.c,v 1.57 2018/06/17 15:34:54 florian Exp $ */ +/* $OpenBSD: whois.c,v 1.58 2018/06/19 11:28:11 jca Exp $ */ /* * Copyright (c) 1980, 1993 @@ -196,13 +196,13 @@ whois(const char *query, const char *server, const char *port, int flags) } break; /*okay*/ } + freeaddrinfo(res); if (s == -1) { if (reason) { errno = error; warn("%s: %s", server, reason); } else warn("unknown error in connection attempt"); - freeaddrinfo(res); return (1); } @@ -269,7 +269,7 @@ whois(const char *query, const char *server, const char *port, int flags) error = whois(query, nhost, port, 0); free(nhost); } - freeaddrinfo(res); + return (error); } @@ -287,7 +287,7 @@ choose_server(const char *name, const char *country, char **tofree) char *server; const char *qhead; char *ep; - struct addrinfo hints, *res; + struct addrinfo hints, *res = NULL; memset(&hints, 0, sizeof(hints)); hints.ai_flags = 0; @@ -339,6 +339,8 @@ choose_server(const char *name, const char *country, char **tofree) if (asprintf(&server, "%s%s", qhead, QNICHOST_TAIL) == -1) err(1, NULL); } + if (res != NULL) + freeaddrinfo(res); *tofree = server; return (server); |