The branch, master has been updated
       via  9c7015e idl: Add DNS HINFO record support
       via  96ed585 idl: Add DNS RP record support as per RFC 1183
       via  df43027 dns: Support larger queries when asking forwarder
       via  5bcebb5 idl: Add support for parsing OPT records
      from  c134171 winbind: Print error code on connection error in ping_dc

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


- Log -----------------------------------------------------------------
commit 9c7015ecaacff859c7ba94ccadd49b4e9a5cd002
Author: Kai Blin <[email protected]>
Date:   Sat May 25 14:05:22 2013 +0200

    idl: Add DNS HINFO record support
    
    Not sure if we need this, bug samba.org specifies it, so this can cause ANY 
queries
    against samba.org to fail.
    
    Signed-off-by: Kai Blin <[email protected]>
    Reviewed-by: Michael Adam <[email protected]>
    
    Autobuild-User(master): Michael Adam <[email protected]>
    Autobuild-Date(master): Sun May 26 20:05:38 CEST 2013 on sn-devel-104

commit 96ed585f09efdad2b5e6ab7918966b1453154d71
Author: Kai Blin <[email protected]>
Date:   Sat May 25 14:05:21 2013 +0200

    idl: Add DNS RP record support as per RFC 1183
    
    Not sure if we need this, but samba.org specifies it, so this could cause 
ANY
    queries against samba.org to fail.
    
    Signed-off-by: Kai Blin <[email protected]>
    Reviewed-by: Michael Adam <[email protected]>

commit df43027bd8c127a44304f7130bf61adfcdf73eed
Author: Kai Blin <[email protected]>
Date:   Sat May 25 13:21:33 2013 +0200

    dns: Support larger queries when asking forwarder
    
    This should fix bug #9632
    
    Signed-off-by: Kai Blin <[email protected]>
    Reviewed-by: Michael Adam <[email protected]>

commit 5bcebb54da8eed535e5f7034ed1f7a95456f19b1
Author: Kai Blin <[email protected]>
Date:   Sat May 25 13:21:32 2013 +0200

    idl: Add support for parsing OPT records
    
    Signed-off-by: Kai Blin <[email protected]>
    Reviewed-by: Michael Adam <[email protected]>

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

Summary of changes:
 librpc/idl/dns.idl              |   23 +++++++++++++++++++++++
 source4/dns_server/dns_query.c  |   13 +++++++++++++
 source4/dns_server/dns_server.c |    2 ++
 source4/dns_server/dns_server.h |    4 ++++
 source4/dns_server/dns_utils.c  |   21 +++++++++++++++++++++
 5 files changed, 63 insertions(+), 0 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/idl/dns.idl b/librpc/idl/dns.idl
index 984f2b3..d247e0e 100644
--- a/librpc/idl/dns.idl
+++ b/librpc/idl/dns.idl
@@ -106,6 +106,7 @@ interface dns
                DNS_QTYPE_ATMA   = 0x0022,
                DNS_QTYPE_NAPTR  = 0x0023,
                DNS_QTYPE_DNAME  = 0x0027,
+               DNS_QTYPE_OPT    = 0x0029,
                DNS_QTYPE_DS     = 0x002B,
                DNS_QTYPE_RRSIG  = 0x002E,
                DNS_QTYPE_NSEC   = 0x002F,
@@ -151,6 +152,13 @@ interface dns
        } dns_soa_record;
 
        typedef [public] struct {
+               [value(strlen(cpu))] uint8 cpu_length;
+               [charset(DOS)] uint8 cpu[cpu_length];
+               [value(strlen(os))] uint8 os_length;
+               [charset(DOS)] uint8 os[os_length];
+       } dns_hinfo_record;
+
+       typedef [public] struct {
                uint16     preference;
                dns_string exchange;
        } dns_mx_record;
