Sisyphus repository
Last update: 1 october 2023 | SRPMs: 18631 | Visits: 37888977
en ru br
ALT Linux repos
S:5.5.18-alt1
5.0: 4.7.27-alt1
4.1: 4.7.26-alt1
4.0: 4.7.21-alt1
3.0: 4.7.5-alt1

Group :: Networking/Other
RPM: whois

 Main   Changelog   Spec   Patches   Sources   Download   Gear   Bugs and FR  Repocop 

Patch: whois-4.7.26-alt1.patch
Download


 Makefile |    4 +-
 utils.c  |   51 ++++++++++++++++++++++++---
 utils.h  |   11 +++++-
 whois.c  |  119 +++++++++++++++++++++++++++++---------------------------------
 whois.h  |    2 +-
 5 files changed, 114 insertions(+), 73 deletions(-)
diff --git a/Makefile b/Makefile
index 122cdc1..5605da5 100644
--- a/Makefile
+++ b/Makefile
@@ -33,10 +33,10 @@ all: Makefile.depend whois mkpasswd #pos
 	$(CC) $(CFLAGS) $(OPTS) -c $<
 
 whois: whois.o utils.o
-	$(CC) $(LDFLAGS) $(whois_LDADD) -o $@ $^
+	$(CC) $(LDFLAGS) -o $@ $^ $(whois_LDADD)
 
 mkpasswd: mkpasswd.o utils.o
-	$(CC) $(LDFLAGS) $(mkpasswd_LDADD) -o $@ $^
+	$(CC) $(LDFLAGS) -o $@ $^ $(mkpasswd_LDADD)
 
 ##############################################################################
 as_del.h: as_del_list make_as_del.pl
diff --git a/utils.c b/utils.c
index 59b484b..358f681 100644
--- a/utils.c
+++ b/utils.c
@@ -51,11 +51,11 @@ char **merge_args(char *args, char *argv[], int *argc)
     if (!args)
 	return argv;
 
-    argstring = NOFAIL(strdup(args));
+    argstring = xstrdup(args);
     for (arg = strtok(argstring, " "); arg; arg = strtok(NULL, " ")) {
 	num_env++;
-	newargs = NOFAIL(realloc(newargs,
-		    sizeof(newargs[0]) * (num_env + *argc + 1)));
+	newargs = xrealloc(newargs,
+		    sizeof(newargs[0]) * (num_env + *argc + 1));
 	newargs[num_env] = arg;
     }
 
@@ -71,6 +71,48 @@ char **merge_args(char *args, char *argv[], int *argc)
     return newargs;
 }
 
+/* Memory allocation routines */
+void *xmalloc(size_t size)
+{
+    void *ptr;
+
+    if ((ptr = malloc(size)) == NULL)
+	err_sys("malloc");
+
+    return ptr;
+}
+
+void *xrealloc(void *ptr, size_t size)
+{
+    if ((ptr = realloc(ptr, size)) == NULL)
+	err_sys("realloc");
+
+    return ptr;
+}
+
+char *xstrdup (const char *s)
+{
+    char   *r = strdup (s);
+
+    if (!r)
+	err_sys("strdup");
+
+    return r;
+}
+
+char *
+xasprintf(char **ptr, const char *fmt, ...)
+{
+    va_list arg;
+
+    va_start(arg, fmt);
+    if (vasprintf(ptr, fmt, arg) < 0)
+	err_sys("vasprintf");
+    va_end(arg);
+
+    return *ptr;
+}
+
 /* Error routines */
 void err_sys(const char *fmt, ...)
 {
@@ -78,7 +120,7 @@ void err_sys(const char *fmt, ...)
 
     va_start(ap, fmt);
     vfprintf(stderr, fmt, ap);
-    fprintf(stderr, ": %s\n", strerror(errno));
+    fprintf(stderr, ": %m\n");
     va_end(ap);
     exit(2);
 }
@@ -93,4 +135,3 @@ void err_quit(const char *fmt, ...)
     va_end(ap);
     exit(2);
 }
-
diff --git a/utils.h b/utils.h
index d16d5c5..52bae0c 100644
--- a/utils.h
+++ b/utils.h
@@ -45,7 +45,14 @@
 void *do_nofail(void *ptr, const char *file, const int line);
 char **merge_args(char *args, char *argv[], int *argc);
 
