X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/0b53baf73be065247a0bc067c86d77e79791740c..cff17f66fa5f4879ce9ef9928b4986e107cce91d:/src/res.c diff --git a/src/res.c b/src/res.c index 0170f45..06585ab 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; @@ -731,9 +731,10 @@ static int proc_answer(struct reslist *request, HEADER * header, char *buf, char } /* - * res_readreply - read a dns reply from the nameserver and process it. + * res_read_single_reply - read a dns reply from the nameserver and process it. + * Return value: 1 if a packet was read, 0 otherwise */ -static void res_readreply(rb_fde_t *F, void *data) +static int res_read_single_reply(rb_fde_t *F, void *data) { char buf[sizeof(HEADER) + MAXPACKET] /* Sparc and alpha need 16bit-alignment for accessing header->id @@ -754,13 +755,13 @@ static void res_readreply(rb_fde_t *F, void *data) rc = recvfrom(rb_get_fd(F), buf, sizeof(buf), 0, (struct sockaddr *)&lsin, &len); - /* Re-schedule a read *after* recvfrom, or we'll be registering - * interest where it'll instantly be ready for read :-) -- adrian - */ - rb_setselect(F, RB_SELECT_READ, res_readreply, NULL); - /* Better to cast the sizeof instead of rc */ + /* No packet */ + if (rc == 0 || rc == -1) + return 0; + + /* Too small */ if (rc <= (int)(sizeof(HEADER))) - return; + return 1; /* * convert DNS reply reader from Network byte order to CPU byte order. @@ -776,16 +777,16 @@ static void res_readreply(rb_fde_t *F, void *data) * just ignore this response. */ if (0 == (request = find_id(header->id))) - return; + return 1; /* * check against possibly fake replies */ if (!res_ourserver(&lsin)) - return; + return 1; if (!check_question(request, header, buf, buf + rc)) - return; + return 1; if ((header->rcode != NO_ERRORS) || (header->ancount == 0)) { @@ -803,7 +804,7 @@ static void res_readreply(rb_fde_t *F, void *data) (*request->query->callback) (request->query->ptr, NULL); rem_request(request); } - return; + return 1; } /* * If this fails there was an error decoding the received packet, @@ -823,7 +824,7 @@ static void res_readreply(rb_fde_t *F, void *data) */ (*request->query->callback) (request->query->ptr, reply); rem_request(request); - return; + return 1; } /* @@ -856,6 +857,14 @@ static void res_readreply(rb_fde_t *F, void *data) (*request->query->callback) (request->query->ptr, NULL); rem_request(request); } + return 1; +} + +static void res_readreply(rb_fde_t *F, void *data) +{ + while (res_read_single_reply(F, data)) + ; + rb_setselect(F, RB_SELECT_READ, res_readreply, NULL); } static struct DNSReply *make_dnsreply(struct reslist *request)