[SCM] Samba Shared Repository - branch master updated

Amitay Isaacs amitay at samba.org
Thu May 16 07:40:02 MDT 2013


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 <kai at 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 <kai at samba.org>
    Reviewed-By: Amitay Isaacs <amitay at gmail.com>
    
    Autobuild-User(master): Amitay Isaacs <amitay at samba.org>
    Autobuild-Date(master): Thu May 16 15:39:15 CEST 2013 on sn-devel-104

commit 223cf7fb3026daa1d383a2e5796cbfe8beecaac2
Author: Kai Blin <kai at samba.org>
Date:   Mon Jan 14 00:56:48 2013 +0100

    dns: more debug debug options in the tests
    
    Signed-off-by: Kai Blin <kai at samba.org>
    Reviewed-By: Amitay Isaacs <amitay at gmail.com>

commit 4364a3faf64fc9a022bc8870e2817573b94a4d0c
Author: Kai Blin <kai at 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 <kai at samba.org>
    Reviewed-By: Amitay Isaacs <amitay at gmail.com>

commit 2e9cf99bcef81d5e0b25221956a79e5f2fee1bf0
Author: Kai Blin <kai at 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 <kai at samba.org>
    Reviewed-By: Amitay Isaacs <amitay at gmail.com>

commit f31bda67157c66bd9d7d108395610b514a54f28b
Author: Kai Blin <kai at samba.org>
Date:   Mon Jan 14 01:14:29 2013 +0100

    dns: Use new DNS debugclass in DNS server
    
    Signed-off-by: Kai Blin <kai at samba.org>
    Reviewed-By: Amitay Isaacs <amitay at gmail.com>

commit 4b010997486b059b90be1f69783a451f400d7df7
Author: Kai Blin <kai at samba.org>
Date:   Mon Jan 14 01:13:47 2013 +0100

    debug: Add debugclass for DNS server
    
    Signed-off-by: Kai Blin <kai at samba.org>
    Reviewed-By: Amitay Isaacs <amitay at 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


More information about the samba-cvs mailing list