-void err_quit(const char *fmt, ...) NORETURN;
-void err_sys(const char *fmt, ...) NORETURN;
+void *xmalloc(size_t);
+void *xrealloc(void *, size_t);
+char *xstrdup(const char *s);
+char *xasprintf(char **ptr, const char *fmt, ...)
+	__attribute__ ((__format__(__printf__, 2, 3)));
+void err_quit(const char *,...)
+     __attribute__ ((__format__ (__printf__, 1, 2))) NORETURN;
+void err_sys(const char *,...)
+     __attribute__ ((__format__ (__printf__, 1, 2))) NORETURN;
 
 #endif
diff --git a/whois.c b/whois.c
index ae05f13..4d3ce11 100644
--- a/whois.c
+++ b/whois.c
@@ -37,10 +37,6 @@
 #include "whois.h"
 #include "utils.h"
 
-/* hack */
-#define malloc(s) NOFAIL(malloc(s))
-#define realloc(p, s) NOFAIL(realloc(p, s))
-
 /* Global variables */
 int sockfd, verb = 0;
 
@@ -71,7 +67,7 @@ int main(int argc, char *argv[])
 {
     int ch, nopar = 0;
     const char *server = NULL, *port = NULL;
-    char *p, *qstring, fstring[64] = "\0";
+    char *qstring, fstring[64] = "\0";
 
 #ifdef ENABLE_NLS
     setlocale(LC_ALL, "");
@@ -86,13 +82,13 @@ int main(int argc, char *argv[])
 		"abBcdFg:Gh:Hi:KlLmMp:q:rRs:St:T:v:V:x", longopts, 0)) > 0) {
 	/* RIPE flags */
 	if (strchr(ripeflags, ch)) {
-	    for (p = fstring; *p; p++);
-	    sprintf(p--, "-%c ", ch);
+	    size_t len = strlen(fstring);
+	    snprintf(fstring + len, sizeof(fstring) - len, "-%c ", ch);
 	    continue;
 	}
 	if (strchr(ripeflagsp, ch)) {
-	    for (p = fstring; *p; p++);
-	    snprintf(p--, sizeof(fstring), "-%c %s ", ch, optarg);
+	    size_t len = strlen(fstring);
+	    snprintf(fstring + len, sizeof(fstring) - len, "-%c %s ", ch, optarg);
 	    if (ch == 't' || ch == 'v' || ch == 'q')
 		nopar = 1;
 	    continue;
@@ -100,7 +96,7 @@ int main(int argc, char *argv[])
 	/* program flags */
 	switch (ch) {
 	case 'h':
-	    server = strdup(optarg);
+	    server = xstrdup(optarg);
 	    break;
 	case 'V':
 	    client_tag = optarg;
@@ -108,7 +104,7 @@ int main(int argc, char *argv[])
 	    hide_discl = HIDE_UNSTARTED;	/* enable disclaimers hiding */
 	    break;
 	case 'p':
-	    port = strdup(optarg);
+	    port = xstrdup(optarg);
 	    break;
 	case 2:
 	    verb = 1;
@@ -132,7 +128,7 @@ int main(int argc, char *argv[])
 	usage();
 
     /* On some systems realloc only works on non-NULL buffers */
-    qstring = malloc(64);
+    qstring = xmalloc(64);
     *qstring = '\0';
 
     /* parse other parameters, if any */
@@ -141,11 +137,11 @@ int main(int argc, char *argv[])
 
 	while (1) {
 	    qslen += strlen(*argv) + 1 + 1;
-	    qstring = realloc(qstring, qslen);
-	    strcat(qstring, *argv++);
+	    qstring = xrealloc(qstring, qslen);
+	    strncat(qstring, *argv++, qslen-1);
 	    if (argc == 1)
 		break;
-	    strcat(qstring, " ");
+	    strncat(qstring, " ", qslen-1);
 	    argc--;
 	}
     }
@@ -159,7 +155,7 @@ int main(int argc, char *argv[])
 
     /* -v or -t has been used */
     if (!server && !*qstring)
-	server = strdup("whois.ripe.net");
+	server = xstrdup("whois.ripe.net");
 
 #ifdef CONFIG_FILE
     if (!server) {
@@ -192,12 +188,13 @@ const char *handle_query(const char *hserver, const char *hport,
 {
     const char *server = NULL, *port = NULL;
     char *p;
+    size_t buflen = 0;
 
     if (hport) {
-	server = strdup(hserver);
-	port = strdup(hport);
+	server = xstrdup(hserver);
+	port = xstrdup(hport);
     } else if (hserver[0] < ' ')
-	server = strdup(hserver);
+	server = xstrdup(hserver);
     else
 	split_server_port(hserver, &server, &port);
 
@@ -269,7 +266,7 @@ const char *handle_query(const char *hserver, const char *hport,
     if (!server)
 	return NULL;
 
-    p = queryformat(server, fstring, qstring);
+    p = queryformat(server, fstring, qstring, &buflen);
     if (verb) {
 	printf(_("Using server %s.\n"), server);
 	printf(_("Query string: \"%s\"\n\n"), p);
@@ -277,7 +274,7 @@ const char *handle_query(const char *hserver, const char *hport,
 
     sockfd = openconn(server, port);
 
-    strcat(p, "\r\n");
+    strncat(p, "\r\n", buflen-1);
     server = do_query(sockfd, p);
 
     /* recursion is fun */
@@ -341,7 +338,7 @@ const char *match_config_file(const char *s)
 	i = regexec(&re, s, 0, NULL, 0);
 	if (i == 0) {
 	    regfree(&re);
-	    return strdup(server);
+	    return xstrdup(server);
 	}
 	if (i != REG_NOMATCH) {
 	    char m[1024];
@@ -351,7 +348,7 @@ const char *match_config_file(const char *s)
 	regfree(&re);
 #else
 	if (domcmp(s, pattern))
-	    return strdup(server);
+	    return xstrdup(server);
 #endif
     }
     return NULL;
@@ -462,26 +459,27 @@ const char *whereas(const unsigned short asn)
     return "\x06";
 }
 
-char *queryformat(const char *server, const char *flags, const char *query)
+char *queryformat(const char *server, const char *flags, const char *query, size_t *buflen)
 {
     char *buf, *p;
     int i, isripe = 0;
 
     /* 64 bytes reserved for server-specific flags added later */
-    buf = malloc(strlen(flags) + strlen(query) + strlen(client_tag) + 64);
+    *buflen = strlen(flags) + strlen(query) + strlen(client_tag) + 64;
+    buf = xmalloc(*buflen);
     *buf = '\0';
     for (i = 0; ripe_servers[i]; i++)
 	if (streq(server, ripe_servers[i])) {
-	    strcat(buf, "-V ");
-	    strcat(buf, client_tag);
-	    strcat(buf, " ");
+	    strncat(buf, "-V ", *buflen - 1);
+	    strncat(buf, client_tag, *buflen - 1);
+	    strncat(buf, " ", *buflen - 1);
 	    isripe = 1;
 	    break;
 	}
     if (*flags) {
 	if (!isripe && !streq(server, "whois.corenic.net"))
 	    puts(_("Warning: RIPE flags used with a traditional server."));
-	strcat(buf, flags);
+	strncat(buf, flags, *buflen - 1);
     }
 
 #ifdef HAVE_LIBIDN
@@ -490,33 +488,33 @@ char *queryformat(const char *server, const char *flags, const char *query)
      */
     if (streq(server, "whois.denic.de") && domcmp(query, ".de")
 	    && !strchr(query, ' ') && !*flags)
-	sprintf(buf, "-T dn,ace -C US-ASCII %s", query);
+	snprintf(buf, *buflen, "-T dn,ace -C US-ASCII %s", query);
     else
     /* here we have another registrar who could not make things simple
      * -C sets the language for both input and output
      */
     if (!isripe && streq(server, "whois.cat") && domcmp(query, ".cat")
 	    && !strchr(query, ' '))
-	sprintf(buf, "-C US-ASCII ace %s", query);
+	snprintf(buf, *buflen, "-C US-ASCII ace %s", query);
     else
 #endif
     if (!isripe && (streq(server, "whois.nic.mil") ||
 	    streq(server, "whois.nic.ad.jp")) &&
 	    strncaseeq(query, "AS", 2) && isasciidigit(query[2]))
 	/* FIXME: /e is not applied to .JP ASN */
-	sprintf(buf, "AS %s", query + 2);	/* fix query for DDN */
+	snprintf(buf, *buflen, "AS %s", query + 2);	/* fix query for DDN */
     else if (!isripe && (streq(server, "whois.nic.ad.jp") ||
 	    streq(server, "whois.jprs.jp"))) {
 	char *lang = getenv("LANG");	/* not a perfect check, but... */
 	if (!lang || !strneq(lang, "ja", 2))
-	    sprintf(buf, "%s/e", query);	/* ask for english text */
+	    snprintf(buf, *buflen, "%s/e", query);	/* ask for english text */
 	else
-	    strcat(buf, query);
+	    strncat(buf, query, *buflen - 1);
     } else if (!isripe && streq(server, "whois.arin.net") &&
 	    (p = strrchr(query, '/'))) {
 	strncat(buf, query, p - query);		/* strip CIDR */
     } else
-	strcat(buf, query);
+	strncat(buf, query, *buflen - 1);
     return buf;
 }
 
@@ -582,8 +580,7 @@ const char *do_query(const int sock, const char *query)
 
 	    if (sscanf(buf, REFERTO_FORMAT, nh, np, nq) == 3) {
 		/* XXX we are ignoring the new query string */
-		referral_server = malloc(300);
-		sprintf(referral_server, "%s:%s", nh, np);
+		xasprintf(&referral_server, "%s:%s", nh, np);
 	    }
 	}
 
@@ -596,9 +593,9 @@ const char *do_query(const int sock, const char *query)
 
 	    q = strstr(buf, "rwhois://");
 	    if ((q = strstr(buf, "rwhois://")))
-		referral_server = strdup(q + 9);
+		referral_server = xstrdup(q + 9);
 	    else if ((q = strstr(buf, "whois://")))
-		referral_server = strdup(q + 8);
+		referral_server = xstrdup(q + 8);
 	    if (referral_server) {
 		if ((q = strchr(referral_server, '/'))
 			|| (q = strchr(referral_server, '\n')))
@@ -631,10 +628,7 @@ const char *query_crsnic(const int sock, const char *query)
     int hide = hide_discl;
     int state = 0;
 
-    temp = malloc(strlen(query) + 1 + 2 + 1);
-    *temp = '=';
-    strcpy(temp + 1, query);
-    strcat(temp, "\r\n");
+    xasprintf(&temp, "=%s\r\n", query);
 
     fi = fdopen(sock, "r");
     if (write(sock, temp, strlen(temp)) < 0)
@@ -649,7 +643,7 @@ const char *query_crsnic(const int sock, const char *query)
 
 	    for (p = buf; *p != ':'; p++);	/* skip until colon */
 	    for (p++; *p == ' '; p++);		/* skip colon and spaces */
-	    ret = malloc(strlen(p) + 1);
+	    ret = xmalloc(strlen(p) + 1);
 	    for (q = ret; *p != '\n' && *p != '\r' && *p != ' '; *q++ = *p++)
 		; /*copy data*/
 	    *q = '\0';
@@ -674,10 +668,7 @@ const char *query_pir(const int sock, const char *query)
     int hide = hide_discl;
     int state = 0;
 
-    temp = malloc(strlen(query) + 5 + 2 + 1);
-    strcpy(temp, "FULL ");
-    strcat(temp, query);
-    strcat(temp, "\r\n");
+    xasprintf(&temp, "FULL %s\r\n", query);
 
     fi = fdopen(sock, "r");
     if (write(sock, temp, strlen(temp)) < 0)
@@ -695,7 +686,7 @@ const char *query_pir(const int sock, const char *query)
 	    for (p = buf; *p != ':'; p++);	/* skip until colon */
 	    for (p++; *p != ':'; p++);		/* skip until 2nd colon */
 	    for (p++; *p == ' '; p++);		/* skip colon and spaces */
-	    ret = malloc(strlen(p) + 1);
+	    ret = xmalloc(strlen(p) + 1);
 	    for (q = ret; *p != '\n' && *p != '\r'; *q++ = *p++); /*copy data*/
 	    *q = '\0';
 	    state = 2;
@@ -717,7 +708,7 @@ const char *query_afilias(const int sock, const char *query)
     int hide = hide_discl;
     int state = 0;
 
-    temp = malloc(strlen(query) + 2 + 1);
+    temp = xmalloc(strlen(query) + 2 + 1);
     strcpy(temp, query);
     strcat(temp, "\r\n");
 
@@ -733,7 +724,7 @@ const char *query_afilias(const int sock, const char *query)
 
 	    for (p = buf; *p != ':'; p++);	/* skip until colon */
 	    for (p++; *p == ' '; p++);		/* skip colon and spaces */
-	    ret = malloc(strlen(p) + 1);
+	    ret = xmalloc(strlen(p) + 1);
 	    for (q = ret; *p != '\n' && *p != '\r' && *p != ' '; *q++ = *p++)
 		; /*copy data*/
 	    *q = '\0';
@@ -852,7 +843,7 @@ char *normalize_domain(const char *dom)
     char *p, *ret;
     char *domain_start = NULL;
 
-    ret = strdup(dom);
+    ret = xstrdup(dom);
     for (p = ret; *p; p++); p--;	/* move to the last char */
     /* eat trailing dots and blanks */
     for (; *p == '.' || *p == ' ' || *p == '\t' || p == ret; p--)
@@ -873,7 +864,7 @@ char *normalize_domain(const char *dom)
 
 	/* reassemble the original query in a new buffer */
 	prefix_len = domain_start - ret;
-	r = malloc(prefix_len + strlen(q) + 1);
+	r = xmalloc(prefix_len + strlen(q) + 1);
 	strncpy(r, ret, prefix_len);
 	r[prefix_len] = '\0';
 	strcat(r, q);
@@ -904,29 +895,29 @@ void split_server_port(const char *const input,
 	char *s;
 	int len = p - input - 1;
 
-	*server = s = malloc(len + 1);
+	*server = s = xmalloc(len + 1);
 	memcpy(s, input + 1, len);
 	*(s + len) = '\0';
 
 	p = strchr(p, ':');
 	if (p && *(p + 1) != '\0')
-	    *port = strdup(p + 1);			/* IPv6 + port */
+	    *port = xstrdup(p + 1);			/* IPv6 + port */
     } else if ((p = strchr(input, ':')) &&		/* IPv6, no port */
 	    strchr(p + 1, ':')) {			/*   and no brackets */
-	*server = strdup(input);
+	*server = xstrdup(input);
     } else if ((p = strchr(input, ':'))) {		/* IPv4 + port */
 	char *s;
 	int len = p - input;
 
-	*server = s = malloc(len + 1);
+	*server = s = xmalloc(len + 1);
 	memcpy(s, input, len);
 	*(s + len) = '\0';
 
 	p++;
 	if (*p != '\0')
-	    *port = strdup(p);
+	    *port = xstrdup(p);
     } else {						/* IPv4, no port */
-	*server = strdup(input);
+	*server = xstrdup(input);
     }
 
     /* change the server name to lower case */
@@ -936,19 +927,20 @@ void split_server_port(const char *const input,
 
 char *convert_6to4(const char *s)
 {
-    char *new = malloc(sizeof("255.255.255.255"));
+    char *new = xmalloc(sizeof("255.255.255.255"));
     unsigned int a, b;
 
     if (sscanf(s, "2002:%x:%x:", &a, &b) != 2)
 	return (char *) "0.0.0.0";
 
-    sprintf(new, "%d.%d.%d.%d", a >> 8, a & 0xff, b >> 8, b & 0xff);
+    sprintf(new, "%d.%d.%d.%d",
+    	(a >> 8) & 0xff, a & 0xff, (b >> 8) & 0xff, b & 0xff);
     return new;
 }
 
 char *convert_teredo(const char *s)
 {
-    char *new = malloc(sizeof("255.255.255.255"));
+    char *new = xmalloc(sizeof("255.255.255.255"));
     unsigned int a, b;
 
     if (sscanf(s, "2001:%*[^:]:%*[^:]:%*[^:]:%*[^:]:%*[^:]:%x:%x", &a, &b) != 2)
@@ -956,7 +948,8 @@ char *convert_teredo(const char *s)
 
     a ^= 0xffff;
     b ^= 0xffff;
-    sprintf(new, "%d.%d.%d.%d", a >> 8, a & 0xff, b >> 8, b & 0xff);
+    sprintf(new, "%d.%d.%d.%d",
+    	(a >> 8) & 0xff, a & 0xff, (b >> 8) & 0xff, b & 0xff);
     return new;
 }
 
diff --git a/whois.h b/whois.h
index b15fe98..1c039af 100644
--- a/whois.h
+++ b/whois.h
@@ -13,7 +13,7 @@ const char *whichwhois(const char *);
 const char *match_config_file(const char *);
 const char *whereas(const unsigned short);
 const char *whereas32(const unsigned long);
-char *queryformat(const char *, const char *, const char *);
+char *queryformat(const char *, const char *, const char *, size_t *);
 int hide_line(int *hiding, const char *const line);
 const char *do_query(const int, const char *);
 const char *query_crsnic(const int, const char *);
 
design & coding: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
current maintainer: Michael Shigorin