[SCM] Samba Shared Repository - branch master updated

Andrew Tridgell tridge at samba.org
Tue Dec 21 04:06:02 MST 2010


The branch, master has been updated
       via  901f348 s4-dns: set dwSerial and dwFlags
       via  f2dea30 s4-dns: fixed name comparison in bind9 module
       via  e7b1aca dns: cope with trailing '.' in dns_name
       via  8466027 s4-dns: return the local hostname as the SOA authority
       via  f9e2a92 s4-provision: removed an incorrect debug message
       via  da5c328 s4-dns: disable segfault handling in dlz_bind9
      from  71d0fd8 s4:auth/session.h - use a forward declaration for type "struct ldb_context"

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


- Log -----------------------------------------------------------------
commit 901f34840b0cd3dc197828d642b7b5e882e8fc00
Author: Andrew Tridgell <tridge at samba.org>
Date:   Tue Dec 21 20:53:58 2010 +1100

    s4-dns: set dwSerial and dwFlags
    
    we are waiting on full docs on these, but this is better than zero
    
    Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>
    
    Autobuild-User: Andrew Tridgell <tridge at samba.org>
    Autobuild-Date: Tue Dec 21 12:05:51 CET 2010 on sn-devel-104

commit f2dea305f4bd263325076c8ec21e31fa40d37168
Author: Andrew Tridgell <tridge at samba.org>
Date:   Tue Dec 21 20:53:11 2010 +1100

    s4-dns: fixed name comparison in bind9 module
    
    we need to compare without the trailing '.'
    
    Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>

commit e7b1acaddf2ccc7de0301cc67f72187ab450e7b5
Author: Andrew Tridgell <tridge at samba.org>
Date:   Tue Dec 21 20:52:24 2010 +1100

    dns: cope with trailing '.' in dns_name

commit 8466027bf91b83076b5d42b6d8cee90897930c1c
Author: Andrew Tridgell <tridge at samba.org>
Date:   Tue Dec 21 13:26:15 2010 +1100

    s4-dns: return the local hostname as the SOA authority
    
    this is done by all DCs in the domain to ensure that updates go to the
    right place

commit f9e2a92881c7e72d154274d75eff0ebd24316816
Author: Andrew Tridgell <tridge at samba.org>
Date:   Tue Dec 21 12:42:49 2010 +1100

    s4-provision: removed an incorrect debug message
    
    this is now used as part of the main join

commit da5c328b4b4a793053a8b1c942ceda56da01625c
Author: Andrew Tridgell <tridge at samba.org>
Date:   Tue Dec 21 12:42:23 2010 +1100

    s4-dns: disable segfault handling in dlz_bind9
    
    we don't want bind9 calling the Samba segv handler

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

Summary of changes:
 lib/util/fault.c               |   14 ++++++++-
 lib/util/util.h                |    1 +
 librpc/ndr/ndr_dnsp.c          |    8 +++++-
 source4/dns_server/dlz_bind9.c |   57 ++++++++++++++++++++++++++++++++++-----
 source4/param/provision.c      |    2 -
 5 files changed, 69 insertions(+), 13 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/util/fault.c b/lib/util/fault.c
