[SCM] Samba Shared Repository - branch v3-6-test updated

Jeremy Allison jra at samba.org
Mon Feb 28 17:46:34 MST 2011


The branch, v3-6-test has been updated
       via  ba1a72c spoolss.idl: align spoolss_DriverFileInfo relative pointer to 4 byte
       via  757471a spoolss.idl: align spoolss_PrinterEnumValues 'data' based on the type
       via  9313b5d TODO test/review librpc/ndr: remove align2 hack for relative pointers
       via  0fb64a2 TODO test/review librpc: align nstring and nstring_array to 2 byte
       via  6648ce8 librpc/ndr: ndr align relative pointers based on the given flags
       via  5f8b7f9 TODO test/review librpc/ndr: let ndr_push/pull_DATA_BLOB() look at LIBNDR_FLAG_REMAINING before LIBNDR_ALIGN_FLAGS
       via  ebd82cc Revert "Fix alignment issues in SPOOLSS "BUFFER" marshalling."
       via  83efd14 Fix compiler warning on casting -1 to uint32. (cherry picked from commit 87c4ceaf7c9ac98a35b5ed3de31191887d609d79)
       via  5232f3d Fix "cast from pointer to integer of different size" warnings on a 64-bit machine. (cherry picked from commit 30deb3fce96a3c1a5659e3f0011d90de32dc43b3)
      from  04ce66b Finish the range checking on all FD_SET calls for select(). (cherry picked from commit 874b2b726af07d95694e4bcc8ad201a2c145a588)

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


- Log -----------------------------------------------------------------
commit ba1a72cb153892e491af91a6bb61e1820135fa12
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Feb 22 15:56:30 2011 +0100

    spoolss.idl: align spoolss_DriverFileInfo relative pointer to 4 byte
    
    metze
    (cherry picked from commit b6ece01c7922adeb3c9e718bc8cc610cae7c543c)

commit 757471a5fcd4f95da28402bae6c9ceccff7d6548
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Feb 22 19:23:33 2011 +0100

    spoolss.idl: align spoolss_PrinterEnumValues 'data' based on the type
    
    metze
    (cherry picked from commit 341330600aebcec92fba64ea343888c15a0c3d44)

commit 9313b5d1da24406dd7d26afb2488fee0cbea44a9
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Feb 22 15:58:45 2011 +0100

    TODO test/review librpc/ndr: remove align2 hack for relative pointers
    
    metze
    (cherry picked from commit 23f6f449792d889538e0d0028bb8fbd5c807b0da)

commit 0fb64a26b3b35b75f2f548d882bed41aa0386c6b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Feb 22 15:57:21 2011 +0100

    TODO test/review librpc: align nstring and nstring_array to 2 byte
    
    metze
    (cherry picked from commit 712ef2590d0ee59a4a659926cdf8aac6e968dfa8)

commit 6648ce8990a97da739d4be69657e9ace6198068c
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Feb 22 15:45:44 2011 +0100

    librpc/ndr: ndr align relative pointers based on the given flags
    
    We used to do this only for the reverse relative pointers
    and now we always do it.
    
    metze
    (cherry picked from commit 84b884eb4bec38b721d6c38704f12d1d2c601bcb)

commit 5f8b7f95e9ce5946f048b242dbbaa14897aea919
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Feb 22 18:19:13 2011 +0100

    TODO test/review librpc/ndr: let ndr_push/pull_DATA_BLOB() look at LIBNDR_FLAG_REMAINING before LIBNDR_ALIGN_FLAGS
    
    metze
    (cherry picked from commit 6c3a49ced333988b21d86e47b2b1dd1a5957e15c)

commit ebd82cc7bb45ee9f0407f6c5415c836bd62b4098
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Feb 22 11:00:07 2011 +0100

    Revert "Fix alignment issues in SPOOLSS "BUFFER" marshalling."
    
    This reverts commit 187f695469071d0550613e037b36170facb85460.
    
    This is the wrong fix.
    
    metze
    (cherry picked from commit bd2b0076b4ea0be6e2f6730566736be7e338aafc)

