*/
/*
* This file is part of adns, which is
- * Copyright (C) 1997-2000,2003,2006,2014-2016 Ian Jackson
+ * Copyright (C) 1997-2000,2003,2006,2014-2016,2020 Ian Jackson
* Copyright (C) 2014 Mark Wooding
* Copyright (C) 1999-2000,2003,2006 Tony Finch
* Copyright (C) 1991 Massachusetts Institute of Technology
tl= 0;
while (nextword(&bufp,&word,&l)) { count++; tl += l+1; }
- newptrs= malloc(sizeof(char*)*count);
- if (!newptrs) { saveerr(ads,errno); return; }
+ if (count) {
+ newptrs= malloc(sizeof(char*)*count);
+ if (!newptrs) { saveerr(ads,errno); return; }
- newchars= malloc(tl);
- if (!newchars) { saveerr(ads,errno); free(newptrs); return; }
+ newchars= malloc(tl);
+ if (!newchars) { saveerr(ads,errno); free(newptrs); return; }
+ } else {
+ assert(!tl);
+ newptrs= 0;
+ newchars= 0;
+ }
bufp= buf;
pp= newptrs;
}
} else {
maskwhat = "prefix length";
- initial= strtoul(slash,&ep,10);
- if (*ep || initial>adns__addr_width(sl->base.sa.sa_family)) {
+ unsigned long prefixlen = strtoul(slash,&ep,10);
+ if (*ep || prefixlen>adns__addr_width(sl->base.sa.sa_family)) {
configparseerr(ads,fn,lno,"mask length `%s' invalid",slash);
continue;
}
+ initial= prefixlen;
sl->mask.sa.sa_family= sl->base.sa.sa_family;
adns__prefix_mask(&sl->mask, initial);
}
r= init_finish(ads);
if (r) return r;
- adns__consistency(ads,0,cc_entex);
+ adns__consistency(ads,0,cc_exit);
*ads_r= ads;
return 0;
}
}
r= init_finish(ads); if (r) return r;
- adns__consistency(ads,0,cc_entex);
+ adns__consistency(ads,0,cc_exit);
*ads_r= ads;
return 0;
}
return init_files(newstate_r, flags, logfn, logfndata);
}
+static void cancel_all(adns_query qu) {
+ if (!qu->parent) adns__cancel(qu);
+ else cancel_all(qu->parent);
+}
+
void adns_finish(adns_state ads) {
int i;
- adns__consistency(ads,0,cc_entex);
+ adns__consistency(ads,0,cc_enter);
for (;;) {
- if (ads->udpw.head) adns__cancel(ads->udpw.head);
- else if (ads->tcpw.head) adns__cancel(ads->tcpw.head);
- else if (ads->childw.head) adns__cancel(ads->childw.head);
- else if (ads->output.head) adns__cancel(ads->output.head);
- else if (ads->intdone.head) adns__cancel(ads->output.head);
+ if (ads->udpw.head) cancel_all(ads->udpw.head);
+ else if (ads->tcpw.head) cancel_all(ads->tcpw.head);
+ else if (ads->childw.head) cancel_all(ads->childw.head);
+ else if (ads->output.head) cancel_all(ads->output.head);
+ else if (ads->intdone.head) cancel_all(ads->output.head);
else break;
}
for (i=0; i<ads->nudpsockets; i++) close(ads->udpsockets[i].fd);
}
void adns_forallqueries_begin(adns_state ads) {
- adns__consistency(ads,0,cc_entex);
+ adns__consistency(ads,0,cc_enter);
ads->forallnext=
ads->udpw.head ? ads->udpw.head :
ads->tcpw.head ? ads->tcpw.head :
adns_query adns_forallqueries_next(adns_state ads, void **context_r) {
adns_query qu, nqu;
- adns__consistency(ads,0,cc_entex);
+ adns__consistency(ads,0,cc_enter);
nqu= ads->forallnext;
for (;;) {
qu= nqu;