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 <tri...@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 <abart...@samba.org> Autobuild-User: Andrew Tridgell <tri...@samba.org> Autobuild-Date: Tue Dec 21 12:05:51 CET 2010 on sn-devel-104 commit f2dea305f4bd263325076c8ec21e31fa40d37168 Author: Andrew Tridgell <tri...@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 <abart...@samba.org> commit e7b1acaddf2ccc7de0301cc67f72187ab450e7b5 Author: Andrew Tridgell <tri...@samba.org> Date: Tue Dec 21 20:52:24 2010 +1100 dns: cope with trailing '.' in dns_name commit 8466027bf91b83076b5d42b6d8cee90897930c1c Author: Andrew Tridgell <tri...@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 <tri...@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 <tri...@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