[SCM] Samba Shared Repository - branch master updated

Kai Blin kai at samba.org
Fri Nov 4 10:26:03 MDT 2011


The branch, master has been updated
       via  468fcfd dns: Fix offset check in ndr_pull_component
       via  7f24a2b nbt: Fix offset check in ndr_pull_component
       via  a243473 s4 dns: the opcode is called OPCODE_UPDATE in the RFC, not OPCODE_REGISTER
       via  57bf64b s4 dns: Handle QCLASS_NONE queries
       via  61913f8 s4 dns: Support DNS_QTYPE_ALL queries
       via  23000bc dns: Build the python bindings
      from  9b4c300 s3:smbd: also send the server name in the negprot response

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 468fcfd8be4a246d9860272a286eb0fe7555a819
Author: Kai Blin <kai at samba.org>
Date:   Thu Sep 29 19:31:07 2011 -0700

    dns: Fix offset check in ndr_pull_component
    
    Autobuild-User: Kai Blin <kai at samba.org>
    Autobuild-Date: Fri Nov  4 17:25:16 CET 2011 on sn-devel-104

commit 7f24a2b9136dae2c1dd1feced8c92801b25b5fb3
Author: Kai Blin <kai at samba.org>
Date:   Thu Sep 29 19:30:39 2011 -0700

    nbt: Fix offset check in ndr_pull_component

commit a243473b490c7345333eba7ad3f2033dfdbafdaa
Author: Kai Blin <kai at samba.org>
Date:   Tue Sep 27 19:51:55 2011 -0700

    s4 dns: the opcode is called OPCODE_UPDATE in the RFC, not OPCODE_REGISTER

commit 57bf64b37569c93fecfbdd3e9fe0c4f0acfb679e
Author: Kai Blin <kai at samba.org>
Date:   Tue Sep 27 18:05:38 2011 -0700

    s4 dns: Handle QCLASS_NONE queries

commit 61913f85062eb6425bc6eb0a3f2e10aadd075a36
Author: Kai Blin <kai at samba.org>
Date:   Tue Sep 27 17:36:42 2011 -0700

    s4 dns: Support DNS_QTYPE_ALL queries

commit 23000bcf2e6cfdb362d7cdbedd6a95d5422080da
Author: Kai Blin <kai at samba.org>
Date:   Mon Sep 26 22:25:51 2011 -0700

    dns: Build the python bindings

-----------------------------------------------------------------------

Summary of changes:
 librpc/idl/dns.idl              |    2 +-
 librpc/ndr/ndr_dns.c            |    2 +-
 librpc/ndr/ndr_nbt.c            |    2 +-
 librpc/wscript_build            |    7 ++-
 source4/dns_server/dns_query.c  |  173 ++++++++++++++------------------------
 source4/dns_server/dns_server.c |    2 +-
 source4/librpc/wscript_build    |    6 ++
 7 files changed, 80 insertions(+), 114 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/idl/dns.idl b/librpc/idl/dns.idl
index 08a1699..a60c314 100644
--- a/librpc/idl/dns.idl
+++ b/librpc/idl/dns.idl
@@ -36,7 +36,7 @@ interface dns
 		DNS_OPCODE_QUERY          =  (0x0<<11),
 		DNS_OPCODE_IQUERY         =  (0x1<<11),
 		DNS_OPCODE_STATUS         =  (0x2<<11),
-		DNS_OPCODE_REGISTER       =  (0x5<<11),
+		DNS_OPCODE_UPDATE         =  (0x5<<11),
 		DNS_OPCODE_RELEASE        =  (0x6<<11),
 		DNS_OPCODE_WACK           =  (0x7<<11),
 		DNS_OPCODE_REFRESH        =  (0x8<<11),
diff --git a/librpc/ndr/ndr_dns.c b/librpc/ndr/ndr_dns.c
index 1004db0..27d8493 100644
--- a/librpc/ndr/ndr_dns.c
+++ b/librpc/ndr/ndr_dns.c
@@ -88,7 +88,7 @@ static enum ndr_err_code ndr_pull_component(struct ndr_pull *ndr,
 					      "reserved lenght field: 0x%02x",
 					      (len &0xC));
 		}