commit 83efd14646cb4376eae8a14db8c1cee75785e159
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Feb 28 14:56:03 2011 -0800

    Fix compiler warning on casting -1 to uint32.
    (cherry picked from commit 87c4ceaf7c9ac98a35b5ed3de31191887d609d79)

commit 5232f3d263ab7e66003cc971c667528635008dc1
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Feb 28 12:25:40 2011 -0800

    Fix "cast from pointer to integer of different size" warnings on a 64-bit machine.
    (cherry picked from commit 30deb3fce96a3c1a5659e3f0011d90de32dc43b3)

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

Summary of changes:
 lib/tevent/tevent_poll.c                 |   14 ++++++------
 librpc/idl/idl_types.h                   |    4 +-
 librpc/idl/spoolss.idl                   |    4 +-
 librpc/ndr/ndr.c                         |   28 +++++++++++++++++++++++--
 librpc/ndr/ndr_basic.c                   |    9 ++++---
 librpc/ndr/ndr_spoolss_buf.c             |   32 ++++++++++++++++++++++++++++++
 librpc/ndr/ndr_spoolss_buf.h             |    1 +
 pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm |    7 ------
 source3/printing/printing.c              |    6 ++--
 9 files changed, 77 insertions(+), 28 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/tevent/tevent_poll.c b/lib/tevent/tevent_poll.c
index c133194..cda028a 100644
--- a/lib/tevent/tevent_poll.c
+++ b/lib/tevent/tevent_poll.c
@@ -64,7 +64,7 @@ static int poll_event_fd_destructor(struct tevent_fd *fde)
 	struct tevent_context *ev = fde->event_ctx;
 	struct poll_event_context *poll_ev = NULL;
 	struct tevent_fd *moved_fde;
