[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