From ef224aa004d5f1726d8dca020e0ef96d8c58565e Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 1 Mar 2011 14:20:32 +0100 Subject: librpc/ndr: handle NOALIGN flag for relative pointers and alignment DATA_BLOBs metze Autobuild-User: Stefan Metzmacher Autobuild-Date: Tue Mar 1 17:11:03 CET 2011 on sn-devel-104 --- librpc/ndr/ndr.c | 8 ++++++-- librpc/ndr/ndr_basic.c | 11 ++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/librpc/ndr/ndr.c b/librpc/ndr/ndr.c index e7850d31df..cfeb231487 100644 --- a/librpc/ndr/ndr.c +++ b/librpc/ndr/ndr.c @@ -1191,7 +1191,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_relative_ptr2_start(struct ndr_push *ndr, co relative_offset = ndr->offset - ndr->relative_base_offset; - if (ndr->flags & LIBNDR_FLAG_ALIGN2) { + if (ndr->flags & LIBNDR_FLAG_NOALIGN) { + align = 1; + } else if (ndr->flags & LIBNDR_FLAG_ALIGN2) { align = 2; } else if (ndr->flags & LIBNDR_FLAG_ALIGN4) { align = 4; @@ -1270,7 +1272,9 @@ _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; - if (ndr->flags & LIBNDR_FLAG_ALIGN2) { + if (ndr->flags & LIBNDR_FLAG_NOALIGN) { + align = 1; + } else if (ndr->flags & LIBNDR_FLAG_ALIGN2) { align = 2; } else if (ndr->flags & LIBNDR_FLAG_ALIGN4) { align = 4; diff --git a/librpc/ndr/ndr_basic.c b/librpc/ndr/ndr_basic.c index 7323f6d7a0..8e0789a425 100644 --- a/librpc/ndr/ndr_basic.c +++ b/librpc/ndr/ndr_basic.c @@ -1218,8 +1218,11 @@ _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_FLAG_REMAINING) { + /* nothing to do */ } else if (ndr->flags & LIBNDR_ALIGN_FLAGS) { - if (ndr->flags & LIBNDR_FLAG_ALIGN2) { + if (ndr->flags & LIBNDR_FLAG_NOALIGN) { + blob.length = 0; + } else if (ndr->flags & LIBNDR_FLAG_ALIGN2) { blob.length = NDR_ALIGN(ndr, 2); } else if (ndr->flags & LIBNDR_FLAG_ALIGN4) { blob.length = NDR_ALIGN(ndr, 4); @@ -1228,7 +1231,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_DATA_BLOB(struct ndr_push *ndr, int ndr_flag } NDR_PUSH_ALLOC_SIZE(ndr, blob.data, blob.length); data_blob_clear(&blob); - } else if (!(ndr->flags & LIBNDR_FLAG_REMAINING)) { + } else { NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, blob.length)); } NDR_CHECK(ndr_push_bytes(ndr, blob.data, blob.length)); @@ -1245,7 +1248,9 @@ _PUBLIC_ enum ndr_err_code ndr_pull_DATA_BLOB(struct ndr_pull *ndr, int ndr_flag 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) { + if (ndr->flags & LIBNDR_FLAG_NOALIGN) { + length = 0; + } else if (ndr->flags & LIBNDR_FLAG_ALIGN2) { length = NDR_ALIGN(ndr, 2); } else if (ndr->flags & LIBNDR_FLAG_ALIGN4) { length = NDR_ALIGN(ndr, 4); -- cgit