[SCM] Samba Shared Repository - branch master updated - 2049cfe743a2ea4ec1db17b21500b98ba8bab4c7

Jelmer Vernooij jelmer at samba.org
Mon Oct 13 14:10:37 GMT 2008


The branch, master has been updated
       via  2049cfe743a2ea4ec1db17b21500b98ba8bab4c7 (commit)
       via  2fddd2e2d5fb32ff15a170acc443218481986b91 (commit)
       via  6d02f0805a001ae4ac19219c7fff5247e470b0fd (commit)
       via  58f844ab5422490d49b21701ffbe706c06b8c40a (commit)
       via  8cae7a5baba9c62c2205ea88e0eafeb3248b978a (commit)
       via  390d37187afce0d9e31d4a4f145c759d1c2d6cda (commit)
       via  5ae73c67b5daf493aa2f37027b4567f3633543cf (commit)
       via  e779345bca36c2dfd11dea773e4b8aa68e4a3863 (commit)
       via  de0aa7850c57aadef72659651e8de33d644706fa (commit)
      from  bf768aa1ecfdc01abe2bef79cc5608b4cab93b7e (commit)

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


- Log -----------------------------------------------------------------
commit 2049cfe743a2ea4ec1db17b21500b98ba8bab4c7
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Mon Oct 13 16:09:48 2008 +0200

    Share ndr.c implementation.

commit 2fddd2e2d5fb32ff15a170acc443218481986b91
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Mon Oct 13 15:58:45 2008 +0200

    Share ndrdump implementation.

commit 6d02f0805a001ae4ac19219c7fff5247e470b0fd
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Mon Oct 13 15:33:40 2008 +0200

    Import warning fixes from Samba 3 into libndr, sync more libndr code.

commit 58f844ab5422490d49b21701ffbe706c06b8c40a
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Mon Oct 13 15:23:35 2008 +0200

    Share uuid implementations.

commit 8cae7a5baba9c62c2205ea88e0eafeb3248b978a
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Mon Oct 13 15:22:27 2008 +0200

    Share ndr_misc implementations.

commit 390d37187afce0d9e31d4a4f145c759d1c2d6cda
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Mon Oct 13 15:20:10 2008 +0200

    Share ndr_basic implementation.

commit 5ae73c67b5daf493aa2f37027b4567f3633543cf
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Mon Oct 13 15:17:41 2008 +0200

    Import warning fixes from Samba 3.

commit e779345bca36c2dfd11dea773e4b8aa68e4a3863
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Mon Oct 13 15:01:28 2008 +0200

    Import changes from upstream libndr.

commit de0aa7850c57aadef72659651e8de33d644706fa
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Mon Oct 13 14:38:42 2008 +0200

    Move code specific to Samba 3 to a separate file.

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

Summary of changes:
 librpc/ndr/ndr.c                   | 1118 ++++++++++++++++++++++++++++++++++++
 librpc/ndr/ndr_basic.c             |  833 +++++++++++++++++++++++++++
 librpc/ndr/ndr_misc.c              |   46 ++
 librpc/ndr/uuid.c                  |  227 ++++++++
 librpc/tools/ndrdump.1.xml         |   83 +++
 librpc/tools/ndrdump.c             |  461 +++++++++++++++
 source3/Makefile.in                |   11 +-
 source3/include/proto.h            |   11 +-
 source3/lib/util.c                 |   73 +++-
 source3/librpc/ndr/libndr.h        |  201 ++++++-
 source3/librpc/ndr/ndr.c           |  271 +++++-----
 source3/librpc/ndr/ndr_basic.c     |  859 ---------------------------
 source3/librpc/ndr/ndr_krb5pac.c   |    9 +-
 source3/librpc/ndr/ndr_misc.c      |   94 ---
 source3/librpc/ndr/ndr_string.c    |   71 +--
 source3/librpc/ndr/util.c          |  188 ++++++
 source3/librpc/ndr/uuid.c          |  227 --------
 source3/libsmb/clidgram.c          |    2 +-
 source4/librpc/config.mk           |    8 +-
 source4/librpc/ndr/ndr.c           | 1103 -----------------------------------
 source4/librpc/ndr/ndr_basic.c     |  833 ---------------------------
 source4/librpc/ndr/ndr_misc.c      |   46 --
 source4/librpc/ndr/ndr_string.c    |    3 +-
 source4/librpc/ndr/uuid.c          |  227 --------
 source4/librpc/tools/ndrdump.1.xml |   83 ---
 source4/librpc/tools/ndrdump.c     |  459 ---------------
 26 files changed, 3373 insertions(+), 4174 deletions(-)
 create mode 100644 librpc/ndr/ndr.c
 create mode 100644 librpc/ndr/ndr_basic.c
 create mode 100644 librpc/ndr/ndr_misc.c
 create mode 100644 librpc/ndr/uuid.c
 create mode 100644 librpc/tools/ndrdump.1.xml
 create mode 100644 librpc/tools/ndrdump.c
 delete mode 100644 source3/librpc/ndr/ndr_basic.c
 delete mode 100644 source3/librpc/ndr/ndr_misc.c
 create mode 100644 source3/librpc/ndr/util.c
 delete mode 100644 source3/librpc/ndr/uuid.c
 delete mode 100644 source4/librpc/ndr/ndr.c
 delete mode 100644 source4/librpc/ndr/ndr_basic.c
 delete mode 100644 source4/librpc/ndr/ndr_misc.c
 delete mode 100644 source4/librpc/ndr/uuid.c
 delete mode 100644 source4/librpc/tools/ndrdump.1.xml
 delete mode 100644 source4/librpc/tools/ndrdump.c


