summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorTodd C. Miller <millert@cvs.openbsd.org>2001-10-04 19:28:59 +0000
committerTodd C. Miller <millert@cvs.openbsd.org>2001-10-04 19:28:59 +0000
commitae5b5a4e1611598bca0b0b2aa968731d406caccc (patch)
tree1c6733b1fe94f2e35f678a1ba4404fe1a84c1c91 /usr.bin
parent7edbc4af941083c1b1a127ec9fb8813c69d7af18 (diff)
Deal with whois output that lacks a final newline. This is not legal
but apparently there are broken whois servers out there.
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/whois/whois.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/usr.bin/whois/whois.c b/usr.bin/whois/whois.c
index 3b492e2eb33..3321624d5c9 100644
--- a/usr.bin/whois/whois.c
+++ b/usr.bin/whois/whois.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: whois.c,v 1.11 2000/07/12 18:01:57 itojun Exp $ */
+/* $OpenBSD: whois.c,v 1.12 2001/10/04 19:28:58 millert Exp $ */
/*
* Copyright (c) 1980, 1993
@@ -43,7 +43,7 @@ static char copyright[] =
#if 0
static char sccsid[] = "@(#)whois.c 8.1 (Berkeley) 6/6/93";
#else
-static char rcsid[] = "$OpenBSD: whois.c,v 1.11 2000/07/12 18:01:57 itojun Exp $";
+static char rcsid[] = "$OpenBSD: whois.c,v 1.12 2001/10/04 19:28:58 millert Exp $";
#endif
#endif /* not lint */
@@ -203,7 +203,7 @@ whois(name, res, flags)
int flags;
{
FILE *sfi, *sfo;
- char *buf, *p, *nhost;
+ char *buf, *p, *nhost, *nbuf = NULL;
size_t len;
int s, nomatch;
const char *reason = NULL;
@@ -242,8 +242,14 @@ whois(name, res, flags)
while ((buf = fgetln(sfi, &len))) {
if (buf[len - 2] == '\r')
buf[len - 2] = '\0';
- else
+ else if (buf[len - 1] == '\n')
buf[len - 1] = '\0';
+ else {
+ nbuf = malloc(len + 1);
+ memcpy(nbuf, buf, len);
+ nbuf[len] = '\0';
+ buf = nbuf;
+ }
if ((flags & WHOIS_RECURSE) && !nhost &&
(p = strstr(buf, "Whois Server: "))) {
@@ -264,6 +270,8 @@ whois(name, res, flags)
}
(void)puts(buf);
}
+ if (nbuf)
+ free(nbuf);
/* Do second lookup as needed */
if (nomatch && !nhost) {