summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetr Písař <ppisar@redhat.com>2013-11-11 17:29:01 +0100
committerMarco d'Itri <md@linux.it>2013-12-26 07:48:10 +0100
commita626373f45093a8c09b889c65fb9230384518701 (patch)
tree0cab2da2718051c92c52992aa49b1c8c847f6e53
parent4c8e0be3ce3cc152b3630086e5e5a1ad7fc5b27c (diff)
downloadwhois-a626373f45093a8c09b889c65fb9230384518701.tar.gz
Free memory in handle_query()
Make the server variable always hold a dynamically allocated string and clean up the related const statements. Signed-off-by: Petr Písař <ppisar@redhat.com>
-rw-r--r--whois.c53
-rw-r--r--whois.h12
2 files changed, 34 insertions, 31 deletions
diff --git a/whois.c b/whois.c
index cddacf3..8734213 100644
--- a/whois.c
+++ b/whois.c
@@ -220,7 +220,7 @@ int main(int argc, char *argv[])
int handle_query(const char *hserver, const char *hport,
const char *query, const char *flags)
{
- const char *server = NULL, *port = NULL;
+ char *server = NULL, *port = NULL;
char *p, *query_string;
if (hport) {
@@ -235,7 +235,7 @@ int handle_query(const char *hserver, const char *hport,
switch (server[0]) {
case 0:
if (!(server = getenv("WHOIS_SERVER")))
- server = DEFAULTSERVER;
+ server = strdup(DEFAULTSERVER);
break;
case 1:
puts(_("This TLD has no whois server, but you can access the "
@@ -255,28 +255,33 @@ int handle_query(const char *hserver, const char *hport,
if (verb)
printf(_("Using server %s.\n"), server + 1);
sockfd = openconn(server + 1, NULL);
+ free(server);
server = query_crsnic(sockfd, query);
break;
case 8:
if (verb)
printf(_("Using server %s.\n"), "whois.afilias-grs.info");
sockfd = openconn("whois.afilias-grs.info", NULL);
+ free(server);
server = query_afilias(sockfd, query);
break;
case 0x0A:
p = convert_6to4(query);
printf(_("\nQuerying for the IPv4 endpoint %s of a 6to4 IPv6 address.\n\n"), p);
+ free(server);
server = guess_server(p);
query = p;
goto retry;
case 0x0B:
p = convert_teredo(query);
printf(_("\nQuerying for the IPv4 endpoint %s of a Teredo IPv6 address.\n\n"), p);
+ free(server);
server = guess_server(p);
query = p;
goto retry;
case 0x0C:
p = convert_inaddr(query);
+ free(server);
server = guess_server(p);
free(p);
goto retry;
@@ -380,9 +385,9 @@ const char *match_config_file(const char *s)
#endif
/* Parses an user-supplied string and tries to guess the right whois server.
- * Returns a statically allocated buffer.
+ * Returns a dinamically allocated buffer.
*/
-const char *guess_server(const char *s)
+char *guess_server(const char *s)
{
unsigned long ip, as32;
unsigned int i;
@@ -395,45 +400,45 @@ const char *guess_server(const char *s)
/* RPSL hierarchical objects */
if (strncaseeq(s, "as", 2)) {
if (isasciidigit(s[2]))
- return whereas(atol(s + 2));
+ return strdup(whereas(atol(s + 2)));
else
- return "";
+ return strdup("");
}
v6prefix = strtol(s, NULL, 16);
if (v6prefix == 0)
- return "\x05"; /* unknown */
+ return strdup("\x05"); /* unknown */
v6net = (v6prefix << 16) + strtol(colon + 1, NULL, 16);/* second u16 */
for (i = 0; ip6_assign[i].serv; i++) {
if ((v6net & (~0UL << (32 - ip6_assign[i].masklen)))
== ip6_assign[i].net)
- return ip6_assign[i].serv;
+ return strdup(ip6_assign[i].serv);
}
- return "\x06"; /* unknown allocation */
+ return strdup("\x06"); /* unknown allocation */
}
/* email address */
if (strchr(s, '@'))
- return "\x05";
+ return strdup("\x05");
/* no dot and no hyphen means it's a NSI NIC handle or ASN (?) */
if (!strpbrk(s, ".-")) {
if (strncaseeq(s, "as", 2) && /* it's an AS */
(isasciidigit(s[2]) || s[2] == ' '))
- return whereas(atol(s + 2));
+ return strdup(whereas(atol(s + 2)));
if (*s == '!') /* NSI NIC handle */
- return "whois.networksolutions.com";
+ return strdup("whois.networksolutions.com");
else
- return "\x05"; /* probably a unknown kind of nic handle */
+ return strdup("\x05"); /* probably a unknown kind of nic handle */
}
/* ASN32? */
if (strncaseeq(s, "as", 2) && s[2] && (as32 = asn32_to_long(s + 2)) != 0)
- return whereas32(as32);
+ return strdup(whereas32(as32));
/* smells like an IP? */
#ifdef HAVE_INET_PTON
@@ -444,28 +449,28 @@ const char *guess_server(const char *s)
#endif
for (i = 0; ip_assign[i].serv; i++)
if ((ip & ip_assign[i].mask) == ip_assign[i].net)
- return ip_assign[i].serv;
- return "\x05"; /* not in the unicast IPv4 space */
+ return strdup(ip_assign[i].serv);
+ return strdup("\x05"); /* not in the unicast IPv4 space */
}
/* check the TLDs list */
for (i = 0; tld_serv[i]; i += 2)
if (domcmp(s, tld_serv[i]))
- return tld_serv[i + 1];
+ return strdup(tld_serv[i + 1]);
/* no dot but hyphen */
if (!strchr(s, '.')) {
/* search for strings at the start of the word */
for (i = 0; nic_handles[i]; i += 2)
if (strncaseeq(s, nic_handles[i], strlen(nic_handles[i])))
- return nic_handles[i + 1];
+ return strdup(nic_handles[i + 1]);
/* it's probably a network name */
- return "";
+ return strdup("");
}
/* has dot and maybe a hyphen and it's not in tld_serv[], WTF is it? */
/* either a TLD or a NIC handle we don't know about yet */
- return "\x05";
+ return strdup("\x05");
}
const char *whereas32(const unsigned long asn)
@@ -616,7 +621,7 @@ int hide_line(int *hiding, const char *const line)
}
/* returns a string which should be freed by the caller, or NULL */
-const char *do_query(const int sock, const char *query)
+char *do_query(const int sock, const char *query)
{
char *temp, *p, buf[2000];
FILE *fi;
@@ -679,7 +684,7 @@ const char *do_query(const int sock, const char *query)
return referral_server;
}
-const char *query_crsnic(const int sock, const char *query)
+char *query_crsnic(const int sock, const char *query)
{
char *temp, *p, buf[2000];
FILE *fi;
@@ -729,7 +734,7 @@ const char *query_crsnic(const int sock, const char *query)
return referral_server;
}
-const char *query_afilias(const int sock, const char *query)
+char *query_afilias(const int sock, const char *query)
{
char *temp, *p, buf[2000];
FILE *fi;
@@ -1009,7 +1014,7 @@ char *normalize_domain(const char *dom)
/* server and port have to be freed by the caller */
void split_server_port(const char *const input,
- const char **server, const char **port) {
+ char **server, char **port) {
char *p;
if (*input == '[' && (p = strchr(input, ']'))) { /* IPv6 */
diff --git a/whois.h b/whois.h
index 9afb2f8..136e395 100644
--- a/whois.h
+++ b/whois.h
@@ -9,16 +9,15 @@
#define HIDE_NOT_STARTED -1
/* prototypes */
-const char *guess_server(const char *);
+char *guess_server(const char *);
const char *match_config_file(const char *);
const char *whereas(const unsigned long);
const char *whereas32(const unsigned long);
char *queryformat(const char *, const char *, const char *);
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 *);
-const char *query_pir(const int, const char *);
-const char *query_afilias(const int, const char *);
+char *do_query(const int, const char *);
+char *query_crsnic(const int, const char *);
+char *query_afilias(const int, const char *);
int openconn(const char *, const char *);
int connect_with_timeout(int, const struct sockaddr *, socklen_t, int);
void usage(int error);
@@ -36,8 +35,7 @@ char *convert_teredo(const char *);
char *convert_inaddr(const char *);
int handle_query(const char *server, const char *port,
const char *qstring, const char *fstring);
-void split_server_port(const char *const input, const char **server,
- const char **port);
+void split_server_port(const char *const input, char **server, char **port);
/* flags for RIPE-like servers */