X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcheck.c;h=f5e1a9eaa2c3df9d7fd075aeb8348b23f9bef21f;hb=814cee186999a6e9a76ab970f891347c1e42b132;hp=398c0917b08a26d233c1c3c33a7a8f37e3b7ac2e;hpb=609133ee3365572c56ffa2ffb14d274ff47eb94b;p=adns.git diff --git a/src/check.c b/src/check.c index 398c091..f5e1a9e 100644 --- a/src/check.c +++ b/src/check.c @@ -3,16 +3,16 @@ * - consistency checks */ /* - * This file is - * Copyright (C) 1997-1999 Ian Jackson - * - * It is part of adns, which is - * Copyright (C) 1997-2000 Ian Jackson - * Copyright (C) 1999-2000 Tony Finch + * This file is part of adns, which is + * 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 + * (See the file INSTALL for full details.) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) + * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, @@ -21,8 +21,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * along with this program; if not, write to the Free Software Foundation. */ #include "internal.h" @@ -76,12 +75,17 @@ static void checkc_notcpbuf(adns_state ads) { } static void checkc_global(adns_state ads) { + const struct sortlist *sl; int i; - assert(ads->udpsocket >= 0); + assert(ads->udpsockets >= 0); - for (i=0; insortlist; i++) - assert(!(ads->sortlist[i].base.s_addr & ~ads->sortlist[i].mask.s_addr)); + for (i=0; insortlist; i++) { + sl= &ads->sortlist[i]; + assert(adns__addr_matches(sl->base.sa.sa_family, + adns__sockaddr_addr(&sl->base.sa), + &sl->base,&sl->mask)); + } assert(ads->tcpserver >= 0 && ads->tcpserver < ads->nservers); @@ -132,29 +136,48 @@ static void checkc_queue_tcpw(adns_state ads) { } static void checkc_queue_childw(adns_state ads) { - adns_query parent, child; + adns_query parent, child, search; DLIST_CHECK(ads->childw, parent, , { assert(parent->state == query_childw); assert(parent->children.head); DLIST_CHECK(parent->children, child, siblings., { assert(child->parent == parent); - assert(child->state != query_done); + if (child->state == query_done) { + for (search= ads->intdone.head; search; search= search->next) + if (search==child) goto child_done_ok; + assert(!"done child not on intdone"); + child_done_ok:; + } }); checkc_query(ads,parent); checkc_query_alloc(ads,parent); }); } +static void checkc_query_done(adns_state ads, adns_query qu) { + assert(qu->state == query_done); + assert(!qu->children.head && !qu->children.tail); + checkc_query(ads,qu); +} + static void checkc_queue_output(adns_state ads) { adns_query qu; DLIST_CHECK(ads->output, qu, , { - assert(qu->state == query_done); - assert(!qu->children.head && !qu->children.tail); assert(!qu->parent); assert(!qu->allocations.head && !qu->allocations.tail); - checkc_query(ads,qu); + checkc_query_done(ads,qu); + }); +} + +static void checkc_queue_intdone(adns_state ads) { + adns_query qu; + + DLIST_CHECK(ads->intdone, qu, , { + assert(qu->parent); + assert(qu->ctx.callback); + checkc_query_done(ads,qu); }); } @@ -164,8 +187,12 @@ void adns__consistency(adns_state ads, adns_query qu, consistency_checks cc) { switch (cc) { case cc_user: break; - case cc_entex: + case cc_enter: + if (!(ads->iflags & adns_if_checkc_entex)) return; + break; + case cc_exit: if (!(ads->iflags & adns_if_checkc_entex)) return; + assert(!ads->intdone.head); break; case cc_freq: if ((ads->iflags & adns_if_checkc_freq) != adns_if_checkc_freq) return; @@ -179,6 +206,7 @@ void adns__consistency(adns_state ads, adns_query qu, consistency_checks cc) { checkc_queue_tcpw(ads); checkc_queue_childw(ads); checkc_queue_output(ads); + checkc_queue_intdone(ads); if (qu) { switch (qu->state) { @@ -192,7 +220,10 @@ void adns__consistency(adns_state ads, adns_query qu, consistency_checks cc) { DLIST_ASSERTON(qu, search, ads->childw, ); break; case query_done: - DLIST_ASSERTON(qu, search, ads->output, ); + if (qu->parent) + DLIST_ASSERTON(qu, search, ads->intdone, ); + else + DLIST_ASSERTON(qu, search, ads->output, ); break; default: assert(!"specific query state");