-	int del_idx;
+	long del_idx;
 
 	if (ev == NULL) {
 		goto done;
@@ -76,7 +76,7 @@ static int poll_event_fd_destructor(struct tevent_fd *fde)
 	/*
 	 * Assume a void * can carry enough bits to hold num_fds.
 	 */
-	del_idx = (int)(fde->additional_data);
+	del_idx = (long)(fde->additional_data);
 
 	moved_fde = poll_ev->fd_events[poll_ev->num_fds-1];
 	poll_ev->fd_events[del_idx] = moved_fde;
@@ -152,7 +152,7 @@ static struct tevent_fd *poll_event_add_fd(struct tevent_context *ev,
 	/*
 	 * Assume a void * can carry enough bits to hold num_fds.
 	 */
-	fde->additional_data = (void *)poll_ev->num_fds;
+	fde->additional_data = (void *)(long)poll_ev->num_fds;
 	poll_ev->fd_events[poll_ev->num_fds] = fde;
 
 	poll_ev->num_fds += 1;
@@ -169,7 +169,7 @@ static void poll_event_set_fd_flags(struct tevent_fd *fde, uint16_t flags)
 {
 	struct poll_event_context *poll_ev = talloc_get_type_abort(
 		fde->event_ctx->additional_data, struct poll_event_context);
-	int idx;
+	long idx;
 	uint16_t pollflags = 0;
 
 	if (flags & TEVENT_FD_READ) {
@@ -179,7 +179,7 @@ static void poll_event_set_fd_flags(struct tevent_fd *fde, uint16_t flags)
 		pollflags |= (POLLOUT);
 	}
 
-	idx = (int)(fde->additional_data);
+	idx = (long)(fde->additional_data);
 	poll_ev->fds[idx].events = pollflags;
 
 	fde->flags = flags;
@@ -237,10 +237,10 @@ static int poll_event_loop_poll(struct tevent_context *ev,
 		   the handler to remove itself when called */
 		for (fde = ev->fd_events; fde; fde = fde->next) {
 			struct pollfd *pfd;
-			int pfd_idx;
+			long pfd_idx;
 			uint16_t flags = 0;
 
-			pfd_idx = (int)(fde->additional_data);
+			pfd_idx = (long)(fde->additional_data);
 
 			pfd = &poll_ev->fds[pfd_idx];
 
diff --git a/librpc/idl/idl_types.h b/librpc/idl/idl_types.h
index 3c6c12c..88ece20 100644
--- a/librpc/idl/idl_types.h
+++ b/librpc/idl/idl_types.h
@@ -12,7 +12,7 @@
 /*
   a null terminated UCS2 string
 */
-#define nstring		[flag(STR_NULLTERM)] string
+#define nstring		[flag(STR_NULLTERM|NDR_ALIGN2)] string
 
 /*
   an ascii string prefixed with [offset] [length], both 32 bits
@@ -50,7 +50,7 @@
 /*
   a null terminated UCS2 string
 */
-#define nstring_array	[flag(STR_NULLTERM)] string_array
+#define nstring_array	[flag(STR_NULLTERM|NDR_ALIGN2)] string_array
 
 #define NDR_NOALIGN       LIBNDR_FLAG_NOALIGN
 #define NDR_REMAINING     LIBNDR_FLAG_REMAINING
diff --git a/librpc/idl/spoolss.idl b/librpc/idl/spoolss.idl
index c74bd69..4599e3a 100644
--- a/librpc/idl/spoolss.idl
+++ b/librpc/idl/spoolss.idl
@@ -1560,7 +1560,7 @@ cpp_quote("#define spoolss_security_descriptor security_descriptor")
 		spoolss_DriverOSVersion version;
 		[relative] nstring *driver_name;
 		[relative] nstring *architecture;
-		[relative] [size_is(file_count)] spoolss_DriverFileInfo *file_info;
+		[relative,size_is(file_count),flag(NDR_ALIGN4)] spoolss_DriverFileInfo *file_info;
 		uint32 file_count;
 		[relative] nstring *monitor_name;
 		[relative] nstring *default_datatype;
@@ -2906,7 +2906,7 @@ cpp_quote("#define spoolss_security_descriptor security_descriptor")
 		[relative] nstring *value_name;
 		[value(2*strlen_m_term(value_name))] uint32 value_name_len;
 		winreg_Type type;
-		[relative,subcontext(0),subcontext_size(data_length),flag(NDR_REMAINING)] DATA_BLOB *data;
+		[relative,subcontext(0),subcontext_size(data_length),flag(NDR_REMAINING|ndr_spoolss_PrinterEnumValues_align(r->type))] DATA_BLOB *data;
 		[value(data ? data->length : 0)] uint32 data_length;
 	} spoolss_PrinterEnumValues;
 
diff --git a/librpc/ndr/ndr.c b/librpc/ndr/ndr.c
index 068e07f..e7850d3 100644
--- a/librpc/ndr/ndr.c
+++ b/librpc/ndr/ndr.c
@@ -1179,6 +1179,31 @@ _PUBLIC_ enum ndr_err_code ndr_push_relative_ptr2_start(struct ndr_push *ndr, co
 		return NDR_ERR_SUCCESS;
 	}
 	if (!(ndr->flags & LIBNDR_FLAG_RELATIVE_REVERSE)) {
+		uint32_t relative_offset;
+		size_t pad;
+		size_t align = 1;
+
+		if (ndr->offset < ndr->relative_base_offset) {
+			return ndr_push_error(ndr, NDR_ERR_BUFSIZE,
+				      "ndr_push_relative_ptr2_start ndr->offset(%u) < ndr->relative_base_offset(%u)",
+				      ndr->offset, ndr->relative_base_offset);
+		}
+
+		relative_offset = ndr->offset - ndr->relative_base_offset;
+
+		if (ndr->flags & LIBNDR_FLAG_ALIGN2) {
+			align = 2;
+		} else if (ndr->flags & LIBNDR_FLAG_ALIGN4) {
+			align = 4;
+		} else if (ndr->flags & LIBNDR_FLAG_ALIGN8) {
+			align = 8;
+		}
+
+		pad = ndr_align_size(relative_offset, align);
+		if (pad) {
+			NDR_CHECK(ndr_push_zero(ndr, pad));
+		}
+
 		return ndr_push_relative_ptr2(ndr, p);
 	}
 	if (ndr->relative_end_offset == -1) {
@@ -1245,9 +1270,6 @@ _PUBLIC_ enum ndr_err_code ndr_push_relative_ptr2_end(struct ndr_push *ndr, cons
 	/* the reversed offset is at the end of the main buffer */
 	correct_offset = ndr->relative_end_offset - len;
 
-	/* TODO: remove this hack and let the idl use FLAG_ALIGN2 explicit */
-	align = 2;
-
 	if (ndr->flags & LIBNDR_FLAG_ALIGN2) {
 		align = 2;
 	} else if (ndr->flags & LIBNDR_FLAG_ALIGN4) {
diff --git a/librpc/ndr/ndr_basic.c b/librpc/ndr/ndr_basic.c
index 1d67e11..d8e1cf0 100644
--- a/librpc/ndr/ndr_basic.c
+++ b/librpc/ndr/ndr_basic.c
@@ -1157,7 +1157,8 @@ _PUBLIC_ void ndr_print_DATA_BLOB(struct ndr_print *ndr, const char *name, DATA_
 */
 _PUBLIC_ enum ndr_err_code ndr_push_DATA_BLOB(struct ndr_push *ndr, int ndr_flags, DATA_BLOB blob)
 {
-	if (ndr->flags & LIBNDR_ALIGN_FLAGS) {
+	if (ndr->flags & LIBNDR_FLAG_REMAINING) {
+	} else if (ndr->flags & LIBNDR_ALIGN_FLAGS) {
 		if (ndr->flags & LIBNDR_FLAG_ALIGN2) {
 			blob.length = NDR_ALIGN(ndr, 2);
 		} else if (ndr->flags & LIBNDR_FLAG_ALIGN4) {
@@ -1181,7 +1182,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_DATA_BLOB(struct ndr_pull *ndr, int ndr_flag
 {
 	uint32_t length = 0;
 
-	if (ndr->flags & LIBNDR_ALIGN_FLAGS) {
+	if (ndr->flags & LIBNDR_FLAG_REMAINING) {
+		length = ndr->data_size - ndr->offset;
+	} else if (ndr->flags & LIBNDR_ALIGN_FLAGS) {
 		if (ndr->flags & LIBNDR_FLAG_ALIGN2) {
 			length = NDR_ALIGN(ndr, 2);
 		} else if (ndr->flags & LIBNDR_FLAG_ALIGN4) {
@@ -1192,8 +1195,6 @@ _PUBLIC_ enum ndr_err_code ndr_pull_DATA_BLOB(struct ndr_pull *ndr, int ndr_flag
 		if (ndr->data_size - ndr->offset < length) {
 			length = ndr->data_size - ndr->offset;
 		}
-	} else if (ndr->flags & LIBNDR_FLAG_REMAINING) {
-		length = ndr->data_size - ndr->offset;
 	} else {
 		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &length));
 	}
diff --git a/librpc/ndr/ndr_spoolss_buf.c b/librpc/ndr/ndr_spoolss_buf.c
index 2fd9d95..d1e4b41 100644
--- a/librpc/ndr/ndr_spoolss_buf.c
+++ b/librpc/ndr/ndr_spoolss_buf.c
@@ -1441,3 +1441,35 @@ _PUBLIC_ void ndr_print_spoolss_Time(struct ndr_print *ndr, const char *name, co
 	ndr->depth--;
 	talloc_free(str);
 }
+
+_PUBLIC_ uint32_t ndr_spoolss_PrinterEnumValues_align(enum winreg_Type type)
+{
+	switch(type) {
+	case REG_NONE:
+		return 0;
+	case REG_SZ:
+		return LIBNDR_FLAG_ALIGN2;
+	case REG_EXPAND_SZ:
+		return LIBNDR_FLAG_ALIGN2;
+	case REG_BINARY:
+		return 0;
+	case REG_DWORD:
+		return LIBNDR_FLAG_ALIGN4;
+	case REG_DWORD_BIG_ENDIAN:
+		return LIBNDR_FLAG_ALIGN4;
+	case REG_LINK:
+		return 0;
+	case REG_MULTI_SZ:
+		return LIBNDR_FLAG_ALIGN2;
+	case REG_RESOURCE_LIST:
+		return LIBNDR_FLAG_ALIGN2;
+	case REG_FULL_RESOURCE_DESCRIPTOR:
+		return LIBNDR_FLAG_ALIGN4;
+	case REG_RESOURCE_REQUIREMENTS_LIST:
+		return LIBNDR_FLAG_ALIGN2;
+	case REG_QWORD:
+		return LIBNDR_FLAG_ALIGN8;
+	}
+
+	return 0;
+}
diff --git a/librpc/ndr/ndr_spoolss_buf.h b/librpc/ndr/ndr_spoolss_buf.h
index 9db187d..c5938c0 100644
--- a/librpc/ndr/ndr_spoolss_buf.h
+++ b/librpc/ndr/ndr_spoolss_buf.h
@@ -52,6 +52,7 @@ void ndr_print_spoolss_security_descriptor(struct ndr_print *ndr, const char *na
 enum ndr_err_code ndr_pull_spoolss_security_descriptor(struct ndr_pull *ndr, int ndr_flags, struct security_descriptor *r);
 enum ndr_err_code ndr_push_spoolss_security_descriptor(struct ndr_push *ndr, int ndr_flags, const struct security_descriptor *r);
 _PUBLIC_ void ndr_print_spoolss_Time(struct ndr_print *ndr, const char *name, const struct spoolss_Time *r);
+_PUBLIC_ uint32_t ndr_spoolss_PrinterEnumValues_align(enum winreg_Type type);
 
 #undef _PRINTF_ATTRIBUTE
 #define _PRINTF_ATTRIBUTE(a1, a2)
diff --git a/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm b/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
index eda583e..075ad85 100644
--- a/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
+++ b/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
@@ -1281,19 +1281,12 @@ sub ParseStructPushPrimitives($$$$$)
 sub ParseStructPushDeferred($$$$)
 {
 	my ($self, $struct, $ndr, $varname, $env) = @_;
-
 	if (defined($struct->{PROPERTIES}{relative_base})) {
-		$self->pidl("NDR_CHECK(ndr_push_align($ndr, $struct->{ALIGN}));");
-
 		# retrieve the current offset as base for relative pointers
 		# based on the toplevel struct/union
 		$self->pidl("NDR_CHECK(ndr_push_setup_relative_base_offset2($ndr, $varname));");
 	}
 	$self->ParseElementPush($_, $ndr, $env, 0, 1) foreach (@{$struct->{ELEMENTS}});
-
-	if (defined($struct->{PROPERTIES}{relative_base})) {
-		$self->pidl("NDR_CHECK(ndr_push_trailer_align($ndr, $struct->{ALIGN}));");
-	}
 }
 
 #####################################################################
diff --git a/source3/printing/printing.c b/source3/printing/printing.c
index ee0a100..5d1610f 100644
--- a/source3/printing/printing.c
+++ b/source3/printing/printing.c
@@ -525,8 +525,8 @@ uint32 sysjob_to_jobid(int unix_jobid)
 ****************************************************************************/
 
 static const struct {
-	uint32 lpq_status;
-	uint32 spoolss_status;
+	uint32_t lpq_status;
+	uint32_t spoolss_status;
 } lpq_to_spoolss_status_map[] = {
 	{ LPQ_QUEUED, JOB_STATUS_QUEUED },
 	{ LPQ_PAUSED, JOB_STATUS_PAUSED },
@@ -539,7 +539,7 @@ static const struct {
 	{ LPQ_DELETED, JOB_STATUS_DELETED },
 	{ LPQ_BLOCKED, JOB_STATUS_BLOCKED_DEVQ },
 	{ LPQ_USER_INTERVENTION, JOB_STATUS_USER_INTERVENTION },
-	{ -1, 0 }
+	{ (uint32_t)-1, 0 }
 };
 
 /* Convert a lpq status value stored in printing.tdb into the


-- 
Samba Shared Repository


More information about the samba-cvs mailing list