From db3efb7ac2e754aa9733070d0171ba166fad0e82 Mon Sep 17 00:00:00 2001 From: Jilles Tjoelker Date: Sat, 15 Nov 2008 16:13:39 +0100 Subject: [PATCH] Allow the resolver to process longer hostnames, for the benefit of some DNSBLs like the "TorDNSEL service". --- include/blacklist.h | 2 +- include/reslib.h | 7 ++++++- src/blacklist.c | 6 +++--- src/res.c | 18 +++++++++--------- src/reslib.c | 2 +- 5 files changed, 20 insertions(+), 15 deletions(-) diff --git a/include/blacklist.h b/include/blacklist.h index 8ffb7594..0569d526 100644 --- a/include/blacklist.h +++ b/include/blacklist.h @@ -29,7 +29,7 @@ struct Blacklist { unsigned int status; /* If CONF_ILLEGAL, delete when no clients */ int refcount; - char host[HOSTLEN]; + char host[IRCD_RES_HOSTLEN + 1]; char reject_reason[IRCD_BUFSIZE]; unsigned int hits; time_t lastwarning; diff --git a/include/reslib.h b/include/reslib.h index 13360550..1c15969f 100644 --- a/include/reslib.h +++ b/include/reslib.h @@ -7,6 +7,11 @@ #ifndef _CHARYBDIS_RESLIB_H #define _CHARYBDIS_RESLIB_H +/* Longest hostname we're willing to work with. + * Due to DNSBLs this is more than HOSTLEN. + */ +#define IRCD_RES_HOSTLEN 255 + /* Here we define some values lifted from nameser.h */ #define NS_NOTIFY_OP 4 #define NS_INT16SZ 2 @@ -115,6 +120,6 @@ extern void irc_ns_put16(unsigned int src, unsigned char *dst); extern void irc_ns_put32(unsigned long src, unsigned char *dst); extern int irc_res_mkquery(const char *dname, int class, int type, unsigned char *buf, int buflen); -extern char irc_domain[HOSTLEN + 1]; +extern char irc_domain[IRCD_RES_HOSTLEN + 1]; #endif diff --git a/src/blacklist.c b/src/blacklist.c index 572caddf..09e53d7e 100644 --- a/src/blacklist.c +++ b/src/blacklist.c @@ -117,7 +117,7 @@ static void blacklist_dns_callback(void *vptr, struct DNSReply *reply) static void initiate_blacklist_dnsquery(struct Blacklist *blptr, struct Client *client_p) { struct BlacklistClient *blcptr = rb_malloc(sizeof(struct BlacklistClient)); - char buf[IRCD_BUFSIZE]; + char buf[IRCD_RES_HOSTLEN + 1]; int ip[4]; blcptr->blacklist = blptr; @@ -130,7 +130,7 @@ static void initiate_blacklist_dnsquery(struct Blacklist *blptr, struct Client * sscanf(client_p->sockhost, "%d.%d.%d.%d", &ip[3], &ip[2], &ip[1], &ip[0]); /* becomes 2.0.0.127.torbl.ahbl.org or whatever */ - rb_snprintf(buf, IRCD_BUFSIZE, "%d.%d.%d.%d.%s", ip[0], ip[1], ip[2], ip[3], blptr->host); + rb_snprintf(buf, sizeof buf, "%d.%d.%d.%d.%s", ip[0], ip[1], ip[2], ip[3], blptr->host); gethost_byname_type(buf, &blcptr->dns_query, T_A); @@ -154,7 +154,7 @@ struct Blacklist *new_blacklist(char *name, char *reject_reason) } else blptr->status &= ~CONF_ILLEGAL; - rb_strlcpy(blptr->host, name, HOSTLEN); + rb_strlcpy(blptr->host, name, IRCD_RES_HOSTLEN + 1); rb_strlcpy(blptr->reject_reason, reject_reason, IRCD_BUFSIZE); blptr->lastwarning = 0; diff --git a/src/res.c b/src/res.c index bf1b32af..06585abc 100644 --- a/src/res.c +++ b/src/res.c @@ -62,7 +62,7 @@ struct reslist int id; time_t ttl; char type; - char queryname[128]; /* name currently being queried */ + char queryname[IRCD_RES_HOSTLEN + 1]; /* name currently being queried */ char retries; /* retry counter */ char sends; /* number of sends (>1 means resent) */ time_t sentat; @@ -433,10 +433,10 @@ void gethost_byaddr(const struct rb_sockaddr_storage *addr, struct DNSQuery *que static void do_query_name(struct DNSQuery *query, const char *name, struct reslist *request, int type) { - char host_name[HOSTLEN + 1]; + char host_name[IRCD_RES_HOSTLEN + 1]; - rb_strlcpy(host_name, name, HOSTLEN + 1); - add_local_domain(host_name, HOSTLEN); + rb_strlcpy(host_name, name, IRCD_RES_HOSTLEN + 1); + add_local_domain(host_name, IRCD_RES_HOSTLEN); if (request == NULL) { @@ -462,7 +462,7 @@ static void do_query_number(struct DNSQuery *query, const struct rb_sockaddr_sto { request = make_request(query); memcpy(&request->addr, addr, sizeof(struct rb_sockaddr_storage)); - request->name = (char *)rb_malloc(HOSTLEN + 1); + request->name = (char *)rb_malloc(IRCD_RES_HOSTLEN + 1); } if (addr->ss_family == AF_INET) @@ -576,7 +576,7 @@ static void resend_query(struct reslist *request) */ static int check_question(struct reslist *request, HEADER * header, char *buf, char *eob) { - char hostbuf[128]; /* working buffer */ + char hostbuf[IRCD_RES_HOSTLEN + 1]; /* working buffer */ unsigned char *current; /* current position in buf */ int n; /* temp count */ @@ -597,7 +597,7 @@ static int check_question(struct reslist *request, HEADER * header, char *buf, c */ static int proc_answer(struct reslist *request, HEADER * header, char *buf, char *eob) { - char hostbuf[HOSTLEN + 100]; /* working buffer */ + char hostbuf[IRCD_RES_HOSTLEN + 100]; /* working buffer */ unsigned char *current; /* current position in buf */ int query_class; /* answer class */ int type; /* answer type */ @@ -642,7 +642,7 @@ static int proc_answer(struct reslist *request, HEADER * header, char *buf, char return (0); } - hostbuf[HOSTLEN] = '\0'; + hostbuf[IRCD_RES_HOSTLEN] = '\0'; /* With Address arithmetic you have to be very anal * this code was not working on alpha due to that @@ -708,7 +708,7 @@ static int proc_answer(struct reslist *request, HEADER * header, char *buf, char else if (n == 0) return (0); /* no more answers left */ - rb_strlcpy(request->name, hostbuf, HOSTLEN + 1); + rb_strlcpy(request->name, hostbuf, IRCD_RES_HOSTLEN + 1); return (1); break; diff --git a/src/reslib.c b/src/reslib.c index d6464282..38c09ebd 100644 --- a/src/reslib.c +++ b/src/reslib.c @@ -97,7 +97,7 @@ struct rb_sockaddr_storage irc_nsaddr_list[IRCD_MAXNS]; int irc_nscount = 0; -char irc_domain[HOSTLEN + 1]; +char irc_domain[IRCD_RES_HOSTLEN + 1]; static const char digitvalue[256] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*16*/