From: Wouter Wijngaards Date: Tue, 6 Jan 2009 10:00:28 +0000 (+0000) Subject: Fixup assertion failure for certain malformed packets. X-Git-Tag: release-1.2.0~16 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ca89f7290c7363bcf8c5b93d132b4aca9519aabc;p=thirdparty%2Funbound.git Fixup assertion failure for certain malformed packets. git-svn-id: file:///svn/unbound/trunk@1407 be551aaa-1e26-0410-a405-d3ace91eadb9 --- 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 000000000..7ce1c5860 Binary files /dev/null and b/testdata/fwd_zero.tpkg differ diff --git a/util/netevent.c b/util/netevent.c index 1538e5129..2f3960869 100644 --- a/util/netevent.c +++ b/util/netevent.c @@ -234,7 +234,10 @@ comm_point_send_udp_msg(struct comm_point *c, ldns_buffer* packet, { ssize_t sent; log_assert(c->fd != -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,