From 84b884eb4bec38b721d6c38704f12d1d2c601bcb Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 22 Feb 2011 15:45:44 +0100 Subject: 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 --- librpc/ndr/ndr.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'librpc') diff --git a/librpc/ndr/ndr.c b/librpc/ndr/ndr.c index 068e07f84a..14f9e06337 100644 --- a/librpc/ndr/ndr.c +++ b/librpc/ndr/ndr.c @@ -1179,6 +1179,32 @@ _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; + /* TODO: remove this hack and let the idl use FLAG_ALIGN2 explicit */ + size_t align = 2; + + 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) { -- cgit