ndr64: added support for trailing gap alignment
authorAndrew Tridgell <tridge@samba.org>
Thu, 1 Oct 2009 06:08:02 +0000 (16:08 +1000)
committerJeremy Allison <jra@samba.org>
Mon, 2 Nov 2009 18:37:56 +0000 (10:37 -0800)
NDR64 has a 'trailing gap' alignment, which aligns the end of a
structure on the overall structure alignment.

This explains the discrepancy we had with the RPC-SAMR test and NDR64

librpc/ndr/libndr.h
librpc/ndr/ndr_basic.c
pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm

index f6f517064616d43904a442f874d3b4d16727e8db..3236932ba7ce431e720b24ccfd3e088cb5336de0 100644 (file)
@@ -500,6 +500,8 @@ enum ndr_err_code ndr_push_align(struct ndr_push *ndr, size_t size);
 enum ndr_err_code ndr_pull_align(struct ndr_pull *ndr, size_t size);
 enum ndr_err_code ndr_push_union_align(struct ndr_push *ndr, size_t size);
 enum ndr_err_code ndr_pull_union_align(struct ndr_pull *ndr, size_t size);
+enum ndr_err_code ndr_push_trailer_align(struct ndr_push *ndr, size_t size);
+enum ndr_err_code ndr_pull_trailer_align(struct ndr_pull *ndr, size_t size);
 enum ndr_err_code ndr_push_bytes(struct ndr_push *ndr, const uint8_t *data, uint32_t n);
 enum ndr_err_code ndr_push_zero(struct ndr_push *ndr, uint32_t n);
 enum ndr_err_code ndr_push_array_uint8(struct ndr_push *ndr, int ndr_flags, const uint8_t *data, uint32_t n);
index f3b7e755c51cb30496a6c4caf6cd5c19c4bbb7c5..807db59995c31c72ea9b532b2d147c882030c4aa 100644 (file)
@@ -573,6 +573,24 @@ _PUBLIC_ enum ndr_err_code ndr_pull_union_align(struct ndr_pull *ndr, size_t siz
        return NDR_ERR_SUCCESS;
 }
 
+_PUBLIC_ enum ndr_err_code ndr_push_trailer_align(struct ndr_push *ndr, size_t size)
+{
+       /* MS-RPCE section 2.2.5.3.4.1 */
+       if (ndr->flags & LIBNDR_FLAG_NDR64) {
+               return ndr_push_align(ndr, size);
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_trailer_align(struct ndr_pull *ndr, size_t size)
+{
+       /* MS-RPCE section 2.2.5.3.4.1 */
+       if (ndr->flags & LIBNDR_FLAG_NDR64) {
+               return ndr_pull_align(ndr, size);
+       }
+       return NDR_ERR_SUCCESS;
+}
+
 /*
   push some bytes
 */
index 9a02d522a9bd81e69b8b0ad478b99ee8d85ed003..11a43b4509dc8b762a1e78b7c3e63fd0aed59163 100644 (file)
@@ -1235,6 +1235,8 @@ sub ParseStructPushPrimitives($$$$$)
        }
 
        $self->ParseElementPush($_, $ndr, $env, 1, 0) foreach (@{$struct->{ELEMENTS}});
+
+       $self->pidl("NDR_CHECK(ndr_push_trailer_align($ndr, $struct->{ALIGN}));");
 }
 
 sub ParseStructPushDeferred($$$$)
@@ -1533,6 +1535,8 @@ sub ParseStructPullPrimitives($$$$$)
        $self->ParseElementPull($_, $ndr, $env, 1, 0) foreach (@{$struct->{ELEMENTS}});
 
        $self->add_deferred();
+
+       $self->pidl("NDR_CHECK(ndr_pull_trailer_align($ndr, $struct->{ALIGN}));");
 }
 
 sub ParseStructPullDeferred($$$$$)