summaryrefslogtreecommitdiff
path: root/librpc/ndr
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2011-02-22 15:45:44 +0100
committerJeremy Allison <jra@samba.org>2011-02-28 15:54:13 -0800
commit84b884eb4bec38b721d6c38704f12d1d2c601bcb (patch)
tree165c3d5361f2f6c1866b92d6fa8a1005c19aca9b /librpc/ndr
parent6c3a49ced333988b21d86e47b2b1dd1a5957e15c (diff)
downloadsamba-84b884eb4bec38b721d6c38704f12d1d2c601bcb.tar.gz
samba-84b884eb4bec38b721d6c38704f12d1d2c601bcb.tar.bz2
samba-84b884eb4bec38b721d6c38704f12d1d2c601bcb.zip
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
Diffstat (limited to 'librpc/ndr')
-rw-r--r--librpc/ndr/ndr.c26
1 files changed, 26 insertions, 0 deletions
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) {