From ca89f7290c7363bcf8c5b93d132b4aca9519aabc Mon Sep 17 00:00:00 2001 From: Wouter Wijngaards Date: Tue, 6 Jan 2009 10:00:28 +0000 Subject: [PATCH] Fixup assertion failure for certain malformed packets. git-svn-id: file:///svn/unbound/trunk@1407 be551aaa-1e26-0410-a405-d3ace91eadb9 --- daemon/worker.c | 2 ++ doc/Changelog | 4 ++++ testcode/do-tests.sh | 6 +++--- testdata/fwd_zero.tpkg | Bin 0 -> 1771 bytes util/netevent.c | 5 ++++- 5 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 testdata/fwd_zero.tpkg diff --git a/daemon/worker.c b/daemon/worker.c index 86ef6950a..4a81af94f 100644 --- a/daemon/worker.c +++ b/daemon/worker.c @@ -759,6 +759,7 @@ worker_handle_request(struct comm_point* c, void* arg, int error, /* see if query is in the cache */ if(!query_info_parse(&qinfo, c->buffer)) { verbose(VERB_ALGO, "worker parse request: formerror."); + ldns_buffer_rewind(c->buffer); LDNS_QR_SET(ldns_buffer_begin(c->buffer)); LDNS_RCODE_SET(ldns_buffer_begin(c->buffer), LDNS_RCODE_FORMERR); @@ -779,6 +780,7 @@ worker_handle_request(struct comm_point* c, void* arg, int error, } if((ret=parse_edns_from_pkt(c->buffer, &edns)) != 0) { verbose(VERB_ALGO, "worker parse edns: formerror."); + ldns_buffer_rewind(c->buffer); LDNS_QR_SET(ldns_buffer_begin(c->buffer)); LDNS_RCODE_SET(ldns_buffer_begin(c->buffer), ret); server_stats_insrcode(&worker->stats, c->buffer); diff --git a/doc/Changelog b/doc/Changelog index 2000841af..91d79db8c 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,3 +1,7 @@ +6 January 2009: Wouter + - fixup packet-of-death when compiled with --enable-debug. + A malformed packet could cause an internal assertion failure. + 5 January 2009: Wouter - fixup getaddrinfo failure handling for remote control port. - added L.ROOT-SERVERS.NET. AAAA 2001:500:3::42 to builtin root hints. diff --git a/testcode/do-tests.sh b/testcode/do-tests.sh index 7faf5c00e..4a459d575 100755 --- a/testcode/do-tests.sh +++ b/testcode/do-tests.sh @@ -2,9 +2,9 @@ NEED_SPLINT='00-lint.tpkg' NEED_DOXYGEN='01-doc.tpkg' -NEED_LDNS_TESTNS='fwd_no_edns.tpkg fwd_tcp_tc.tpkg fwd_tcp.tpkg fwd_three_service.tpkg fwd_three.tpkg fwd_ttlexpire.tpkg fwd_udp.tpkg fwd_tcp_tc6.tpkg fwd_compress_c00c.tpkg fwd_ancil.tpkg stat_timer.tpkg 05-asynclook.tpkg stream_tcp.tpkg speed_cache.tpkg fwd_oneport.tpkg fwd_udptmout.tpkg fwd_waitudp.tpkg tcp_sigpipe.tpkg hostsfileosx.tpkg local_nodefault.tpkg' -NEED_XXD='fwd_compress_c00c.tpkg' -NEED_NC='fwd_compress_c00c.tpkg' +NEED_LDNS_TESTNS='fwd_no_edns.tpkg fwd_tcp_tc.tpkg fwd_tcp.tpkg fwd_three_service.tpkg fwd_three.tpkg fwd_ttlexpire.tpkg fwd_udp.tpkg fwd_tcp_tc6.tpkg fwd_compress_c00c.tpkg fwd_ancil.tpkg stat_timer.tpkg 05-asynclook.tpkg stream_tcp.tpkg speed_cache.tpkg fwd_oneport.tpkg fwd_udptmout.tpkg fwd_waitudp.tpkg tcp_sigpipe.tpkg hostsfileosx.tpkg local_nodefault.tpkg fwd_zero.tpkg' +NEED_XXD='fwd_compress_c00c.tpkg fwd_zero.tpkg' +NEED_NC='fwd_compress_c00c.tpkg fwd_zero.tpkg' NEED_CURL='06-ianaports.tpkg' NEED_WHOAMI='07-confroot.tpkg' NEED_IPV6='fwd_ancil.tpkg fwd_tcp_tc6.tpkg' diff --git a/testdata/fwd_zero.tpkg b/testdata/fwd_zero.tpkg new file mode 100644 index 0000000000000000000000000000000000000000..7ce1c586008dc3bd478c91f43c7d6a768c614620 GIT binary patch literal 1771 zcmVrcjMhR{~v`>TK~(A>-fRL z@n8zp*7Tm%zot|Y{i|wGM*WwylClHx!)@Vi_@C?lDLfTL$S58}@hN!|3{A)lEd>;$F*3!Fs4x@S6b8#p1HxU!~Gc4piGZ{}ZLHV56)CQi-tD++#yc$pcf z6-@f6V23zXtnDgGDxp1eLfee7FWRp<7wx-frDku@qc>InGI@0U-{JoreLx=f_`fQv zrFH)=soK{69|P9?-=mM|{h`0^xG-`&uht<&ot=lAy^ z->bKqoilg_Wwl&_g9Ea3NRE;q6Ylfzs^usyQ*a42CJqSMh3TFEwc7eNqBSe3Nox}> z6FnLvm%|*x7K#bcTfO6{Y5O8Wv3+8VBKbUF;t)R0Czdhcp{mvUC>%1i*d!M%D@>dj zEkwp!7+Q8AO=o10XcdSqEVs3?h6oL6I3P`(F^^QROX8S#oPUx&8XJfkcN~nzL&LF0 z)|guo@u>+Sg+0G;!WjR0QrOD~bFZ+M%=bG>jAWl|_Gqc-XB;~~4-YaI*BE+v8Fu~SG;Mf^1qLQso`(-KHU@|6@agQ?C&X&8F2K|*ugiafxl z-Y4{+z=5#?q5GVB036{KnBZ)EMr&~72Oc^FLz?S>F{zPJXd8j$*qqKFqA>{F{R8-e z=Rng$HXXrTC zG#!%5C3c8bm{*t^j>aB!LC6;cHn6(m5}VBBB2k%+O#%1Gxa9FeU{gbn>Q{%@LbF`a zX47Z{*XgaSlRJ;3g(^m_re%Wd1d-sLaLP>Bd4=P%YgV~~$(TZZC6yHue@gLGO1y~e zo&1^6*3ws*E(~-yu2wsh2hR-O+2#ec)=dqD(X@qSw%tOXu_=}LWW^tsTd3K@RuyJ-twA2z@LOy77w9{1&crSdBOD=Ee3{kP5k9tB?M zK5gT5Qe9r8QI=nlGu^TS{G(nKOizMKsUg+z%lh3O z>ljyk(m*0($6Hi^G@O}>5!eo@q%kv_)TOrR3XR%v3D)$Vs2Z_rn-ck zsG5E7ka~FY8ZTK!s>=>#R>^BT5$18#?=K{7_W$VN_fS0U^M6&5*YZD2(TZFDe+)PT z_Lxkbo7}(I%RJxdo&Ipz2705<+$qJE@Ju54e*Yb)nk*C2YU49(@T!G4F7S8~^pj>%@mz`OWHA5@Qs-|iq z&6H&UzQE0m38KeJGhY}(F|MUwGHflRR^UhxG5hq-ka@Hmb~ww-w-%V2_O za2)9^AJau%zjl|0GOh8gQwfBPo=hD>pHBGy2HZ8Sx8#uBKti0Q;BocB7kKp}$#r=r zm5Q#GOsH`My6w-YC$O4VR9r}107Akh$~UzW++fdi}p#QMd8`F(8TuRg%Ncq2pTt=2%6N!>|#~#9)F+9LuQ`l4C`v zD)2h(3CUsD7X5{f?pnnFLvm<6)ChQnCZMCamdV@_JBefC2#y;Q&vAkX2T6D~&pcVr zbVQ86B9F7;GTdfd != -1); - log_assert(ldns_buffer_remaining(packet) > 0); +#ifdef UNBOUND_DEBUG + if(ldns_buffer_remaining(packet) == 0) + log_err("internal error: send empty UDP packet"); +#endif log_assert(addr && addrlen > 0); sent = sendto(c->fd, ldns_buffer_begin(packet), ldns_buffer_remaining(packet), 0,