The branch, master has been updated
       via  4820c97 dns: fixed the padding for dnsp_name fields in LDAP
       via  049a16c dns: auto-calculate the wDataLength field in DNS records
       via  8c04657 s4-dns: fixed a crash bug in dlz_bind9 code
       via  b9a2852 dnsp: fixed parsing of dns_name structures
      from  8998f4b Added call out to a Linux-compatible fallocate() when we 
need to extend a file allocation extent without changing end-of-file size.

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


- Log -----------------------------------------------------------------
commit 4820c97e9ea00e73f3188f9834a03913ed74df80
Author: Andrew Tridgell <[email protected]>
Date:   Tue Dec 21 11:59:54 2010 +1100

    dns: fixed the padding for dnsp_name fields in LDAP
    
    all names are NUL terminated, but may have additional padding as well
    
    Autobuild-User: Andrew Tridgell <[email protected]>
    Autobuild-Date: Tue Dec 21 03:26:26 CET 2010 on sn-devel-104

commit 049a16c8ef475f6b327292d231022fd4c5aaddf1
Author: Andrew Tridgell <[email protected]>
Date:   Tue Dec 21 11:59:05 2010 +1100

    dns: auto-calculate the wDataLength field in DNS records
    
    we need this for creating new records

commit 8c04657600cd6702dbfc66744fe2268c59ebea0b
Author: Andrew Tridgell <[email protected]>
Date:   Tue Dec 21 11:57:50 2010 +1100

    s4-dns: fixed a crash bug in dlz_bind9 code
    
    we need to keep el_ctx for the next part of the loop

commit b9a2852fdd68a0691ff567557824be44bb08b27a
Author: Andrew Tridgell <[email protected]>
Date:   Wed Dec 15 23:52:32 2010 +1100

    dnsp: fixed parsing of dns_name structures
    
    its not a pad byte, its a trailing zero

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

Summary of changes:
 librpc/idl/dnsp.idl            |    4 ++--
 librpc/ndr/ndr_dnsp.c          |   25 ++++++++++++++++++++-----
 source4/dns_server/dlz_bind9.c |    2 --
 3 files changed, 22 insertions(+), 9 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/idl/dnsp.idl b/librpc/idl/dnsp.idl
index 905e420..eed0c47 100644
--- a/librpc/idl/dnsp.idl
+++ b/librpc/idl/dnsp.idl
@@ -92,7 +92,7 @@ interface dnsp
                dnsp_name       nameTarget;
        } dnsp_srv;
 
-       typedef [nodiscriminant] union {
+       typedef [nodiscriminant,gensize] union {
                [case(DNS_TYPE_A)] [flag(NDR_BIG_ENDIAN)]   ipv4address ipv4;
                [case(DNS_TYPE_NS)]                         dnsp_name ns;
                [case(DNS_TYPE_CNAME)]                      dnsp_name cname;
@@ -109,7 +109,7 @@ interface dnsp
        /* this is the format for the dnsRecord attribute in the DNS
           partitions in AD */
        typedef [public] struct {
-               uint16          wDataLength;
+               [value(ndr_size_dnsRecordData(&data,wType,ndr->flags))] uint16 
wDataLength;
                dns_record_type wType;
                uint32          dwFlags;
                uint32          dwSerial;
diff --git a/librpc/ndr/ndr_dnsp.c b/librpc/ndr/ndr_dnsp.c
index 256638a..ae78425 100644
--- a/librpc/ndr/ndr_dnsp.c
+++ b/librpc/ndr/ndr_dnsp.c
@@ -36,14 +36,16 @@ _PUBLIC_ void ndr_print_dnsp_name(struct ndr_print *ndr, 
const char *name,
 */
 _PUBLIC_ enum ndr_err_code ndr_pull_dnsp_name(struct ndr_pull *ndr, int 
ndr_flags, const char **name)
 {
-       uint8_t len, count;
+       uint8_t len, count, termination;
        int i;
-       uint32_t total_len;
+       uint32_t total_len, raw_offset;
        char *ret;
 
        NDR_CHECK(ndr_pull_uint8(ndr, ndr_flags, &len));
        NDR_CHECK(ndr_pull_uint8(ndr, ndr_flags, &count));
 
+       raw_offset = ndr->offset;
+
        ret = talloc_strdup(ndr->current_mem_ctx, "");
        if (!ret) {
                return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull 
dnsp");
@@ -68,19 +70,32 @@ _PUBLIC_ enum ndr_err_code ndr_pull_dnsp_name(struct 
ndr_pull *ndr, int ndr_flag
                ret[newlen-1] = 0;
                total_len = newlen;
        }
+       NDR_CHECK(ndr_pull_uint8(ndr, ndr_flags, &termination));
+       if (termination != 0) {
+               return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp 
- not NUL terminated");
+       }
+       if (ndr->offset > raw_offset + len) {
+               return ndr_pull_error(ndr, NDR_ERR_ALLOC, "Failed to pull dnsp 
- overrun by %u bytes",
+                                     ndr->offset - (raw_offset + len));
+       }
+       /* there could be additional pad bytes */
+       while (ndr->offset < raw_offset + len) {
+               uint8_t pad;
+               NDR_CHECK(ndr_pull_uint8(ndr, ndr_flags, &pad));
+       }
        (*name) = ret;
-       NDR_PULL_ALIGN(ndr, 2);
        return NDR_ERR_SUCCESS;
 }
 
 enum ndr_err_code ndr_push_dnsp_name(struct ndr_push *ndr, int ndr_flags, 
const char *name)
 {
        int count, total_len, i;
+
        /* count the dots */
        for (count=i=0; name[i]; i++) {
                if (name[i] == '.') count++;
        }
-       total_len = strlen(name) + 1;
+       total_len = strlen(name) + 1 + 1;
        if (total_len > 255 || count > 255) {
                return ndr_push_error(ndr, NDR_ERR_BUFSIZE,
                                      "dns_name of length %d larger than 255", 
total_len);
@@ -94,7 +109,7 @@ enum ndr_err_code ndr_push_dnsp_name(struct ndr_push *ndr, 
int ndr_flags, const
                NDR_CHECK(ndr_push_bytes(ndr, (const uint8_t *)name, sublen));
                name += sublen + 1;
        }
-       NDR_PUSH_ALIGN(ndr, 2);
+       NDR_CHECK(ndr_push_uint8(ndr, ndr_flags, 0));
 
        return NDR_ERR_SUCCESS;
 }
diff --git a/source4/dns_server/dlz_bind9.c b/source4/dns_server/dlz_bind9.c
index 7e18165..dc4c4bc 100644
--- a/source4/dns_server/dlz_bind9.c
+++ b/source4/dns_server/dlz_bind9.c
@@ -821,13 +821,11 @@ _PUBLIC_ isc_result_t dlz_allnodes(const char *zone, void 
*dbdata,
                        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                                state->log(ISC_LOG_ERROR, "samba_dlz: failed to 
parse dnsRecord for %s",
                                           ldb_dn_get_linearized(dn));
-                               talloc_free(el_ctx);
                                continue;
                        }
 
                        result = b9_putnamedrr(state, allnodes, name, &rec);
                        if (result != ISC_R_SUCCESS) {
-                               talloc_free(el_ctx);
                                continue;
                        }
                }


-- 
Samba Shared Repository

Reply via email to