The branch, master has been updated via 46e98cf dns: Fix allocation of txt_record in txt record tests via 223cf7f dns: more debug debug options in the tests via 4364a3f dns: Add support for MX queries via 2e9cf99 dns: Also add a print-out for the out_packet via f31bda6 dns: Use new DNS debugclass in DNS server via 4b01099 debug: Add debugclass for DNS server from 51533ee winbind4: Fix bug 9832 -- talloc use after free
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 46e98cf20b04f3668e96fb597a414d0b39d5b1ed Author: Kai Blin <k...@samba.org> Date: Thu May 16 12:13:22 2013 +0200 dns: Fix allocation of txt_record in txt record tests Signed-off-by: Kai Blin <k...@samba.org> Reviewed-By: Amitay Isaacs <ami...@gmail.com> Autobuild-User(master): Amitay Isaacs <ami...@samba.org> Autobuild-Date(master): Thu May 16 15:39:15 CEST 2013 on sn-devel-104 commit 223cf7fb3026daa1d383a2e5796cbfe8beecaac2 Author: Kai Blin <k...@samba.org> Date: Mon Jan 14 00:56:48 2013 +0100 dns: more debug debug options in the tests Signed-off-by: Kai Blin <k...@samba.org> Reviewed-By: Amitay Isaacs <ami...@gmail.com> commit 4364a3faf64fc9a022bc8870e2817573b94a4d0c Author: Kai Blin <k...@samba.org> Date: Mon Dec 10 05:50:05 2012 +1000 dns: Add support for MX queries Due to an oversight, the internal DNS server supports MX record updates, but not MX record queries. Add support for MX queries and tests. This should fix bug #9485 Signed-off-by: Kai Blin <k...@samba.org> Reviewed-By: Amitay Isaacs <ami...@gmail.com> commit 2e9cf99bcef81d5e0b25221956a79e5f2fee1bf0 Author: Kai Blin <k...@samba.org> Date: Mon Jan 14 00:55:37 2013 +0100 dns: Also add a print-out for the out_packet Signed-off-by: Kai Blin <k...@samba.org> Reviewed-By: Amitay Isaacs <ami...@gmail.com> commit f31bda67157c66bd9d7d108395610b514a54f28b Author: Kai Blin <k...@samba.org> Date: Mon Jan 14 01:14:29 2013 +0100 dns: Use new DNS debugclass in DNS server Signed-off-by: Kai Blin <k...@samba.org> Reviewed-By: Amitay Isaacs <ami...@gmail.com> commit 4b010997486b059b90be1f69783a451f400d7df7 Author: Kai Blin <k...@samba.org> Date: Mon Jan 14 01:13:47 2013 +0100 debug: Add debugclass for DNS server Signed-off-by: Kai Blin <k...@samba.org> Reviewed-By: Amitay Isaacs <ami...@gmail.com> ----------------------------------------------------------------------- Summary of changes: lib/util/debug.c | 1 + lib/util/debug.h | 3 +- python/samba/tests/dns.py | 89 ++++++++++++++++++++++++++++++++++---- source4/dns_server/dns_crypto.c | 3 + source4/dns_server/dns_query.c | 11 +++++ source4/dns_server/dns_server.c | 7 +++ source4/dns_server/dns_update.c | 3 + source4/dns_server/dns_utils.c | 3 + 8 files changed, 109 insertions(+), 11 deletions(-) Changeset truncated at 500 lines: diff --git a/lib/util/debug.c b/lib/util/debug.c index 6207b61..34aa76f 100644 --- a/lib/util/debug.c +++ b/lib/util/debug.c @@ -177,6 +177,7 @@ static const char *default_classname_table[] = { "dmapi", /* DBGC_DMAPI */ "registry", /* DBGC_REGISTRY */ "scavenger", /* DBGC_SCAVENGER */ + "dns", /* DBGC_DNS */ NULL }; diff --git a/lib/util/debug.h b/lib/util/debug.h index c61fd13..feea0a8 100644 --- a/lib/util/debug.h +++ b/lib/util/debug.h @@ -80,9 +80,10 @@ bool dbghdr( int level, const char *location, const char *func); #define DBGC_DMAPI 18 #define DBGC_REGISTRY 19 #define DBGC_SCAVENGER 20 +#define DBGC_DNS 21 /* Always ensure this is updated when new fixed classes area added, to ensure the array in debug.c is the right size */ -#define DBGC_MAX_FIXED 20 +#define DBGC_MAX_FIXED 21 /* So you can define DBGC_CLASS before including debug.h */ #ifndef DBGC_CLASS diff --git a/python/samba/tests/dns.py b/python/samba/tests/dns.py index 49d699e..15672a0 100644 --- a/python/samba/tests/dns.py +++ b/python/samba/tests/dns.py @@ -23,6 +23,9 @@ import samba.ndr as ndr import samba.dcerpc.dns as dns from samba.tests import TestCase +FILTER=''.join([(len(repr(chr(x)))==3) and chr(x) or '.' for x in range(256)]) + + class DNSTest(TestCase): def errstr(self, errcode): @@ -82,36 +85,53 @@ class DNSTest(TestCase): "Helper to get dns domain" return os.getenv('REALM', 'example.com').lower() - def dns_transaction_udp(self, packet, host=os.getenv('SERVER_IP')): + def dns_transaction_udp(self, packet, host=os.getenv('SERVER_IP'), dump=False): "send a DNS query and read the reply" s = None try: send_packet = ndr.ndr_pack(packet) + if dump: + print self.hexdump(send_packet) s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0) s.connect((host, 53)) s.send(send_packet, 0) recv_packet = s.recv(2048, 0) + if dump: + print self.hexdump(recv_packet) return ndr.ndr_unpack(dns.name_packet, recv_packet) finally: if s is not None: s.close() - def dns_transaction_tcp(self, packet, host=os.getenv('SERVER_IP')): + def dns_transaction_tcp(self, packet, host=os.getenv('SERVER_IP'), dump=False): "send a DNS query and read the reply" s = None try: send_packet = ndr.ndr_pack(packet) + if dump: + print self.hexdump(send_packet) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) s.connect((host, 53)) tcp_packet = struct.pack('!H', len(send_packet)) tcp_packet += send_packet s.send(tcp_packet, 0) recv_packet = s.recv(0xffff + 2, 0) + if dump: + print self.hexdump(recv_packet) return ndr.ndr_unpack(dns.name_packet, recv_packet[2:]) finally: if s is not None: s.close() + def hexdump(self, src, length=8): + N=0; result='' + while src: + s,src = src[:length],src[length:] + hexa = ' '.join(["%02X"%ord(x) for x in s]) + s = s.translate(FILTER) + result += "%04X %-*s %s\n" % (N, length*3, hexa, s) + N+=length + return result class TestSimpleQueries(DNSTest): @@ -370,8 +390,9 @@ class TestDNSUpdates(DNSTest): r.rr_class = dns.DNS_QCLASS_IN r.ttl = 900 r.length = 0xffff - r.rdata = dns.txt_record() - r.rdata.txt = '"This is a test"' + rdata = dns.txt_record() + rdata.txt = '"This is a test"' + r.rdata = rdata updates.append(r) p.nscount = len(updates) p.nsrecs = updates @@ -410,8 +431,9 @@ class TestDNSUpdates(DNSTest): r.rr_class = dns.DNS_QCLASS_IN r.ttl = 900 r.length = 0xffff - r.rdata = dns.txt_record() - r.rdata.txt = '"This is a test" "and this is a test, too"' + rdata = dns.txt_record() + rdata.txt = '"This is a test" "and this is a test, too"' + r.rdata = rdata updates.append(r) p.nscount = len(updates) p.nsrecs = updates @@ -454,8 +476,9 @@ class TestDNSUpdates(DNSTest): r.rr_class = dns.DNS_QCLASS_IN r.ttl = 900 r.length = 0xffff - r.rdata = dns.txt_record() - r.rdata.txt = '"This is a test"' + rdata = dns.txt_record() + rdata.txt = '"This is a test"' + r.rdata = rdata updates.append(r) p.nscount = len(updates) p.nsrecs = updates @@ -490,8 +513,9 @@ class TestDNSUpdates(DNSTest): r.rr_class = dns.DNS_QCLASS_NONE r.ttl = 0 r.length = 0xffff - r.rdata = dns.txt_record() - r.rdata.txt = '"This is a test"' + rdata = dns.txt_record() + rdata.txt = '"This is a test"' + r.rdata = rdata updates.append(r) p.nscount = len(updates) p.nsrecs = updates @@ -510,6 +534,51 @@ class TestDNSUpdates(DNSTest): response = self.dns_transaction_udp(p) self.assert_dns_rcode_equals(response, dns.DNS_RCODE_NXDOMAIN) + def test_update_add_mx_record(self): + "test adding MX records works" + p = self.make_name_packet(dns.DNS_OPCODE_UPDATE) + updates = [] + + name = self.get_dns_domain() + + u = self.make_name_question(name, dns.DNS_QTYPE_SOA, dns.DNS_QCLASS_IN) + updates.append(u) + self.finish_name_packet(p, updates) + + updates = [] + r = dns.res_rec() + r.name = "%s" % self.get_dns_domain() + r.rr_type = dns.DNS_QTYPE_MX + r.rr_class = dns.DNS_QCLASS_IN + r.ttl = 900 + r.length = 0xffff + rdata = dns.mx_record() + rdata.preference = 10 + rdata.exchange = 'mail.%s' % self.get_dns_domain() + r.rdata = rdata + updates.append(r) + p.nscount = len(updates) + p.nsrecs = updates + + response = self.dns_transaction_udp(p) + self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK) + + p = self.make_name_packet(dns.DNS_OPCODE_QUERY) + questions = [] + + name = "%s" % self.get_dns_domain() + q = self.make_name_question(name, dns.DNS_QTYPE_MX, dns.DNS_QCLASS_IN) + questions.append(q) + + self.finish_name_packet(p, questions) + response = self.dns_transaction_udp(p) + self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK) + self.assertEqual(response.ancount, 1) + ans = response.answers[0] + self.assertEqual(ans.rr_type, dns.DNS_QTYPE_MX) + self.assertEqual(ans.rdata.preference, 10) + self.assertEqual(ans.rdata.exchange, 'mail.%s' % self.get_dns_domain()) + class TestComplexQueries(DNSTest): diff --git a/source4/dns_server/dns_crypto.c b/source4/dns_server/dns_crypto.c index 7604a05..aba906d 100644 --- a/source4/dns_server/dns_crypto.c +++ b/source4/dns_server/dns_crypto.c @@ -29,6 +29,9 @@ #include "auth/auth.h" #include "auth/gensec/gensec.h" +#undef DBGC_CLASS +#define DBGC_CLASS DBGC_DNS + static WERROR dns_copy_tsig(TALLOC_CTX *mem_ctx, struct dns_res_rec *old, struct dns_res_rec *new_rec) diff --git a/source4/dns_server/dns_query.c b/source4/dns_server/dns_query.c index 54e0c7f..4ad14b9 100644 --- a/source4/dns_server/dns_query.c +++ b/source4/dns_server/dns_query.c @@ -37,6 +37,9 @@ #include "auth/credentials/credentials.h" #include "auth/gensec/gensec.h" +#undef DBGC_CLASS +#define DBGC_CLASS DBGC_DNS + static WERROR create_response_rr(const struct dns_name_question *question, const struct dnsp_DnssrvRpcRecord *rec, struct dns_res_rec **answers, uint16_t *ancount) @@ -89,6 +92,14 @@ static WERROR create_response_rr(const struct dns_name_question *question, case DNS_QTYPE_PTR: ans[ai].rdata.ptr_record = talloc_strdup(ans, rec->data.ptr); break; + case DNS_QTYPE_MX: + ans[ai].rdata.mx_record.preference = rec->data.mx.wPriority; + ans[ai].rdata.mx_record.exchange = talloc_strdup( + ans, rec->data.mx.nameTarget); + if (ans[ai].rdata.mx_record.exchange == NULL) { + return WERR_NOMEM; + } + break; case DNS_QTYPE_TXT: tmp = talloc_asprintf(ans, "\"%s\"", rec->data.txt.str[0]); W_ERROR_HAVE_NO_MEMORY(tmp); diff --git a/source4/dns_server/dns_server.c b/source4/dns_server/dns_server.c index 29953c3..70020f4 100644 --- a/source4/dns_server/dns_server.c +++ b/source4/dns_server/dns_server.c @@ -46,6 +46,9 @@ #include "auth/auth.h" #include "auth/credentials/credentials.h" +#undef DBGC_CLASS +#define DBGC_CLASS DBGC_DNS + NTSTATUS server_service_dns_init(void); /* hold information about one dns socket */ @@ -236,6 +239,10 @@ static WERROR dns_process_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx, } } + if (DEBUGLVL(8)) { + NDR_PRINT_DEBUG(dns_name_packet, &state->out_packet); + } + ndr_err = ndr_push_struct_blob( out, mem_ctx, &state->out_packet, (ndr_push_flags_fn_t)ndr_push_dns_name_packet); diff --git a/source4/dns_server/dns_update.c b/source4/dns_server/dns_update.c index 8be3564..9edc40b 100644 --- a/source4/dns_server/dns_update.c +++ b/source4/dns_server/dns_update.c @@ -33,6 +33,9 @@ #include "dns_server/dns_server.h" #include "auth/auth.h" +#undef DBGC_CLASS +#define DBGC_CLASS DBGC_DNS + static WERROR dns_rr_to_dnsp(TALLOC_CTX *mem_ctx, const struct dns_res_rec *rrec, struct dnsp_DnssrvRpcRecord *r); diff --git a/source4/dns_server/dns_utils.c b/source4/dns_server/dns_utils.c index 3988393..e03a409 100644 --- a/source4/dns_server/dns_utils.c +++ b/source4/dns_server/dns_utils.c @@ -30,6 +30,9 @@ #include "dsdb/common/util.h" #include "dns_server/dns_server.h" +#undef DBGC_CLASS +#define DBGC_CLASS DBGC_DNS + uint8_t werr_to_dns_err(WERROR werr) { if (W_ERROR_EQUAL(WERR_OK, werr)) { -- Samba Shared Repository