]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
Fixup assertion failure for certain malformed packets.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Tue, 6 Jan 2009 10:00:28 +0000 (10:00 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Tue, 6 Jan 2009 10:00:28 +0000 (10:00 +0000)
git-svn-id: file:///svn/unbound/trunk@1407 be551aaa-1e26-0410-a405-d3ace91eadb9

daemon/worker.c
doc/Changelog
testcode/do-tests.sh
testdata/fwd_zero.tpkg [new file with mode: 0644]
util/netevent.c

index 86ef6950a396e2019c2459df2e666dd4d0fdf2a1..4a81af94f35f0f6539223a0e631ba4ef0a734617 100644 (file)
@@ -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);
index 2000841afa3efc0d26134c64e684d9b3d4a534aa..91d79db8c8d55491271ca4ebd2ea2f7d7289d59a 100644 (file)
@@ -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.
index 7faf5c00e2f6ec6177cceb49b7f31552f26d5d80..4a459d575cce778c2a2d14c34e6d65326966ab2e 100755 (executable)
@@ -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 (file)
index 0000000..7ce1c58
Binary files /dev/null and b/testdata/fwd_zero.tpkg differ
index 1538e51296a6febd0ad11a993cc5c21795a0fe79..2f396086962f8a3607de086e2e17cbb0eb7611bd 100644 (file)
@@ -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,