X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/a70a737c9b1a524e8f4835bc58a331dee8579ac4..ea41b24fd4807e3565bf5f8f293e2efc4c20b62d:/authd/res.c diff --git a/authd/res.c b/authd/res.c index d68e402a..0336b462 100644 --- a/authd/res.c +++ b/authd/res.c @@ -44,8 +44,6 @@ static PF res_readreply; #define MAXPACKET 1024 /* rfc sez 512 but we expand names so ... */ -#define RES_MAXALIASES 35 /* maximum aliases allowed */ -#define RES_MAXADDRS 35 /* maximum addresses allowed */ #define AR_TTL 600 /* TTL in seconds for dns cache entries */ /* RFC 1104/1105 wasn't very helpful about what these fields @@ -58,9 +56,7 @@ static PF res_readreply; #define RDLENGTH_SIZE (size_t)2 #define ANSWER_FIXED_SIZE (TYPE_SIZE + CLASS_SIZE + TTL_SIZE + RDLENGTH_SIZE) -#ifdef RB_IPV6 struct in6_addr ipv6_addr; -#endif struct in_addr ipv4_addr; struct reslist @@ -100,12 +96,6 @@ static struct reslist *find_id(int id); static struct DNSReply *make_dnsreply(struct reslist *request); static uint16_t generate_random_id(void); -#ifdef RES_MIN -#undef RES_MIN -#endif - -#define RES_MIN(a, b) ((a) < (b) ? (a) : (b)) - /* * int * res_ourserver(inp) @@ -120,10 +110,8 @@ static uint16_t generate_random_id(void); static int res_ourserver(const struct rb_sockaddr_storage *inp) { -#ifdef RB_IPV6 const struct sockaddr_in6 *v6; const struct sockaddr_in6 *v6in = (const struct sockaddr_in6 *)inp; -#endif const struct sockaddr_in *v4; const struct sockaddr_in *v4in = (const struct sockaddr_in *)inp; int ns; @@ -131,9 +119,7 @@ res_ourserver(const struct rb_sockaddr_storage *inp) for(ns = 0; ns < irc_nscount; ns++) { const struct rb_sockaddr_storage *srv = &irc_nsaddr_list[ns]; -#ifdef RB_IPV6 v6 = (const struct sockaddr_in6 *)srv; -#endif v4 = (const struct sockaddr_in *)srv; /* could probably just memcmp(srv, inp, srv.ss_len) here @@ -141,7 +127,6 @@ res_ourserver(const struct rb_sockaddr_storage *inp) */ switch (GET_SS_FAMILY(srv)) { -#ifdef RB_IPV6 case AF_INET6: if(GET_SS_FAMILY(srv) == GET_SS_FAMILY(inp)) if(v6->sin6_port == v6in->sin6_port) @@ -151,7 +136,6 @@ res_ourserver(const struct rb_sockaddr_storage *inp) sizeof(struct in6_addr)) == 0)) return 1; break; -#endif case AF_INET: if(GET_SS_FAMILY(srv) == GET_SS_FAMILY(inp)) if(v4->sin_port == v4in->sin_port) @@ -261,7 +245,7 @@ void restart_resolver(void) * add_local_domain - Add the domain to hostname, if it is missing * (as suggested by eps@TOASTER.SFSU.EDU) */ -void add_local_domain(char *hname, size_t size) +static void add_local_domain(char *hname, size_t size) { /* try to fix up unqualified names */ if (strchr(hname, '.') == NULL) @@ -322,21 +306,23 @@ static struct reslist *make_request(struct DNSQuery *query) /* * retryfreq - determine how many queries to wait before resending * if there have been that many consecutive timeouts + * + * This is a cubic backoff btw, if anyone didn't pick up on it. --Elizafox */ static int retryfreq(int timeouts) { switch (timeouts) { - case 1: - return 3; - case 2: - return 9; - case 3: - return 27; - case 4: - return 81; - default: - return 243; + case 1: + return 3; + case 2: + return 9; + case 3: + return 27; + case 4: + return 81; + default: + return 243; } } @@ -482,33 +468,37 @@ void build_rdns(char *buf, size_t size, const struct rb_sockaddr_storage *addr, (unsigned int)(cp[0]), suffix == NULL ? "in-addr.arpa" : suffix); } -#ifdef RB_IPV6 else if (GET_SS_FAMILY(addr) == AF_INET6) { const struct sockaddr_in6 *v6 = (const struct sockaddr_in6 *)addr; cp = (const unsigned char *)&v6->sin6_addr.s6_addr; +#define HI_NIBBLE(x) (unsigned int)((x) >> 4) +#define LO_NIBBLE(x) (unsigned int)((x) & 0xf) + (void) snprintf(buf, size, "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%s", - (unsigned int)(cp[15] & 0xf), (unsigned int)(cp[15] >> 4), - (unsigned int)(cp[14] & 0xf), (unsigned int)(cp[14] >> 4), - (unsigned int)(cp[13] & 0xf), (unsigned int)(cp[13] >> 4), - (unsigned int)(cp[12] & 0xf), (unsigned int)(cp[12] >> 4), - (unsigned int)(cp[11] & 0xf), (unsigned int)(cp[11] >> 4), - (unsigned int)(cp[10] & 0xf), (unsigned int)(cp[10] >> 4), - (unsigned int)(cp[9] & 0xf), (unsigned int)(cp[9] >> 4), - (unsigned int)(cp[8] & 0xf), (unsigned int)(cp[8] >> 4), - (unsigned int)(cp[7] & 0xf), (unsigned int)(cp[7] >> 4), - (unsigned int)(cp[6] & 0xf), (unsigned int)(cp[6] >> 4), - (unsigned int)(cp[5] & 0xf), (unsigned int)(cp[5] >> 4), - (unsigned int)(cp[4] & 0xf), (unsigned int)(cp[4] >> 4), - (unsigned int)(cp[3] & 0xf), (unsigned int)(cp[3] >> 4), - (unsigned int)(cp[2] & 0xf), (unsigned int)(cp[2] >> 4), - (unsigned int)(cp[1] & 0xf), (unsigned int)(cp[1] >> 4), - (unsigned int)(cp[0] & 0xf), (unsigned int)(cp[0] >> 4), + LO_NIBBLE(cp[15]), HI_NIBBLE(cp[15]), + LO_NIBBLE(cp[14]), HI_NIBBLE(cp[14]), + LO_NIBBLE(cp[13]), HI_NIBBLE(cp[13]), + LO_NIBBLE(cp[12]), HI_NIBBLE(cp[12]), + LO_NIBBLE(cp[11]), HI_NIBBLE(cp[11]), + LO_NIBBLE(cp[10]), HI_NIBBLE(cp[10]), + LO_NIBBLE(cp[9]), HI_NIBBLE(cp[9]), + LO_NIBBLE(cp[8]), HI_NIBBLE(cp[8]), + LO_NIBBLE(cp[7]), HI_NIBBLE(cp[7]), + LO_NIBBLE(cp[6]), HI_NIBBLE(cp[6]), + LO_NIBBLE(cp[5]), HI_NIBBLE(cp[5]), + LO_NIBBLE(cp[4]), HI_NIBBLE(cp[4]), + LO_NIBBLE(cp[3]), HI_NIBBLE(cp[3]), + LO_NIBBLE(cp[2]), HI_NIBBLE(cp[2]), + LO_NIBBLE(cp[1]), HI_NIBBLE(cp[1]), + LO_NIBBLE(cp[0]), HI_NIBBLE(cp[0]), suffix == NULL ? "ip6.arpa" : suffix); } -#endif + +#undef HI_NIBBLE +#undef LO_NIBBLE } /* @@ -517,8 +507,6 @@ void build_rdns(char *buf, size_t size, const struct rb_sockaddr_storage *addr, static void do_query_number(struct DNSQuery *query, const struct rb_sockaddr_storage *addr, struct reslist *request) { - const unsigned char *cp; - if (request == NULL) { request = make_request(query); @@ -567,17 +555,15 @@ static void resend_query(struct reslist *request) switch (request->type) { - case T_PTR: - do_query_number(NULL, &request->addr, request); - break; - case T_A: -#ifdef RB_IPV6 - case T_AAAA: -#endif - do_query_name(NULL, request->name, request, request->type); - break; - default: - break; + case T_PTR: + do_query_number(NULL, &request->addr, request); + break; + case T_A: + case T_AAAA: + do_query_name(NULL, request->name, request, request->type); + break; + default: + break; } } @@ -599,7 +585,7 @@ static int check_question(struct reslist *request, HEADER * header, char *buf, c sizeof(hostbuf)); if (n <= 0) return 0; - if (strcasecmp(hostbuf, request->queryname)) + if (rb_strcasecmp(hostbuf, request->queryname)) return 0; return 1; } @@ -615,9 +601,7 @@ static int proc_answer(struct reslist *request, HEADER * header, char *buf, char int n; /* temp count */ int rd_length; struct sockaddr_in *v4; /* conversion */ -#ifdef RB_IPV6 struct sockaddr_in6 *v6; -#endif current = (unsigned char *)buf + sizeof(HEADER); for (; header->qdcount > 0; --header->qdcount) @@ -681,56 +665,46 @@ static int proc_answer(struct reslist *request, HEADER * header, char *buf, char */ switch (type) { - case T_A: - if (request->type != T_A) - return (0); - - /* - * check for invalid rd_length or too many addresses - */ - if (rd_length != sizeof(struct in_addr)) - return (0); - v4 = (struct sockaddr_in *)&request->addr; - SET_SS_LEN(&request->addr, sizeof(struct sockaddr_in)); - v4->sin_family = AF_INET; - memcpy(&v4->sin_addr, current, sizeof(struct in_addr)); - return (1); - break; -#ifdef RB_IPV6 - case T_AAAA: - if (request->type != T_AAAA) - return (0); - if (rd_length != sizeof(struct in6_addr)) - return (0); - SET_SS_LEN(&request->addr, sizeof(struct sockaddr_in6)); - v6 = (struct sockaddr_in6 *)&request->addr; - v6->sin6_family = AF_INET6; - memcpy(&v6->sin6_addr, current, sizeof(struct in6_addr)); - return (1); - break; -#endif - case T_PTR: - if (request->type != T_PTR) - return (0); - n = irc_dn_expand((unsigned char *)buf, (unsigned char *)eob, current, - hostbuf, sizeof(hostbuf)); - if (n < 0) - return (0); /* broken message */ - else if (n == 0) - return (0); /* no more answers left */ - - rb_strlcpy(request->name, hostbuf, IRCD_RES_HOSTLEN + 1); - - return (1); - break; - case T_CNAME: - /* real answer will follow */ - current += rd_length; - break; - - default: - break; + case T_A: + if (request->type != T_A) + return (0); + + /* + * check for invalid rd_length or too many addresses + */ + if (rd_length != sizeof(struct in_addr)) + return (0); + v4 = (struct sockaddr_in *)&request->addr; + SET_SS_LEN(&request->addr, sizeof(struct sockaddr_in)); + v4->sin_family = AF_INET; + memcpy(&v4->sin_addr, current, sizeof(struct in_addr)); + return (1); + case T_AAAA: + if (request->type != T_AAAA) + return (0); + if (rd_length != sizeof(struct in6_addr)) + return (0); + SET_SS_LEN(&request->addr, sizeof(struct sockaddr_in6)); + v6 = (struct sockaddr_in6 *)&request->addr; + v6->sin6_family = AF_INET6; + memcpy(&v6->sin6_addr, current, sizeof(struct in6_addr)); + return (1); + case T_PTR: + if (request->type != T_PTR) + return (0); + n = irc_dn_expand((unsigned char *)buf, (unsigned char *)eob, current, + hostbuf, sizeof(hostbuf)); + if (n < 0) + return (0); /* broken message */ + else if (n == 0) + return (0); /* no more answers left */ + + rb_strlcpy(request->name, hostbuf, IRCD_RES_HOSTLEN + 1); + + return (1); } + /* skip any other record type e.g. CNAME, DNAME; real answer should follow */ + current += rd_length; } return (1); @@ -861,11 +835,9 @@ static int res_read_single_reply(rb_fde_t *F, void *data) * Lookup the 'authoritative' name that we were given for the * ip#. */ -#ifdef RB_IPV6 if (GET_SS_FAMILY(&request->addr) == AF_INET6) gethost_byname_type_fqdn(request->name, request->query, T_AAAA); else -#endif gethost_byname_type_fqdn(request->name, request->query, T_A); rem_request(request); }