Todd C. Miller <[EMAIL PROTECTED]> writes: > In message <[EMAIL PROTECTED]> > so spake Mike Barcroft (mike): > > > Would you please test the attached patch and confirm that it solves > > the problem? If it does, I'll commit it today. > > I doubt that is sufficient as "buf" is treated as a NUL terminated > string in the calls to strstr(). Also note that it is not necessary > to copy the buffer each time as in the original patch. You can > only get a line w/o a newline as the last line before EOF.
After some discussion off the mailing list with Peter, I've come up with a total solution that is fairly elegant, but requires the new libc function strnstr(3) I posted earlier. Most of the patch is a cleanup of the current code. I'd appreciate reviews of this. I plan on committing it in a few days. The patch is at the end of this message and also at: http://people.FreeBSD.org/~mike/patches/whois.20011007.diff Best regards, Mike Barcroft ---------------------------------------------------------------------- whois.20011007.diff o Treat a buffer as a non-NUL terminated string, because the whois server may not return a new line character on the final line. o Remove the whois.networksolutions.com fallback code, which is no longer needed. o Instead of determining a hostname by terminating it when we see whitespace, only allow hostname characters and terminate the string when it's not such a character. o Add a small optimization in a for loop. PR: 30968 MFC after: 4 days Index: whois.c =================================================================== RCS file: /cvs/src/usr.bin/whois/whois.c,v retrieving revision 1.24 diff -u -r1.24 whois.c --- whois.c 5 Aug 2001 19:37:12 -0000 1.24 +++ whois.c 7 Oct 2001 21:38:04 -0000 @@ -71,11 +71,11 @@ #define SNICHOST "whois.6bone.net" #define DEFAULT_PORT "whois" #define WHOIS_SERVER_ID "Whois Server: " -#define NO_MATCH_ID "No match for \"" #define WHOIS_RECURSE 0x01 -#define WHOIS_INIC_FALLBACK 0x02 -#define WHOIS_QUICK 0x04 +#define WHOIS_QUICK 0x02 + +#define ishost(h) (isalnum((unsigned char)h) || h == '.' || h == '-') const char *ip_whois[] = { RNICHOST, PNICHOST, NULL }; const char *port = DEFAULT_PORT; @@ -164,7 +164,7 @@ use_qnichost = 1; host = NICHOST; if (!(flags & WHOIS_QUICK)) - flags |= WHOIS_INIC_FALLBACK | WHOIS_RECURSE; + flags |= WHOIS_RECURSE; } while (argc--) { if (country != NULL) { @@ -251,8 +251,8 @@ { FILE *sfi, *sfo; struct addrinfo *res2; - char *buf, *nhost, *p; - int i, nomatch, s; + char *buf, *host, *nhost, *p; + int i, s; size_t len; for (; res; res = res->ai_next) { @@ -273,45 +273,34 @@ fprintf(sfo, "%s\r\n", name); fflush(sfo); nhost = NULL; - nomatch = 0; while ((buf = fgetln(sfi, &len)) != NULL) { - while (len && isspace(buf[len - 1])) + while (len > 0 && isspace((unsigned char)buf[len - 1])) buf[--len] = '\0'; + printf("%.*s\n", (int)len, buf); if ((flags & WHOIS_RECURSE) && nhost == NULL) { - p = strstr(buf, WHOIS_SERVER_ID); - if (p != NULL) { - p += sizeof(WHOIS_SERVER_ID) - 1; - if ((len = strcspn(p, " \t\n\r")) != 0) { - s_asprintf(&nhost, "%s", p); + host = strnstr(buf, WHOIS_SERVER_ID, len); + if (host != NULL) { + host += sizeof(WHOIS_SERVER_ID) - 1; + for (p = host; p < buf + len; p++) { + if (!ishost(*p)) { + *p = '\0'; + break; + } } + s_asprintf(&nhost, "%.*s", + (int)(buf + len - host), host); } else { for (i = 0; ip_whois[i] != NULL; i++) { - if (strstr(buf, ip_whois[i]) == NULL) + if (strnstr(buf, ip_whois[i], len) == + NULL) continue; s_asprintf(&nhost, "%s", ip_whois[i]); + break; } } } - - if ((flags & WHOIS_INIC_FALLBACK) && nhost == NULL && - !nomatch && (p = strstr(buf, NO_MATCH_ID)) != NULL) { - p += sizeof(NO_MATCH_ID) - 1; - if ((len = strcspn(p, "\"")) && - strncasecmp(name, p, len) == 0 && - name[len] == '\0' && - strchr(name, '.') == NULL) - nomatch = 1; - } - printf("%s\n", buf); } - - /* Do second lookup as needed. */ - if (nomatch && nhost == NULL) { - printf("Looking up %s at %s.\n\n", name, INICHOST); - s_asprintf(&nhost, "%s", INICHOST); - } - if (nhost != NULL) { if ((res2 = gethostinfo(nhost, 0)) == NULL) { free(nhost); To Unsubscribe: send mail to [EMAIL PROTECTED] with "unsubscribe freebsd-net" in the body of the message