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 <[email protected]>
Date:   Thu Sep 29 19:31:07 2011 -0700

    dns: Fix offset check in ndr_pull_component
    
    Autobuild-User: Kai Blin <[email protected]>
    Autobuild-Date: Fri Nov  4 17:25:16 CET 2011 on sn-devel-104

commit 7f24a2b9136dae2c1dd1feced8c92801b25b5fb3
Author: Kai Blin <[email protected]>
Date:   Thu Sep 29 19:30:39 2011 -0700

    nbt: Fix offset check in ndr_pull_component

commit a243473b490c7345333eba7ad3f2033dfdbafdaa
Author: Kai Blin <[email protected]>
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 <[email protected]>
Date:   Tue Sep 27 18:05:38 2011 -0700

    s4 dns: Handle QCLASS_NONE queries

commit 61913f85062eb6425bc6eb0a3f2e10aadd075a36
Author: Kai Blin <[email protected]>
Date:   Tue Sep 27 17:36:42 2011 -0700

    s4 dns: Support DNS_QTYPE_ALL queries

commit 23000bcf2e6cfdb362d7cdbedd6a95d5422080da
Author: Kai Blin <[email protected]>
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

Reply via email to