Changeset truncated at 500 lines:

diff --git a/librpc/ndr/ndr.c b/librpc/ndr/ndr.c
new file mode 100644
index 0000000..2f1daea
--- /dev/null
+++ b/librpc/ndr/ndr.c
@@ -0,0 +1,1118 @@
+/* 
+   Unix SMB/CIFS implementation.
+
+   libndr interface
+
+   Copyright (C) Andrew Tridgell 2003
+   
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+   
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+   
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/*
+  this provides the core routines for NDR parsing functions
+
+  see http://www.opengroup.org/onlinepubs/9629399/chap14.htm for details
+  of NDR encoding rules
+*/
+
+#include "includes.h"
+#include "librpc/ndr/libndr.h"
+#include "../lib/util/dlinklist.h"
+#if _SAMBA_BUILD_ == 4
+#include "param/param.h"
+#endif
+
+#define NDR_BASE_MARSHALL_SIZE 1024
+
+/* this guid indicates NDR encoding in a protocol tower */
+const struct ndr_syntax_id ndr_transfer_syntax = {
+  { 0x8a885d04, 0x1ceb, 0x11c9, {0x9f, 0xe8}, {0x08,0x00,0x2b,0x10,0x48,0x60} },
+  2
+};
+
+const struct ndr_syntax_id ndr64_transfer_syntax = {
+  { 0x71710533, 0xbeba, 0x4937, {0x83, 0x19}, {0xb5,0xdb,0xef,0x9c,0xcc,0x36} },
+  1
+};
+
+/*
+  work out the number of bytes needed to align on a n byte boundary
+*/
+_PUBLIC_ size_t ndr_align_size(uint32_t offset, size_t n)
+{
+	if ((offset & (n-1)) == 0) return 0;
+	return n - (offset & (n-1));
+}
+
+/*
+  initialise a ndr parse structure from a data blob
+*/
+_PUBLIC_ struct ndr_pull *ndr_pull_init_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience)
+{
+	struct ndr_pull *ndr;
+
+	ndr = talloc_zero(mem_ctx, struct ndr_pull);
+	if (!ndr) return NULL;
+	ndr->current_mem_ctx = mem_ctx;
+
+	ndr->data = blob->data;
+	ndr->data_size = blob->length;
+	ndr->iconv_convenience = talloc_reference(ndr, iconv_convenience);
+
+	return ndr;
+}
+
+/*
+  advance by 'size' bytes
+*/
+_PUBLIC_ enum ndr_err_code ndr_pull_advance(struct ndr_pull *ndr, uint32_t size)
+{
+	ndr->offset += size;
+	if (ndr->offset > ndr->data_size) {
+		return ndr_pull_error(ndr, NDR_ERR_BUFSIZE, 
+				      "ndr_pull_advance by %u failed",
+				      size);
+	}
+	return NDR_ERR_SUCCESS;
+}
+
+/*
+  set the parse offset to 'ofs'
+*/
+static enum ndr_err_code ndr_pull_set_offset(struct ndr_pull *ndr, uint32_t ofs)
+{
+	ndr->offset = ofs;
+	if (ndr->offset > ndr->data_size) {
+		return ndr_pull_error(ndr, NDR_ERR_BUFSIZE, 
+				      "ndr_pull_set_offset %u failed",
+				      ofs);
+	}
+	return NDR_ERR_SUCCESS;
+}
+
+/* create a ndr_push structure, ready for some marshalling */
+_PUBLIC_ struct ndr_push *ndr_push_init_ctx(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience)
+{
+	struct ndr_push *ndr;
+
+	ndr = talloc_zero(mem_ctx, struct ndr_push);
+	if (!ndr) {
+		return NULL;
+	}
+
+	ndr->flags = 0;
+	ndr->alloc_size = NDR_BASE_MARSHALL_SIZE;
+	ndr->data = talloc_array(ndr, uint8_t, ndr->alloc_size);
+	if (!ndr->data) {
+		return NULL;
+	}
+	ndr->iconv_convenience = talloc_reference(ndr, iconv_convenience);
+
+	return ndr;
+}
+
+/* return a DATA_BLOB structure for the current ndr_push marshalled data */
+_PUBLIC_ DATA_BLOB ndr_push_blob(struct ndr_push *ndr)
+{
+	DATA_BLOB blob;
+	blob = data_blob_const(ndr->data, ndr->offset);
+	if (ndr->alloc_size > ndr->offset) {
+		ndr->data[ndr->offset] = 0;
+	}
+	return blob;
+}
+
+
+/*
+  expand the available space in the buffer to ndr->offset + extra_size
+*/
+_PUBLIC_ enum ndr_err_code ndr_push_expand(struct ndr_push *ndr, uint32_t extra_size)
+{
+	uint32_t size = extra_size + ndr->offset;
+
+	if (size < ndr->offset) {
+		/* extra_size overflowed the offset */
+		return ndr_push_error(ndr, NDR_ERR_BUFSIZE, "Overflow in push_expand to %u",
+				      size);
+	}
+
+	if (ndr->alloc_size > size) {
+		return NDR_ERR_SUCCESS;
+	}
+
+	ndr->alloc_size += NDR_BASE_MARSHALL_SIZE;
+	if (size+1 > ndr->alloc_size) {
+		ndr->alloc_size = size+1;
+	}
+	ndr->data = talloc_realloc(ndr, ndr->data, uint8_t, ndr->alloc_size);
+	if (!ndr->data) {
+		return ndr_push_error(ndr, NDR_ERR_ALLOC, "Failed to push_expand to %u",
+				      ndr->alloc_size);
+	}
+
+	return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_debug_helper(struct ndr_print *ndr, const char *format, ...) 
+{
+	va_list ap;
+	char *s = NULL;
+	int i, ret;
+
+	va_start(ap, format);
+	ret = vasprintf(&s, format, ap);
+	va_end(ap);
+
+	if (ret == -1) {
+		return;
+	}
+
+	for (i=0;i<ndr->depth;i++) {
+		DEBUGADD(0,("    "));
+	}
+
+	DEBUGADD(0,("%s\n", s));
+	free(s);
+}
+
+_PUBLIC_ void ndr_print_string_helper(struct ndr_print *ndr, const char *format, ...)
+{
+	va_list ap;
+	int i;
+
+	for (i=0;i<ndr->depth;i++) {
+		ndr->private_data = talloc_asprintf_append_buffer(
+					(char *)ndr->private_data, "    ");
+	}
+
+	va_start(ap, format);
+	ndr->private_data = talloc_vasprintf_append_buffer((char *)ndr->private_data, 
+						    format, ap);
+	va_end(ap);
+	ndr->private_data = talloc_asprintf_append_buffer((char *)ndr->private_data, 
+						   "\n");
+}
+
+/*
+  a useful helper function for printing idl structures via DEBUG()
+*/
+_PUBLIC_ void ndr_print_debug(ndr_print_fn_t fn, const char *name, void *ptr)
+{
+	struct ndr_print *ndr;
+
+	ndr = talloc_zero(NULL, struct ndr_print);
+	if (!ndr) return;
+	ndr->print = ndr_print_debug_helper;
+	ndr->depth = 1;
+	ndr->flags = 0;
+	fn(ndr, name, ptr);
+	talloc_free(ndr);
+}
+
+/*
+  a useful helper function for printing idl unions via DEBUG()
+*/
+_PUBLIC_ void ndr_print_union_debug(ndr_print_fn_t fn, const char *name, uint32_t level, void *ptr)
+{
+	struct ndr_print *ndr;
+
+	ndr = talloc_zero(NULL, struct ndr_print);
+	if (!ndr) return;
+	ndr->print = ndr_print_debug_helper;
+	ndr->depth = 1;
+	ndr->flags = 0;
+	ndr_print_set_switch_value(ndr, ptr, level);
+	fn(ndr, name, ptr);
+	talloc_free(ndr);
+}
+
+/*
+  a useful helper function for printing idl function calls via DEBUG()
+*/
+_PUBLIC_ void ndr_print_function_debug(ndr_print_function_t fn, const char *name, int flags, void *ptr)
+{
+	struct ndr_print *ndr;
+
+	ndr = talloc_zero(NULL, struct ndr_print);
+	if (!ndr) return;
+	ndr->print = ndr_print_debug_helper;
+	ndr->depth = 1;
+	ndr->flags = 0;
+	fn(ndr, name, flags, ptr);
+	talloc_free(ndr);
+}
+
+/*
+  a useful helper function for printing idl structures to a string
+*/
+_PUBLIC_ char *ndr_print_struct_string(TALLOC_CTX *mem_ctx, ndr_print_fn_t fn, const char *name, void *ptr)
+{
+	struct ndr_print *ndr;
+	char *ret = NULL;
+
+	ndr = talloc_zero(mem_ctx, struct ndr_print);
+	if (!ndr) return NULL;
+	ndr->private_data = talloc_strdup(ndr, "");
+	if (!ndr->private_data) {
+		goto failed;
+	}
+	ndr->print = ndr_print_string_helper;
+	ndr->depth = 1;
+	ndr->flags = 0;
+	fn(ndr, name, ptr);
+	ret = talloc_steal(mem_ctx, (char *)ndr->private_data);
+failed:
+	talloc_free(ndr);
+	return ret;
+}
+
+/*
+  a useful helper function for printing idl unions to a string
+*/
+_PUBLIC_ char *ndr_print_union_string(TALLOC_CTX *mem_ctx, ndr_print_fn_t fn, const char *name, uint32_t level, void *ptr)
+{
+	struct ndr_print *ndr;
+	char *ret = NULL;
+
+	ndr = talloc_zero(mem_ctx, struct ndr_print);
+	if (!ndr) return NULL;
+	ndr->private_data = talloc_strdup(ndr, "");
+	if (!ndr->private_data) {
+		goto failed;
+	}
+	ndr->print = ndr_print_string_helper;
+	ndr->depth = 1;
+	ndr->flags = 0;
+	ndr_print_set_switch_value(ndr, ptr, level);
+	fn(ndr, name, ptr);
+	ret = talloc_steal(mem_ctx, (char *)ndr->private_data);
+failed:
+	talloc_free(ndr);
+	return ret;
+}
+
+/*
+  a useful helper function for printing idl function calls to a string
+*/
+_PUBLIC_ char *ndr_print_function_string(TALLOC_CTX *mem_ctx,
+				ndr_print_function_t fn, const char *name, 
+				int flags, void *ptr)
+{
+	struct ndr_print *ndr;
+	char *ret = NULL;
+
+	ndr = talloc_zero(mem_ctx, struct ndr_print);
+	if (!ndr) return NULL;
+	ndr->private_data = talloc_strdup(ndr, "");
+	if (!ndr->private_data) {
+		goto failed;
+	}
+	ndr->print = ndr_print_string_helper;
+	ndr->depth = 1;
+	ndr->flags = 0;
+	fn(ndr, name, flags, ptr);
+	ret = talloc_steal(mem_ctx, (char *)ndr->private_data);
+failed:
+	talloc_free(ndr);
+	return ret;
+}
+
+_PUBLIC_ void ndr_set_flags(uint32_t *pflags, uint32_t new_flags)
+{
+	/* the big/little endian flags are inter-dependent */
+	if (new_flags & LIBNDR_FLAG_LITTLE_ENDIAN) {
+		(*pflags) &= ~LIBNDR_FLAG_BIGENDIAN;
+	}
+	if (new_flags & LIBNDR_FLAG_BIGENDIAN) {
+		(*pflags) &= ~LIBNDR_FLAG_LITTLE_ENDIAN;
+	}
+	if (new_flags & LIBNDR_FLAG_REMAINING) {
+		(*pflags) &= ~LIBNDR_ALIGN_FLAGS;
+	}
+	if (new_flags & LIBNDR_ALIGN_FLAGS) {
+		(*pflags) &= ~LIBNDR_FLAG_REMAINING;
+	}
+	(*pflags) |= new_flags;
+}
+
+/*
+  return and possibly log an NDR error
+*/
+_PUBLIC_ enum ndr_err_code ndr_pull_error(struct ndr_pull *ndr,
+				 enum ndr_err_code ndr_err,
+				 const char *format, ...)
+{
+	char *s=NULL;
+	va_list ap;
+	int ret;
+
+	va_start(ap, format);
+	ret = vasprintf(&s, format, ap);
+	va_end(ap);
+
+	if (ret == -1) {
+		return NDR_ERR_ALLOC;
+	}
+
+	DEBUG(1,("ndr_pull_error(%u): %s\n", ndr_err, s));
+
+	free(s);
+
+	return ndr_err;
+}
+
+/*
+  return and possibly log an NDR error
+*/
+_PUBLIC_ enum ndr_err_code ndr_push_error(struct ndr_push *ndr,
+				 enum ndr_err_code ndr_err,
+				 const char *format, ...) 
+{
+	char *s=NULL;
+	va_list ap;
+	int ret;
+
+	va_start(ap, format);
+	ret = vasprintf(&s, format, ap);
+	va_end(ap);
+
+	if (ret == -1) {
+		return NDR_ERR_ALLOC;
+	}
+
+	DEBUG(1,("ndr_push_error(%u): %s\n", ndr_err, s));
+
+	free(s);
+
+	return ndr_err;
+}
+
+/*
+  handle subcontext buffers, which in midl land are user-marshalled, but
+  we use magic in pidl to make them easier to cope with
+*/
+_PUBLIC_ enum ndr_err_code ndr_pull_subcontext_start(struct ndr_pull *ndr,
+				   struct ndr_pull **_subndr,
+				   size_t header_size,
+				   ssize_t size_is)
+{
+	struct ndr_pull *subndr;
+	uint32_t r_content_size;
+	bool force_le = false;
+	bool force_be = false;
+
+	switch (header_size) {
+	case 0: {
+		uint32_t content_size = ndr->data_size - ndr->offset;
+		if (size_is >= 0) {
+			content_size = size_is;
+		}
+		r_content_size = content_size;
+		break;
+	}
+
+	case 2: {
+		uint16_t content_size;
+		NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &content_size));
+		if (size_is >= 0 && size_is != content_size) {
+			return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PULL) size_is(%d) mismatch content_size %d", 
+						(int)size_is, (int)content_size);
+		}
+		r_content_size = content_size;
+		break;
+	}
+
+	case 4: {
+		uint32_t content_size;
+		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &content_size));
+		if (size_is >= 0 && size_is != content_size) {
+			return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PULL) size_is(%d) mismatch content_size %d", 
+						(int)size_is, (int)content_size);
+		}
+		r_content_size = content_size;
+		break;
+	}
+	case 0xFFFFFC01: {
+		/*
+		 * Common Type Header for the Serialization Stream
+		 * See [MS-RPCE] 2.2.6 Type Serialization Version 1
+		 */
+		uint8_t version;
+		uint8_t drep;
+		uint16_t hdrlen;
+		uint32_t filler;
+		uint32_t content_size;
+		uint32_t reserved;
+
+		/* version */
+		NDR_CHECK(ndr_pull_uint8(ndr, NDR_SCALARS, &version));
+
+		if (version != 1) {
+			return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT,
+					      "Bad subcontext (PULL) Common Type Header version %d != 1",
+					      (int)version);
+		}
+
+		/*
+		 * 0x10 little endian
+		 * 0x00 big endian
+		 */
+		NDR_CHECK(ndr_pull_uint8(ndr, NDR_SCALARS, &drep));
+		if (drep == 0x10) {
+			force_le = true;
+		} else if (drep == 0x00) {
+			force_be = true;
+		} else {
+			return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT,
+					      "Bad subcontext (PULL) Common Type Header invalid drep 0x%02X",
+					      (unsigned int)drep);
+		}
+
+		/* length of the "Private Header for Constructed Type" */
+		NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &hdrlen));
+		if (hdrlen != 8) {
+			return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT,
+					      "Bad subcontext (PULL) Common Type Header length %d != 8",
+					      (int)hdrlen);
+		}
+
+		/* filler should be ignored */
+		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &filler));
+
+		/*
+		 * Private Header for Constructed Type


-- 
Samba Shared Repository


More information about the samba-cvs mailing list