summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormillert <millert@openbsd.org>2017-03-17 14:59:01 +0000
committermillert <millert@openbsd.org>2017-03-17 14:59:01 +0000
commit92137d55a19deff593e792ca056ec69732a3bbe7 (patch)
tree0c05d0f925f14aa0265d672e64f7d527c589aec3
parentUse recallocarray() to avoid leaving detritus in memory when resizing (diff)
downloadwireguard-openbsd-92137d55a19deff593e792ca056ec69732a3bbe7.tar.xz
wireguard-openbsd-92137d55a19deff593e792ca056ec69732a3bbe7.zip
choose_server() does not always return malloc'd memory so pass
in a pointer that gets filled in when there is something to free. Noticed by sthen@ when looking up a numeric address.
-rw-r--r--usr.bin/whois/whois.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/usr.bin/whois/whois.c b/usr.bin/whois/whois.c
index 8fdadb1f24c..907d102b2f8 100644
--- a/usr.bin/whois/whois.c
+++ b/usr.bin/whois/whois.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: whois.c,v 1.54 2017/03/15 16:45:25 millert Exp $ */
+/* $OpenBSD: whois.c,v 1.55 2017/03/17 14:59:01 millert Exp $ */
/*
* Copyright (c) 1980, 1993
@@ -73,13 +73,13 @@ const char *ip_whois[] = { LNICHOST, RNICHOST, PNICHOST, BNICHOST,
__dead void usage(void);
int whois(const char *, const char *, const char *, int);
-char *choose_server(const char *, const char *);
+char *choose_server(const char *, const char *, char **);
int
main(int argc, char *argv[])
{
int ch, flags, rval;
- char *host, *name, *country, *server;
+ char *host, *name, *country;
country = host = NULL;
flags = rval = 0;
@@ -148,10 +148,11 @@ main(int argc, char *argv[])
if (host == NULL && country == NULL && !(flags & WHOIS_QUICK))
flags |= WHOIS_RECURSE;
for (name = *argv; (name = *argv) != NULL; argv++) {
- server = host ? host : choose_server(name, country);
+ char *tofree = NULL;
+ const char *server =
+ host ? host : choose_server(name, country, &tofree);
rval += whois(name, server, port_whois, flags);
- if (host == NULL)
- free(server);
+ free(tofree);
}
return (rval);
}
@@ -280,7 +281,7 @@ whois(const char *query, const char *server, const char *port, int flags)
* ASN (starts with AS). Fall back to NICHOST for the non-handle case.
*/
char *
-choose_server(const char *name, const char *country)
+choose_server(const char *name, const char *country, char **tofree)
{
char *server;
const char *qhead;
@@ -336,6 +337,7 @@ choose_server(const char *name, const char *country)
err(1, NULL);
}
+ *tofree = server;
return (server);
}