-		if (*offset + len + 2 > ndr->data_size) {
+		if (*offset + len + 1 > ndr->data_size) {
 			return ndr_pull_error(ndr, NDR_ERR_STRING,
 					      "BAD DNS NAME component, "\
 					      "length too long");
diff --git a/librpc/ndr/ndr_nbt.c b/librpc/ndr/ndr_nbt.c
index 02297d3..f2a1ca3 100644
--- a/librpc/ndr/ndr_nbt.c
+++ b/librpc/ndr/ndr_nbt.c
@@ -76,7 +76,7 @@ static enum ndr_err_code ndr_pull_component(struct ndr_pull *ndr,
 			return ndr_pull_error(ndr, NDR_ERR_STRING,
 					      "BAD NBT NAME component");
 		}
-		if (*offset + len + 2 > ndr->data_size) {
+		if (*offset + len + 1 > ndr->data_size) {
 			return ndr_pull_error(ndr, NDR_ERR_STRING,
 					      "BAD NBT NAME component");
 		}
diff --git a/librpc/wscript_build b/librpc/wscript_build
index f0b461d..f35fd02 100644
--- a/librpc/wscript_build
+++ b/librpc/wscript_build
@@ -378,6 +378,11 @@ bld.SAMBA_SUBSYSTEM('RPC_NDR_AUDIOSRV',
 	public_deps='NDR_AUDIOSRV dcerpc-binding'
 	)
 
+bld.SAMBA_SUBSYSTEM('RPC_NDR_DNS',
+	source='gen_ndr/ndr_dns_c.c',
+	public_deps='dcerpc-binding NDR_DNS'
+	)
+
 bld.SAMBA_SUBSYSTEM('RPC_NDR_ECHO',
 	source='gen_ndr/ndr_echo_c.c',
 	public_deps='dcerpc-binding NDR_ECHO'
@@ -583,7 +588,7 @@ bld.SAMBA_LIBRARY('dcerpc-samba',
                   source='',
                   deps='''RPC_NDR_LSA RPC_NDR_SAMR RPC_NDR_NETLOGON RPC_NDR_EVENTLOG RPC_NDR_DFS
 	          RPC_NDR_NTSVCS RPC_NDR_SVCCTL RPC_NDR_INITSHUTDOWN RPC_NDR_WKSSVC RPC_NDR_SRVSVC RPC_NDR_WINREG
-	          RPC_NDR_ECHO RPC_NDR_EPMAPPER RPC_NDR_ATSVC RPC_NDR_SPOOLSS''',
+	          RPC_NDR_ECHO RPC_NDR_EPMAPPER RPC_NDR_ATSVC RPC_NDR_SPOOLSS RPC_NDR_DNS''',
                   public_deps='ndr-standard',
                   private_library=True,
                   grouping_library=True
diff --git a/source4/dns_server/dns_query.c b/source4/dns_server/dns_query.c
index 2153ad9..b233b25 100644
--- a/source4/dns_server/dns_query.c
+++ b/source4/dns_server/dns_query.c
@@ -29,6 +29,60 @@
 #include "dsdb/common/util.h"
 #include "dns_server/dns_server.h"
 
+static WERROR create_response_rr(const struct dns_name_question *question,
+				 const struct dnsp_DnssrvRpcRecord *rec,
+				 struct dns_res_rec **answers, uint16_t *ancount)
+{
+	struct dns_res_rec *ans = *answers;
+	uint16_t ai = *ancount;
+
+	ZERO_STRUCT(ans[ai]);
+
+	switch (rec->wType) {
+	case DNS_QTYPE_CNAME:
+		ans[ai].rdata.cname_record = talloc_strdup(ans, rec->data.cname);
+		break;
+	case DNS_QTYPE_A:
+		ans[ai].rdata.ipv4_record = talloc_strdup(ans, rec->data.ipv4);
+		break;
+	case DNS_QTYPE_AAAA:
+		ans[ai].rdata.ipv6_record = rec->data.ipv6;
+		break;
+	case DNS_TYPE_NS:
+		ans[ai].rdata.ns_record = rec->data.ns;
+		break;
+	case DNS_QTYPE_SRV:
+		ans[ai].rdata.srv_record.priority = rec->data.srv.wPriority;
+		ans[ai].rdata.srv_record.weight   = rec->data.srv.wWeight;
+		ans[ai].rdata.srv_record.port     = rec->data.srv.wPort;
+		ans[ai].rdata.srv_record.target   = rec->data.srv.nameTarget;
+		break;
+	case DNS_QTYPE_SOA:
+		ans[ai].rdata.soa_record.mname	 = rec->data.soa.mname;
+		ans[ai].rdata.soa_record.rname	 = rec->data.soa.rname;
+		ans[ai].rdata.soa_record.serial	 = rec->data.soa.serial;
+		ans[ai].rdata.soa_record.refresh = rec->data.soa.refresh;
+		ans[ai].rdata.soa_record.retry	 = rec->data.soa.retry;
+		ans[ai].rdata.soa_record.expire	 = rec->data.soa.expire;
+		ans[ai].rdata.soa_record.minimum = rec->data.soa.minimum;
+		break;
+	default:
+		return DNS_ERR(NOT_IMPLEMENTED);
+	}
+
+	ans[ai].name = talloc_strdup(ans, question->name);
+	ans[ai].rr_type = rec->wType;
+	ans[ai].rr_class = DNS_QCLASS_IN;
+	ans[ai].ttl = rec->dwTtlSeconds;
+	ans[ai].length = UINT16_MAX;
+	ai++;
+
+	*answers = ans;
+	*ancount = ai;
+
+	return WERR_OK;
+}
+
 static WERROR handle_question(struct dns_server *dns,
 			      TALLOC_CTX *mem_ctx,
 			      const struct dns_name_question *question,
@@ -76,116 +130,12 @@ static WERROR handle_question(struct dns_server *dns,
 			     ai + el->num_values);
 	W_ERROR_HAVE_NO_MEMORY(ans);
 
-	switch (question->question_type) {
-	case DNS_QTYPE_CNAME:
-		for (ri = 0; ri < el->num_values; ri++) {
-			if (recs[ri].wType != question->question_type) {
-				continue;
-			}
-
-			ZERO_STRUCT(ans[ai]);
-			ans[ai].name = talloc_strdup(ans, question->name);
-			ans[ai].rr_type = DNS_QTYPE_CNAME;
-			ans[ai].rr_class = DNS_QCLASS_IN;
-			ans[ai].ttl = recs[ri].dwTtlSeconds;
-			ans[ai].length = UINT16_MAX;
-			ans[ai].rdata.cname_record = talloc_strdup(ans, recs[ri].data.cname);
-			ai++;
-		}
-		break;
-	case DNS_QTYPE_A:
-		for (ri = 0; ri < el->num_values; ri++) {
-			if (recs[ri].wType != question->question_type) {
-				continue;
-			}
-
-			/* TODO: if the record actually is a DNS_QTYPE_A */
-
-			ZERO_STRUCT(ans[ai]);
-			ans[ai].name = talloc_strdup(ans, question->name);
-			ans[ai].rr_type = DNS_QTYPE_A;
-			ans[ai].rr_class = DNS_QCLASS_IN;
-			ans[ai].ttl = recs[ri].dwTtlSeconds;
-			ans[ai].length = UINT16_MAX;
-			ans[ai].rdata.ipv4_record = talloc_strdup(ans, recs[ri].data.ipv4);
-			ai++;
-		}
-		break;
-	case DNS_QTYPE_AAAA:
-		for (ri = 0; ri < el->num_values; ri++) {
-			if (recs[ri].wType != question->question_type) {
-				continue;
-			}
-
-			ZERO_STRUCT(ans[ai]);
-			ans[ai].name = talloc_strdup(ans, question->name);
-			ans[ai].rr_type = DNS_QTYPE_AAAA;
-			ans[ai].rr_class = DNS_QCLASS_IN;
-			ans[ai].ttl = recs[ri].dwTtlSeconds;
-			ans[ai].length = UINT16_MAX;
-			ans[ai].rdata.ipv6_record = recs[ri].data.ipv6;
-			ai++;
-		}
-		break;
-	case DNS_QTYPE_NS:
-		for (ri = 0; ri < el->num_values; ri++) {
-			if (recs[ri].wType != question->question_type) {
-				continue;
-			}
-
-			ZERO_STRUCT(ans[ai]);
-			ans[ai].name = question->name;
-			ans[ai].rr_type = DNS_QTYPE_NS;
-			ans[ai].rr_class = DNS_QCLASS_IN;
-			ans[ai].ttl = recs[ri].dwTtlSeconds;
-			ans[ai].length = UINT16_MAX;
-			ans[ai].rdata.ns_record = recs[ri].data.ns;
-			ai++;
-		}
-		break;
-	case DNS_QTYPE_SRV:
-		for (ri = 0; ri < el->num_values; ri++) {
-			if (recs[ri].wType != question->question_type) {
-				continue;
-			}
-
-			ZERO_STRUCT(ans[ai]);
-			ans[ai].name = question->name;
-			ans[ai].rr_type = DNS_QTYPE_SRV;
-			ans[ai].rr_class = DNS_QCLASS_IN;
-			ans[ai].ttl = recs[ri].dwTtlSeconds;
-			ans[ai].length = UINT16_MAX;
-			ans[ai].rdata.srv_record.priority = recs[ri].data.srv.wPriority;
-			ans[ai].rdata.srv_record.weight = recs[ri].data.srv.wWeight;
-			ans[ai].rdata.srv_record.port = recs[ri].data.srv.wPort;
-			ans[ai].rdata.srv_record.target = recs[ri].data.srv.nameTarget;
-			ai++;
-		}
-		break;
-	case DNS_QTYPE_SOA:
-		for (ri = 0; ri < el->num_values; ri++) {
-			if (recs[ri].wType != question->question_type) {
-				continue;
-			}
-
-			ZERO_STRUCT(ans[ai]);
-			ans[ai].name = question->name;
-			ans[ai].rr_type = DNS_QTYPE_SOA;
-			ans[ai].rr_class = DNS_QCLASS_IN;
-			ans[ai].ttl = recs[ri].dwTtlSeconds;
-			ans[ai].length = UINT16_MAX;
-			ans[ai].rdata.soa_record.mname	= recs[ri].data.soa.mname;
-			ans[ai].rdata.soa_record.rname	= recs[ri].data.soa.rname;
-			ans[ai].rdata.soa_record.serial	= recs[ri].data.soa.serial;
-			ans[ai].rdata.soa_record.refresh= recs[ri].data.soa.refresh;
-			ans[ai].rdata.soa_record.retry	= recs[ri].data.soa.retry;
-			ans[ai].rdata.soa_record.expire	= recs[ri].data.soa.expire;
-			ans[ai].rdata.soa_record.minimum= recs[ri].data.soa.minimum;
-			ai++;
+	for (ri = 0; ri < el->num_values; ri++) {
+		if ((question->question_type != DNS_QTYPE_ALL) &&
+		    (recs[ri].wType != question->question_type)) {
+			continue;
 		}
-		break;
-	default:
-		return DNS_ERR(NOT_IMPLEMENTED);
+		create_response_rr(question, &recs[ri], &ans, &ai);
 	}
 
 	if (*ancount == ai) {
@@ -214,6 +164,11 @@ WERROR dns_server_process_query(struct dns_server *dns,
 		return DNS_ERR(FORMAT_ERROR);
 	}
 
+	/* Windows returns NOT_IMPLEMENTED on this as well */
+	if (in->questions[0].question_class == DNS_QCLASS_NONE) {
+		return DNS_ERR(NOT_IMPLEMENTED);
+	}
+
 	ans = talloc_array(mem_ctx, struct dns_res_rec, 0);
 	W_ERROR_HAVE_NO_MEMORY(ans);
 
diff --git a/source4/dns_server/dns_server.c b/source4/dns_server/dns_server.c
index e164035..899ec0c 100644
--- a/source4/dns_server/dns_server.c
+++ b/source4/dns_server/dns_server.c
@@ -144,7 +144,7 @@ static NTSTATUS dns_process(struct dns_server *dns,
 					       &additional, &num_additional);
 
 		break;
-	case DNS_OPCODE_REGISTER:
+	case DNS_OPCODE_UPDATE:
 		ret = dns_server_process_update(dns, out_packet, in_packet,
 						answers, num_answers,
 						&nsrecs,  &num_nsrecs,
diff --git a/source4/librpc/wscript_build b/source4/librpc/wscript_build
index b4e65e8..cb4c530 100755
--- a/source4/librpc/wscript_build
+++ b/source4/librpc/wscript_build
@@ -181,6 +181,12 @@ bld.SAMBA_PYTHON('python_echo',
 	realname='samba/dcerpc/echo.so'
 	)
 
+bld.SAMBA_PYTHON('python_dns',
+	source='../../librpc/gen_ndr/py_dns.c',
+	deps='RPC_NDR_DNS pytalloc-util pyrpc_util',
+	realname='samba/dcerpc/dns.so'
+	)
+
 bld.SAMBA_PYTHON('python_auth',
 	source='../../librpc/gen_ndr/py_auth.c',
 	deps='NDR_AUTH pytalloc-util pyrpc_util',


-- 
Samba Shared Repository


More information about the samba-cvs mailing list