From 428bd682665dd0986897d76a1c9db2924da21077 Mon Sep 17 00:00:00 2001 From: ian Date: Sun, 7 May 2000 17:26:06 +0000 Subject: [PATCH] + * Fixed infrequent race causing assertion failure in adns__tcp_broken @@ -1,18 +1,20 @@ -uadns (0.8) BETA; urgency=low +uadns (0.8) BETA; urgency=medium * bug_if_query_done feature for debugging (SHOULD BE TAKEN OUT FOR RELEASE) Bugfixes: * Race near adns_beforeselect which could cause infinite timeout fixed (it's now less agressive, and will more often return a zero timeout.) + * Fixed infrequent race causing assertion failure in adns__tcp_broken + `ads->tcpstate == server_connecting || ads->tcpstate == server_ok'. * Spurious `server failure on unidentifiable query' warning suppressed. + * If we get a referral, don't also always complain falsely about RD==0. * adnslogres: cast chars to unsigned char before using ctype.h macros. * In _beforeselect, global failure now means zero timeout, and in tcp_events, really never try to do anything with the TCP connection if act is zero. This might possibly cause an infinite delay (ie, lockup) if things go badly wrong *and* a really unlikely race happens. * Test suite `lines of syscall left' value is correct; !0 is failure. - * If we get a referral, don't also always complain falsely about RD==0. Portability fixes: * install-sh (from autoconf 2.12 Debian r13) included. --- changelog | 6 +- regress/case-tcpbreakin.err | 0 regress/case-tcpbreakin.out | 8 +++ regress/case-tcpbreakin.sys | 114 ++++++++++++++++++++++++++++++++++++ regress/case-tcpptr.err | 0 regress/case-tcpptr.out | 6 ++ regress/case-tcpptr.sys | 88 ++++++++++++++++++++++++++++ src/event.c | 6 +- 8 files changed, 223 insertions(+), 5 deletions(-) create mode 100644 regress/case-tcpbreakin.err create mode 100644 regress/case-tcpbreakin.out create mode 100644 regress/case-tcpbreakin.sys create mode 100644 regress/case-tcpptr.err create mode 100644 regress/case-tcpptr.out create mode 100644 regress/case-tcpptr.sys diff --git a/changelog b/changelog index bf73cfc..ecc6ae2 100644 --- a/changelog +++ b/changelog @@ -1,18 +1,20 @@ -uadns (0.8) BETA; urgency=low +uadns (0.8) BETA; urgency=medium * bug_if_query_done feature for debugging (SHOULD BE TAKEN OUT FOR RELEASE) Bugfixes: * Race near adns_beforeselect which could cause infinite timeout fixed (it's now less agressive, and will more often return a zero timeout.) + * Fixed infrequent race causing assertion failure in adns__tcp_broken + `ads->tcpstate == server_connecting || ads->tcpstate == server_ok'. * Spurious `server failure on unidentifiable query' warning suppressed. + * If we get a referral, don't also always complain falsely about RD==0. * adnslogres: cast chars to unsigned char before using ctype.h macros. * In _beforeselect, global failure now means zero timeout, and in tcp_events, really never try to do anything with the TCP connection if act is zero. This might possibly cause an infinite delay (ie, lockup) if things go badly wrong *and* a really unlikely race happens. * Test suite `lines of syscall left' value is correct; !0 is failure. - * If we get a referral, don't also always complain falsely about RD==0. Portability fixes: * install-sh (from autoconf 2.12 Debian r13) included. diff --git a/regress/case-tcpbreakin.err b/regress/case-tcpbreakin.err new file mode 100644 index 0000000..e69de29 diff --git a/regress/case-tcpbreakin.out b/regress/case-tcpbreakin.out new file mode 100644 index 0000000..46cafba --- /dev/null +++ b/regress/case-tcpbreakin.out @@ -0,0 +1,8 @@ +adns debug: using nameserver 172.18.45.6 +6.45.18.172.in-addr.arpa flags 2 type 65548 PTR(checked) submitted +adns debug: TCP connected (NS=172.18.45.6) +adns warning: TCP connection failed: write: Broken pipe (NS=172.18.45.6) +adns debug: TCP connected (NS=172.18.45.6) +6.45.18.172.in-addr.arpa flags 2 type PTR(checked): OK; nrrs=1; cname=$; owner=$; ttl=86400 + davenant.relativity.greenend.org.uk +rc=0 diff --git a/regress/case-tcpbreakin.sys b/regress/case-tcpbreakin.sys new file mode 100644 index 0000000..4979230 --- /dev/null +++ b/regress/case-tcpbreakin.sys @@ -0,0 +1,114 @@ +default +:65548 2/6.45.18.172.in-addr.arpa + start 957718868.938329 + socket type=SOCK_DGRAM + socket=4 + +0.000161 + fcntl fd=4 cmd=F_GETFL + fcntl=~O_NONBLOCK&... + +0.000059 + fcntl fd=4 cmd=F_SETFL O_NONBLOCK|... + fcntl=OK + +0.000038 + socket type=SOCK_STREAM + socket=5 + +0.001056 + fcntl fd=5 cmd=F_GETFL + fcntl=~O_NONBLOCK&... + +0.000238 + fcntl fd=5 cmd=F_SETFL O_NONBLOCK|... + fcntl=OK + +0.000055 + connect fd=5 addr=172.18.45.6:53 + connect=EINPROGRESS + +0.000723 + select max=6 rfds=[4] wfds=[5] efds=[] to=13.997928 + select=1 rfds=[] wfds=[5] efds=[] + +0.000536 + read fd=5 buflen=1 + read=EAGAIN + +0.000118 + write fd=5 + 002a311f 01000001 00000000 00000136 02343502 31380331 37320769 6e2d6164 + 64720461 72706100 000c0001. + write=44 + +0.001433 + select max=6 rfds=[4,5] wfds=[] efds=[5] to=29.995841 + select=1 rfds=[5] wfds=[] efds=[] + +0.000260 + read fd=5 buflen=2 + read=OK + 00d7. + +0.000302 + read fd=5 buflen=215 + read=OK + 311f8580 00010001 00030003 01360234 35023138 03313732 07696e2d 61646472 + 04617270 6100000c 0001c00c 000c0001 00015180 00250864 6176656e 616e740a + 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0002 34350231 + 38033137 3207696e 2d616464 72046172 70610000 02000100 01518000 06036e73 + 30c03fc0 5b000200 01000151 80000603 6e7331c0 3fc05b00 02000100 01518000 + 06036e73 32c03fc0 7d000100 01000151 800004ac 122d06c0 8f000100 01000151 + 800004ac 122d41c0 a1000100 01000151 800004ac 122d01. + +0.001364 + sendto fd=4 addr=172.18.45.6:53 + 31200100 00010000 00000000 08646176 656e616e 740a7265 6c617469 76697479 + 08677265 656e656e 64036f72 6702756b 00000100 01. + sendto=EMSGSIZE + +0.000001 + write fd=5 + 00353120 01000001 00000000 00000864 6176656e 616e740a 72656c61 74697669 + 74790867 7265656e 656e6403 6f726702 756b0000 010001. + write=EPIPE + +0.001233 + close fd=5 + close=OK + +0.000001 + select max=5 rfds=[4] wfds=[] efds=[] to=0.000000 + select=1 rfds=[] wfds=[] efds=[] + +0.000118 + socket type=SOCK_STREAM + socket=5 + +0.001056 + fcntl fd=5 cmd=F_GETFL + fcntl=~O_NONBLOCK&... + +0.000238 + fcntl fd=5 cmd=F_SETFL O_NONBLOCK|... + fcntl=OK + +0.000055 + connect fd=5 addr=172.18.45.6:53 + connect=EINPROGRESS + +0.000723 + select max=6 rfds=[4] wfds=[5] efds=[] to=13.997928 + select=1 rfds=[] wfds=[5] efds=[] + +0.000536 + read fd=5 buflen=1 + read=EAGAIN + +0.000723 + write fd=5 + 00353120 01000001 00000000 00000864 6176656e 616e740a 72656c61 74697669 + 74790867 7265656e 656e6403 6f726702 756b0000 010001. + write=44 + +0.000001 + select max=6 rfds=[4,5] wfds=[5] efds=[5] to=29.993649 + select=1 rfds=[5] wfds=[] efds=[] + +0.000260 + read fd=5 buflen=217 + read=OK + 00c5 + 31208580 00010001 00030003 08646176 656e616e 740a7265 6c617469 76697479 + 08677265 656e656e 64036f72 6702756b 00000100 01c00c00 01000100 01518000 + 04ac122d 060a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b + 00000200 01000151 80000603 6e7330c0 45c04500 02000100 01518000 06036e73 + 31c045c0 45000200 01000151 80000603 6e7332c0 45c06b00 01000100 01518000 + 04ac122d 06c07d00 01000100 01518000 04ac122d 41c08f00 01000100 01518000 + 04ac122d 01. + +0.001171 + read fd=5 buflen=217 + read=EAGAIN + +0.000189 + close fd=4 + close=OK + +0.000352 + close fd=5 + close=OK + +0.000507 diff --git a/regress/case-tcpptr.err b/regress/case-tcpptr.err new file mode 100644 index 0000000..e69de29 diff --git a/regress/case-tcpptr.out b/regress/case-tcpptr.out new file mode 100644 index 0000000..a22ae89 --- /dev/null +++ b/regress/case-tcpptr.out @@ -0,0 +1,6 @@ +adns debug: using nameserver 172.18.45.6 +6.45.18.172.in-addr.arpa flags 2 type 65548 PTR(checked) submitted +adns debug: TCP connected (NS=172.18.45.6) +6.45.18.172.in-addr.arpa flags 2 type PTR(checked): OK; nrrs=1; cname=$; owner=$; ttl=86400 + davenant.relativity.greenend.org.uk +rc=0 diff --git a/regress/case-tcpptr.sys b/regress/case-tcpptr.sys new file mode 100644 index 0000000..bdddeea --- /dev/null +++ b/regress/case-tcpptr.sys @@ -0,0 +1,88 @@ +default +:65548 2/6.45.18.172.in-addr.arpa + start 957718868.938329 + socket type=SOCK_DGRAM + socket=4 + +0.000161 + fcntl fd=4 cmd=F_GETFL + fcntl=~O_NONBLOCK&... + +0.000059 + fcntl fd=4 cmd=F_SETFL O_NONBLOCK|... + fcntl=OK + +0.000038 + socket type=SOCK_STREAM + socket=5 + +0.001056 + fcntl fd=5 cmd=F_GETFL + fcntl=~O_NONBLOCK&... + +0.000238 + fcntl fd=5 cmd=F_SETFL O_NONBLOCK|... + fcntl=OK + +0.000055 + connect fd=5 addr=172.18.45.6:53 + connect=EINPROGRESS + +0.000723 + select max=6 rfds=[4] wfds=[5] efds=[] to=13.997928 + select=1 rfds=[] wfds=[5] efds=[] + +0.000536 + read fd=5 buflen=1 + read=EAGAIN + +0.000118 + write fd=5 + 002a311f 01000001 00000000 00000136 02343502 31380331 37320769 6e2d6164 + 64720461 72706100 000c0001. + write=44 + +0.001433 + select max=6 rfds=[4,5] wfds=[] efds=[5] to=29.995841 + select=1 rfds=[5] wfds=[] efds=[] + +0.000260 + read fd=5 buflen=2 + read=OK + 00d7. + +0.000302 + read fd=5 buflen=215 + read=OK + 311f8580 00010001 00030003 01360234 35023138 03313732 07696e2d 61646472 + 04617270 6100000c 0001c00c 000c0001 00015180 00250864 6176656e 616e740a + 72656c61 74697669 74790867 7265656e 656e6403 6f726702 756b0002 34350231 + 38033137 3207696e 2d616464 72046172 70610000 02000100 01518000 06036e73 + 30c03fc0 5b000200 01000151 80000603 6e7331c0 3fc05b00 02000100 01518000 + 06036e73 32c03fc0 7d000100 01000151 800004ac 122d06c0 8f000100 01000151 + 800004ac 122d41c0 a1000100 01000151 800004ac 122d01. + +0.001364 + sendto fd=4 addr=172.18.45.6:53 + 31200100 00010000 00000000 08646176 656e616e 740a7265 6c617469 76697479 + 08677265 656e656e 64036f72 6702756b 00000100 01. + sendto=EMSGSIZE + +0.000001 + write fd=5 + 00353120 01000001 00000000 00000864 6176656e 616e740a 72656c61 74697669 + 74790867 7265656e 656e6403 6f726702 756b0000 010001. + write=53 + +0.001233 + read fd=5 buflen=217 + read=EAGAIN + +0.000100 + select max=6 rfds=[4,5] wfds=[5] efds=[5] to=29.997000 + select=1 rfds=[5] wfds=[] efds=[] + +0.000118 + read fd=5 buflen=217 + read=OK + 00c5 + 31208580 00010001 00030003 08646176 656e616e 740a7265 6c617469 76697479 + 08677265 656e656e 64036f72 6702756b 00000100 01c00c00 01000100 01518000 + 04ac122d 060a7265 6c617469 76697479 08677265 656e656e 64036f72 6702756b + 00000200 01000151 80000603 6e7330c0 45c04500 02000100 01518000 06036e73 + 31c045c0 45000200 01000151 80000603 6e7332c0 45c06b00 01000100 01518000 + 04ac122d 06c07d00 01000100 01518000 04ac122d 41c08f00 01000100 01518000 + 04ac122d 01. + +0.001171 + read fd=5 buflen=217 + read=EAGAIN + +0.000189 + close fd=4 + close=OK + +0.000352 + close fd=5 + close=OK + +0.000507 diff --git a/src/event.c b/src/event.c index 9e7bdc2..bd53255 100644 --- a/src/event.c +++ b/src/event.c @@ -333,7 +333,7 @@ int adns_processreadable(adns_state ads, int fd, const struct timeval *now) { case server_ok: if (fd != ads->tcpsocket) break; assert(!ads->tcprecv_skip); - for (;;) { + do { if (ads->tcprecv.used >= ads->tcprecv_skip+2) { dgramlen= ((ads->tcprecv.buf[ads->tcprecv_skip]<<8) | ads->tcprecv.buf[ads->tcprecv_skip+1]); @@ -367,9 +367,9 @@ int adns_processreadable(adns_state ads, int fd, const struct timeval *now) { if (errno_resources(errno)) { r= errno; goto xit; } } adns__tcp_broken(ads,"read",r?strerror(errno):"closed"); - r= 0; goto xit; } - } /* never reached */ + } while (ads->tcpstate == server_ok); + r= 0; goto xit; default: abort(); } -- 2.30.2