]> granicus.if.org Git - libevent/commitdiff
r15025@catbus: nickm | 2007-09-10 10:54:46 -0400
authorNick Mathewson <nickm@torproject.org>
Mon, 10 Sep 2007 14:56:00 +0000 (14:56 +0000)
committerNick Mathewson <nickm@torproject.org>
Mon, 10 Sep 2007 14:56:00 +0000 (14:56 +0000)
 More DNS standard correctness changes: we preserve the CD flag,not the TC flag on responses.  When we get a nonstandard query, we should say "NOTIMPL" rather than ignoring it.

svn:r428

ChangeLog
evdns.c

index 1f3fd2e08c9110842e778fb6942b54da952488d3..a7d8a926b17084e5e8dab0cc9abde805e8322822 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -9,3 +9,5 @@ Changes in current version:
  o Fix a memory leak in the DNS server
  o Fix compilation when DNS_USE_OPENSSL_FOR_ID is enabled
  o Fix buffer size and string generation in evdns_resolve_reverse_ipv6().
+ o Respond to nonstandard DNS queries with "NOTIMPL" rather than by ignoring them.
+ o In DNS responses, the CD flag should be preserved, not the TC flag.
diff --git a/evdns.c b/evdns.c
index 22f9a7a271c0ff36a57d83bfff6cbb112d5fb48d..cb0c543f49a44ea089a4e716fdd1f9d68065eb22 100644 (file)
--- a/evdns.c
+++ b/evdns.c
@@ -949,8 +949,7 @@ request_parse(u8 *packet, int length, struct evdns_server_port *port, struct soc
        GET16(additional);
 
        if (flags & 0x8000) return -1; /* Must not be an answer. */
-       if (flags & 0x7800) return -1; /* only standard queries are supported */
-       flags &= 0x0300; /* Only TC and RD get preserved. */
+       flags &= 0x0110; /* Only RD and CD get preserved. */
 
        server_req = malloc(sizeof(struct server_request));
        if (server_req == NULL) return -1;
@@ -988,6 +987,13 @@ request_parse(u8 *packet, int length, struct evdns_server_port *port, struct soc
 
        server_req->port = port;
        port->refcnt++;
+
+       /* Only standard queries are supported. */
+       if (flags & 0x7800) {
+               evdns_server_request_respond(&(server_req->base), DNS_ERR_NOTIMPL);
+               return -1;
+       }
+
        port->user_callback(&(server_req->base), port->user_data);
 
        return 0;