[SCM] Samba Shared Repository - branch v4-0-test updated

Karolin Seeger kseeger at samba.org
Tue Jun 11 04:06:04 MDT 2013


The branch, v4-0-test has been updated
       via  57a6c8f dns: Support larger queries when asking forwarder
       via  81539da idl: Add support for parsing OPT records
      from  9328284 When message-type is drvupgrade, MSG_DEBUG should be replaced with MSG_PRINTER_DRVUPGRADE.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v4-0-test


- Log -----------------------------------------------------------------
commit 57a6c8feb7ce69725bde5c152f4241126a69cc07
Author: Kai Blin <kai at samba.org>
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 <kai at samba.org>
    Reviewed-by: Michael Adam <obnox at samba.org>
    (cherry picked from commit df43027bd8c127a44304f7130bf61adfcdf73eed)
    
    Autobuild-User(v4-0-test): Karolin Seeger <kseeger at samba.org>
    Autobuild-Date(v4-0-test): Tue Jun 11 12:05:09 CEST 2013 on sn-devel-104

commit 81539da2c69b2192ff745d1e904f8156aa84c125
Author: Kai Blin <kai at samba.org>
Date:   Sat May 25 13:21:32 2013 +0200

    idl: Add support for parsing OPT records
    
    Signed-off-by: Kai Blin <kai at samba.org>
    Reviewed-by: Michael Adam <obnox at samba.org>
    (cherry picked from commit 5bcebb54da8eed535e5f7034ed1f7a95456f19b1)

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

Summary of changes:
 librpc/idl/dns.idl              |    8 ++++++++
 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, 48 insertions(+), 0 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/idl/dns.idl b/librpc/idl/dns.idl
index 984f2b3..5b86f7e 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,
@@ -168,6 +169,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;
@@ -216,6 +223,7 @@ interface dns
 		[case(DNS_QTYPE_TXT)]	dns_txt_record   txt_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 75f0e9f..4ebd91a 100644
--- a/source4/dns_server/dns_query.c
+++ b/source4/dns_server/dns_query.c
@@ -135,14 +135,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) {
@@ -163,6 +166,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);
@@ -612,6 +624,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 29953c3..c7453e9 100644
--- a/source4/dns_server/dns_server.c
+++ b/source4/dns_server/dns_server.c
@@ -784,6 +784,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 b192730..eea3dfd 100644
--- a/source4/dns_server/dns_utils.c
+++ b/source4/dns_server/dns_utils.c
@@ -379,3 +379,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


More information about the samba-cvs mailing list