index bbb3190..256e55a 100644
--- a/lib/util/fault.c
+++ b/lib/util/fault.c
@@ -187,9 +187,10 @@ setup our fault handlers
 **/
 _PUBLIC_ void fault_setup(const char *pname)
 {
-	if (progname == NULL) {
-		progname = pname;
+	if (progname != NULL) {
+		return;
 	}
+	progname = pname;
 #ifdef SIGSEGV
 	CatchSignal(SIGSEGV, sig_fault);
 #endif
@@ -205,6 +206,15 @@ _PUBLIC_ void fault_setup(const char *pname)
 }
 
 /**
+   disable setting up fault handlers
+**/
+_PUBLIC_ void fault_setup_disable(void)
+{
+	progname = "fault disabled";
+}
+
+
+/**
   register a fault handler. 
   Should only be called once in the execution of smbd.
 */
diff --git a/lib/util/util.h b/lib/util/util.h
index 0073aa9..86bb3da 100644
--- a/lib/util/util.h
+++ b/lib/util/util.h
@@ -87,6 +87,7 @@ _PUBLIC_ _NORETURN_ void smb_panic(const char *why);
 setup our fault handlers
 **/
 _PUBLIC_ void fault_setup(const char *pname);
+_PUBLIC_ void fault_setup_disable(void);
 #endif
 
 /**
diff --git a/librpc/ndr/ndr_dnsp.c b/librpc/ndr/ndr_dnsp.c
index ae78425..daf8fff 100644
--- a/librpc/ndr/ndr_dnsp.c
+++ b/librpc/ndr/ndr_dnsp.c
@@ -95,7 +95,13 @@ enum ndr_err_code ndr_push_dnsp_name(struct ndr_push *ndr, int ndr_flags, const
 	for (count=i=0; name[i]; i++) {
 		if (name[i] == '.') count++;
 	}
-	total_len = strlen(name) + 1 + 1;
+	total_len = strlen(name) + 1;
+
+	/* cope with names ending in '.' */
+	if (name[strlen(name)-1] != '.') {
+		total_len++;
+		count++;
+	}
 	if (total_len > 255 || count > 255) {
 		return ndr_push_error(ndr, NDR_ERR_BUFSIZE,
 				      "dns_name of length %d larger than 255", total_len);
diff --git a/source4/dns_server/dlz_bind9.c b/source4/dns_server/dlz_bind9.c
index dc4c4bc..83790c8 100644
--- a/source4/dns_server/dlz_bind9.c
+++ b/source4/dns_server/dlz_bind9.c
@@ -38,6 +38,7 @@ struct dlz_bind9_data {
 	struct tevent_context *ev_ctx;
 	struct loadparm_context *lp;
 	int *transaction_token;
+	uint32_t soa_serial;
 
 	/* helper functions from the dlz_dlopen driver */
 	void (*log)(int level, const char *fmt, ...);
@@ -144,10 +145,28 @@ static bool b9_format(struct dlz_bind9_data *state,
 		*data = rec->data.ns;
 		break;
 
-	case DNS_TYPE_SOA:
+	case DNS_TYPE_SOA: {
+		const char *mname;
 		*type = "soa";
+
+		/* we need to fake the authoritative nameserver to
+		 * point at ourselves. This is now AD DNS servers
+		 * force clients to send updates to the right local DC
+		 */
+		mname = talloc_asprintf(mem_ctx, "%s.%s",
+					lpcfg_netbios_name(state->lp), lpcfg_dnsdomain(state->lp));
+		if (mname == NULL) {
+			return false;
+		}
+		mname = strlower_talloc(mem_ctx, mname);
+		if (mname == NULL) {
+			return false;
+		}
+
+		state->soa_serial = rec->data.soa.serial;
+
 		*data = talloc_asprintf(mem_ctx, "%s %s %u %u %u %u %u",
-					rec->data.soa.mname,
+					mname,
 					rec->data.soa.rname,
 					rec->data.soa.serial,
 					rec->data.soa.refresh,
@@ -155,6 +174,7 @@ static bool b9_format(struct dlz_bind9_data *state,
 					rec->data.soa.expire,
 					rec->data.soa.minimum);
 		break;
+	}
 
 	default:
 		state->log(ISC_LOG_ERROR, "samba b9_putrr: unhandled record type %u",
@@ -413,6 +433,8 @@ static isc_result_t parse_options(struct dlz_bind9_data *state,
 	struct poptOption **popt_options;
 	int ret;
 
+	fault_setup_disable();
+
 	popt_options = ldb_module_popt_options(state->samdb);
 	(*popt_options) = long_options;
 
@@ -1066,6 +1088,21 @@ static isc_result_t b9_add_record(struct dlz_bind9_data *state, const char *name
 	return ISC_R_SUCCESS;
 }
 
+/*
+  see if two DNS names are the same
+ */
+static bool dns_name_equal(const char *name1, const char *name2)
+{
+	size_t len1 = strlen(name1);
+	size_t len2 = strlen(name2);
+	if (name1[len1-1] == '.') len1--;
+	if (name2[len2-1] == '.') len2--;
+	if (len1 != len2) {
+		return false;
+	}
+	return strncasecmp_m(name1, name2, len1) == 0;
+}
+
 
 /*
   see if two dns records match
@@ -1088,31 +1125,31 @@ static bool b9_record_match(struct dlz_bind9_data *state,
 	case DNS_TYPE_AAAA:
 		return strcmp(rec1->data.ipv6, rec2->data.ipv6) == 0;
 	case DNS_TYPE_CNAME:
-		return strcmp(rec1->data.cname, rec2->data.cname) == 0;
+		return dns_name_equal(rec1->data.cname, rec2->data.cname);
 	case DNS_TYPE_TXT:
 		return strcmp(rec1->data.txt, rec2->data.txt) == 0;
 	case DNS_TYPE_PTR:
 		return strcmp(rec1->data.ptr, rec2->data.ptr) == 0;
 	case DNS_TYPE_NS:
-		return strcmp(rec1->data.ns, rec2->data.ns) == 0;
+		return dns_name_equal(rec1->data.ns, rec2->data.ns);
 
 	case DNS_TYPE_SRV:
 		return rec1->data.srv.wPriority == rec2->data.srv.wPriority &&
 			rec1->data.srv.wWeight  == rec2->data.srv.wWeight &&
 			rec1->data.srv.wPort    == rec2->data.srv.wPort &&
-			strcmp(rec1->data.srv.nameTarget, rec2->data.srv.nameTarget) == 0;
+			dns_name_equal(rec1->data.srv.nameTarget, rec2->data.srv.nameTarget);
 
 	case DNS_TYPE_MX:
 		return rec1->data.mx.wPriority == rec2->data.mx.wPriority &&
-			strcmp(rec1->data.mx.nameTarget, rec2->data.mx.nameTarget) == 0;
+			dns_name_equal(rec1->data.mx.nameTarget, rec2->data.mx.nameTarget);
 
 	case DNS_TYPE_HINFO:
 		return strcmp(rec1->data.hinfo.cpu, rec2->data.hinfo.cpu) == 0 &&
 			strcmp(rec1->data.hinfo.os, rec2->data.hinfo.os) == 0;
 
 	case DNS_TYPE_SOA:
-		return strcmp(rec1->data.soa.mname, rec2->data.soa.mname) == 0 &&
-			strcmp(rec1->data.soa.rname, rec2->data.soa.rname) == 0 &&
+		return dns_name_equal(rec1->data.soa.mname, rec2->data.soa.mname) &&
+			dns_name_equal(rec1->data.soa.rname, rec2->data.soa.rname) &&
 			rec1->data.soa.serial == rec2->data.soa.serial &&
 			rec1->data.soa.refresh == rec2->data.soa.refresh &&
 			rec1->data.soa.retry == rec2->data.soa.retry &&
@@ -1153,6 +1190,10 @@ _PUBLIC_ isc_result_t dlz_addrdataset(const char *name, const char *rdatastr, vo
 		return ISC_R_NOMEMORY;
 	}
 
+	/* we're waiting on docs for this field */
+	rec->dwFlags = 0x0000f005;
+	rec->dwSerial = state->soa_serial;
+
 	if (!b9_parse(state, rdatastr, rec)) {
 		state->log(ISC_LOG_INFO, "samba_dlz: failed to parse rdataset '%s'", rdatastr);
 		talloc_free(rec);
diff --git a/source4/param/provision.c b/source4/param/provision.c
index f1ef695..4ae1971 100644
--- a/source4/param/provision.c
+++ b/source4/param/provision.c
@@ -343,8 +343,6 @@ struct ldb_context *provision_get_schema(TALLOC_CTX *mem_ctx, struct loadparm_co
 	const char *setupdir;
 	PyObject *schema_mod, *schema_dict, *schema_fn, *py_result, *parameters;
 	
-	DEBUG(0,("Schema for DRS tests using python\n"));
-
 	Py_Initialize();
 	py_update_path("bin"); /* FIXME: Can't assume this is always the case */
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list