@@ -161,6 +169,12 @@ interface dns
        } dns_txt_record;
 
        typedef [public] struct {
+               dns_string mbox;
+               dns_string txt;
+
+       } dns_rp_record;
+
+       typedef [public] struct {
                uint16     priority;
                uint16     weight;
                uint16     port;
@@ -168,6 +182,12 @@ interface dns
        } dns_srv_record;
 
        typedef [public] struct {
+               uint16     option_code;
+               uint16     option_length;
+               uint8      option_data[option_length];
+       } dns_opt_record;
+
+       typedef [public] struct {
                dns_string     algorithm;
                uint32         inception;
                uint32         expiration;
@@ -212,10 +232,13 @@ interface dns
                [case(DNS_QTYPE_CNAME)] dns_string       cname_record;
                [case(DNS_QTYPE_SOA)]   dns_soa_record   soa_record;
                [case(DNS_QTYPE_PTR)]   dns_string       ptr_record;
+               [case(DNS_QTYPE_HINFO)] dns_hinfo_record  hinfo_record;
                [case(DNS_QTYPE_MX)]    dns_mx_record    mx_record;
                [case(DNS_QTYPE_TXT)]   dns_txt_record   txt_record;
+               [case(DNS_QTYPE_RP)]    dns_rp_record    rp_record;
                [case(DNS_QTYPE_AAAA)]  ipv6address      ipv6_record;
                [case(DNS_QTYPE_SRV)]   dns_srv_record   srv_record;
+               [case(DNS_QTYPE_OPT)]   dns_opt_record   opt_record;
                [case(DNS_QTYPE_TSIG)]  dns_tsig_record  tsig_record;
                [case(DNS_QTYPE_TKEY)]  dns_tkey_record  tkey_record;
                [default];
diff --git a/source4/dns_server/dns_query.c b/source4/dns_server/dns_query.c
index 4ad14b9..5414e1d 100644
--- a/source4/dns_server/dns_query.c
+++ b/source4/dns_server/dns_query.c
@@ -138,14 +138,17 @@ struct ask_forwarder_state {
 static void ask_forwarder_done(struct tevent_req *subreq);
 
 static struct tevent_req *ask_forwarder_send(
+       struct dns_server *dns,
        TALLOC_CTX *mem_ctx, struct tevent_context *ev,
        const char *forwarder, struct dns_name_question *question)
 {
        struct tevent_req *req, *subreq;
        struct ask_forwarder_state *state;
+       struct dns_res_rec *options;
        struct dns_name_packet out_packet = { 0, };
        DATA_BLOB out_blob;
        enum ndr_err_code ndr_err;
+       WERROR werr;
 
        req = tevent_req_create(mem_ctx, &state, struct ask_forwarder_state);
        if (req == NULL) {
@@ -166,6 +169,15 @@ static struct tevent_req *ask_forwarder_send(
        out_packet.qdcount = 1;
        out_packet.questions = question;
 
+       werr = dns_generate_options(dns, state, &options);
+       if (!W_ERROR_IS_OK(werr)) {
+               tevent_req_werror(req, werr);
+               return tevent_req_post(req, ev);
+       }
+
+       out_packet.arcount = 1;
+       out_packet.additional = options;
+
        ndr_err = ndr_push_struct_blob(
                &out_blob, state, &out_packet,
                (ndr_push_flags_fn_t)ndr_push_dns_name_packet);
@@ -615,6 +627,7 @@ struct tevent_req *dns_server_process_query_send(
                          in->questions[0].name));
 
                subreq = ask_forwarder_send(
+                       dns,
                        state, ev, lpcfg_dns_forwarder(dns->task->lp_ctx),
                        &in->questions[0]);
                if (tevent_req_nomem(subreq, req)) {
diff --git a/source4/dns_server/dns_server.c b/source4/dns_server/dns_server.c
index bb4605f..7ad4aca 100644
--- a/source4/dns_server/dns_server.c
+++ b/source4/dns_server/dns_server.c
@@ -791,6 +791,8 @@ static void dns_task_init(struct task_server *task)
        }
 
        dns->task = task;
+       /*FIXME: Make this a configurable option */
+       dns->max_payload = 4096;
 
        dns->server_credentials = cli_credentials_init(dns);
        if (!dns->server_credentials) {
diff --git a/source4/dns_server/dns_server.h b/source4/dns_server/dns_server.h
index ef85730..efe4db8 100644
--- a/source4/dns_server/dns_server.h
+++ b/source4/dns_server/dns_server.h
@@ -56,6 +56,7 @@ struct dns_server {
        struct dns_server_zone *zones;
        struct dns_server_tkey_store *tkeys;
        struct cli_credentials *server_credentials;
+       uint16_t max_payload;
 };
 
 struct dns_request_state {
@@ -107,6 +108,9 @@ WERROR dns_name2dn(struct dns_server *dns,
                   TALLOC_CTX *mem_ctx,
                   const char *name,
                   struct ldb_dn **_dn);
+WERROR dns_generate_options(struct dns_server *dns,
+                           TALLOC_CTX *mem_ctx,
+                           struct dns_res_rec **options);
 struct dns_server_tkey *dns_find_tkey(struct dns_server_tkey_store *store,
                                      const char *name);
 WERROR dns_verify_tsig(struct dns_server *dns,
diff --git a/source4/dns_server/dns_utils.c b/source4/dns_server/dns_utils.c
index e03a409..21c7f5a 100644
--- a/source4/dns_server/dns_utils.c
+++ b/source4/dns_server/dns_utils.c
@@ -378,3 +378,24 @@ WERROR dns_name2dn(struct dns_server *dns,
        *_dn = dn;
        return WERR_OK;
 }
+
+WERROR dns_generate_options(struct dns_server *dns,
+                           TALLOC_CTX *mem_ctx,
+                           struct dns_res_rec **options)
+{
+       struct dns_res_rec *o;
+
+       o = talloc_zero(mem_ctx, struct dns_res_rec);
+       if (o == NULL) {
+               return WERR_NOMEM;
+       }
+       o->name = '\0';
+       o->rr_type = DNS_QTYPE_OPT;
+       /* This is ugly, but RFC2671 wants the payload size in this field */
+       o->rr_class = (enum dns_qclass) dns->max_payload;
+       o->ttl = 0;
+       o->length = 0;
+
+       *options = o;
+       return WERR_OK;
+}


-- 
Samba Shared Repository

Reply via email to