r9372: - make the subcontext handling autogenerated code look nicer,
authorStefan Metzmacher <metze@samba.org>
Thu, 18 Aug 2005 00:45:19 +0000 (00:45 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:33:29 +0000 (13:33 -0500)
- unify the handling of subcontext, compression and obfucation

metze
(This used to be commit 09de7e0af7f9f7539cf63791baf90ac202536176)

source4/build/pidl/Parse/Pidl/Samba/NDR/Parser.pm
source4/librpc/ndr/ndr.c
source4/librpc/ndr/ndr_compression.c
source4/librpc/ndr/ndr_krb5pac.c
source4/librpc/ndr/ndr_obfuscate.c

index 4dd838bcb7316162360c8feff72d0d2e13d91b6c..8692fbb0f4977a2e248dd2ebe9b909f23ed687d5 100644 (file)
@@ -367,30 +367,29 @@ sub compression_dlen($$$)
        return ParseExpr($dlen, $env);
 }
 
-sub ParseCompressionPushStart($$$)
+sub ParseCompressionPushStart($$$$)
 {
-       my ($e,$l,$ndr) = @_;
+       my ($e,$l,$ndr,$env) = @_;
        my $comndr = "$ndr\_compressed";
+       my $alg = compression_alg($e, $l);
+       my $dlen = compression_dlen($e, $l, $env);
 
        pidl "{";
        indent;
        pidl "struct ndr_push *$comndr;";
-       pidl "";
-       pidl "$comndr = ndr_push_init_ctx($ndr);";
-       pidl "if (!$comndr) return NT_STATUS_NO_MEMORY;";
-       pidl "$comndr->flags = $ndr->flags;";
-       pidl "";
-       
+       pidl "NDR_CHECK(ndr_push_compression_start($ndr, &$comndr, $alg, $dlen));";
+
        return $comndr;
 }
 
-sub ParseCompressionPushEnd($$$)
+sub ParseCompressionPushEnd($$$$)
 {
-       my ($e,$l,$ndr) = @_;
+       my ($e,$l,$ndr,$env) = @_;
        my $comndr = "$ndr\_compressed";
        my $alg = compression_alg($e, $l);
+       my $dlen = compression_dlen($e, $l, $env);
 
-       pidl "NDR_CHECK(ndr_push_compression($ndr, $comndr, $alg));";
+       pidl "NDR_CHECK(ndr_push_compression_end($ndr, $comndr, $alg, $dlen));";
        deindent;
        pidl "}";
 }
@@ -405,17 +404,19 @@ sub ParseCompressionPullStart($$$$)
        pidl "{";
        indent;
        pidl "struct ndr_pull *$comndr;";
-       pidl "NDR_ALLOC($ndr, $comndr);";
-       pidl "NDR_CHECK(ndr_pull_compression($ndr, $comndr, $alg, $dlen));";
+       pidl "NDR_CHECK(ndr_pull_compression_start($ndr, &$comndr, $alg, $dlen));";
 
        return $comndr;
 }
 
-sub ParseCompressionPullEnd($$$)
+sub ParseCompressionPullEnd($$$$)
 {
-       my ($e,$l,$ndr) = @_;
+       my ($e,$l,$ndr,$env) = @_;
        my $comndr = "$ndr\_compressed";
+       my $alg = compression_alg($e, $l);
+       my $dlen = compression_dlen($e, $l, $env);
 
+       pidl "NDR_CHECK(ndr_pull_compression_end($ndr, $comndr, $alg, $dlen));";
        deindent;
        pidl "}";
 }
@@ -423,8 +424,9 @@ sub ParseCompressionPullEnd($$$)
 sub ParseObfuscationPushStart($$)
 {
        my ($e,$ndr) = @_;
+       my $obfuscation = has_property($e, "obfuscation");
 
-       # nothing to do here
+       pidl "NDR_CHECK(ndr_push_obfuscation_start($ndr, $obfuscation));";
 
        return $ndr;
 }
@@ -434,7 +436,7 @@ sub ParseObfuscationPushEnd($$)
        my ($e,$ndr) = @_;
        my $obfuscation = has_property($e, "obfuscation");
 
-       pidl "NDR_CHECK(ndr_push_obfuscation($ndr, $obfuscation));";
+       pidl "NDR_CHECK(ndr_push_obfuscation_end($ndr, $obfuscation));";
 }
 
 sub ParseObfuscationPullStart($$)
@@ -442,7 +444,7 @@ sub ParseObfuscationPullStart($$)
        my ($e,$ndr) = @_;
        my $obfuscation = has_property($e, "obfuscation");
 
-       pidl "NDR_CHECK(ndr_pull_obfuscation($ndr, $obfuscation));";
+       pidl "NDR_CHECK(ndr_pull_obfuscation_start($ndr, $obfuscation));";
 
        return $ndr;
 }
@@ -450,100 +452,89 @@ sub ParseObfuscationPullStart($$)
 sub ParseObfuscationPullEnd($$)
 {
        my ($e,$ndr) = @_;
+       my $obfuscation = has_property($e, "obfuscation");
 
-       # nothing to do here
+       pidl "NDR_CHECK(ndr_pull_obfuscation_end($ndr, $obfuscation));";
 }
 
-sub ParseSubcontextPushStart($$$$$)
+sub ParseSubcontextPushStart($$$$)
 {
-       my ($e,$l,$ndr,$var_name,$ndr_flags) = @_;
-       my $retndr = "_ndr_$e->{NAME}";
+       my ($e,$l,$ndr,$env) = @_;
+       my $subndr = "_ndr_$e->{NAME}";
+       my $subcontext_size = ParseExpr($l->{SUBCONTEXT_SIZE},$env);
 
        pidl "{";
        indent;
-       pidl "struct ndr_push *$retndr;";
-       pidl "";
-       pidl "$retndr = ndr_push_init_ctx($ndr);";
-       pidl "if (!$retndr) return NT_STATUS_NO_MEMORY;";
-       pidl "$retndr->flags = $ndr->flags;";
-       pidl "";
+       pidl "struct ndr_push *$subndr;";
+       pidl "NDR_CHECK(ndr_push_subcontext_start($ndr, &$subndr, $l->{HEADER_SIZE}, $subcontext_size));";
 
        if (defined $l->{COMPRESSION}) {
-               $retndr = ParseCompressionPushStart($e, $l, $retndr);
+               $subndr = ParseCompressionPushStart($e, $l, $subndr, $env);
        }
 
        if (defined $l->{OBFUSCATION}) {
-               $retndr = ParseObfuscationPushStart($e, $retndr);
+               $subndr = ParseObfuscationPushStart($e, $subndr);
        }
 
-       return $retndr;
+       return $subndr;
 }
 
 sub ParseSubcontextPushEnd($$$$)
 {
-       my ($e,$l,$ndr_flags,$env) = @_;
-       my $ndr = "_ndr_$e->{NAME}";
+       my ($e,$l,$ndr,$env) = @_;
+       my $subndr = "_ndr_$e->{NAME}";
        my $subcontext_size = ParseExpr($l->{SUBCONTEXT_SIZE},$env);
 
        if (defined $l->{COMPRESSION}) {
-               ParseCompressionPushEnd($e, $l, $ndr);
+               ParseCompressionPushEnd($e, $l, $subndr, $env);
        }
 
        if (defined $l->{OBFUSCATION}) {
-               ParseObfuscationPushEnd($e, $ndr);
+               ParseObfuscationPushEnd($e, $subndr);
        }
 
-       pidl "NDR_CHECK(ndr_push_subcontext_header(ndr, $l->{HEADER_SIZE}, $subcontext_size, $ndr));";
-       pidl "NDR_CHECK(ndr_push_bytes(ndr, $ndr->data, $ndr->offset));";
+       pidl "NDR_CHECK(ndr_push_subcontext_end($ndr, $subndr, $l->{HEADER_SIZE}, $subcontext_size));";
        deindent;
        pidl "}";
 }
 
-sub ParseSubcontextPullStart($$$$$$)
+sub ParseSubcontextPullStart($$$$)
 {
-       my ($e,$l,$ndr,$var_name,$ndr_flags,$env) = @_;
-       my $retndr = "_ndr_$e->{NAME}";
+       my ($e,$l,$ndr,$env) = @_;
+       my $subndr = "_ndr_$e->{NAME}";
        my $subcontext_size = ParseExpr($l->{SUBCONTEXT_SIZE},$env);
 
        pidl "{";
        indent;
-       pidl "struct ndr_pull *$retndr;";
-       pidl "NDR_ALLOC(ndr, $retndr);";
-       pidl "NDR_CHECK(ndr_pull_subcontext_header($ndr, $l->{HEADER_SIZE}, $subcontext_size, $retndr));"; 
+       pidl "struct ndr_pull *$subndr;";
+       pidl "NDR_CHECK(ndr_pull_subcontext_start($ndr, &$subndr, $l->{HEADER_SIZE}, $subcontext_size));";
 
        if (defined $l->{COMPRESSION}) {
-               $retndr = ParseCompressionPullStart($e, $l, $retndr, $env);
+               $subndr = ParseCompressionPullStart($e, $l, $subndr, $env);
        }
 
        if (defined $l->{OBFUSCATION}) {
-               $retndr = ParseObfuscationPullStart($e, $retndr);
+               $subndr = ParseObfuscationPullStart($e, $subndr);
        }
        
-       return ($retndr,$var_name);
+       return $subndr;
 }
 
-sub ParseSubcontextPullEnd($$$)
+sub ParseSubcontextPullEnd($$$$)
 {
-       my ($e,$l,$env) = @_;
-       my $ndr = "_ndr_$e->{NAME}";
+       my ($e,$l,$ndr,$env) = @_;
+       my $subndr = "_ndr_$e->{NAME}";
+       my $subcontext_size = ParseExpr($l->{SUBCONTEXT_SIZE},$env);
 
        if (defined $l->{COMPRESSION}) {
-               ParseCompressionPullEnd($e, $l, $ndr);
+               ParseCompressionPullEnd($e, $l, $subndr, $env);
        }
 
        if (defined $l->{OBFUSCATION}) {
-               ParseObfuscationPullEnd($e, $ndr);
+               ParseObfuscationPullEnd($e, $subndr);
        }
 
-       my $advance;
-       if (defined($l->{SUBCONTEXT_SIZE}) and ($l->{SUBCONTEXT_SIZE} ne "-1")) {
-               $advance = ParseExpr($l->{SUBCONTEXT_SIZE},$env);
-       } elsif ($l->{HEADER_SIZE}) {
-               $advance = "$ndr->data_size";
-       } else {
-               $advance = "$ndr->offset";
-       }
-       pidl "NDR_CHECK(ndr_pull_advance(ndr, $advance));";
+       pidl "NDR_CHECK(ndr_pull_subcontext_end($ndr, $subndr, $l->{HEADER_SIZE}, $subcontext_size));";
        deindent;
        pidl "}";
 }
@@ -560,9 +551,9 @@ sub ParseElementPushLevel
 
        if (defined($ndr_flags)) {
                if ($l->{TYPE} eq "SUBCONTEXT") {
-                       $ndr = ParseSubcontextPushStart($e, $l, $ndr, $var_name, $ndr_flags);
-                       ParseElementPushLevel($e, GetNextLevel($e, $l), $ndr, $var_name, $env, 1, 1);
-                       ParseSubcontextPushEnd($e, $l, $ndr_flags, $env);
+                       my $subndr = ParseSubcontextPushStart($e, $l, $ndr, $env);
+                       ParseElementPushLevel($e, GetNextLevel($e, $l), $subndr, $var_name, $env, 1, 1);
+                       ParseSubcontextPushEnd($e, $l, $ndr, $env);
                } elsif ($l->{TYPE} eq "POINTER") {
                        ParsePtrPush($e, $l, $var_name);
                } elsif ($l->{TYPE} eq "ARRAY") {
@@ -858,11 +849,11 @@ sub ParseElementPullLevel
        # Only pull something if there's actually something to be pulled
        if (defined($ndr_flags)) {
                if ($l->{TYPE} eq "SUBCONTEXT") {
-                       ($ndr,$var_name) = ParseSubcontextPullStart($e, $l, $ndr, $var_name, $ndr_flags, $env);
-                       ParseElementPullLevel($e, GetNextLevel($e,$l), $ndr, $var_name, $env, 1, 1);
-                       ParseSubcontextPullEnd($e, $l, $env);
+                       my $subndr = ParseSubcontextPullStart($e, $l, $ndr, $env);
+                       ParseElementPullLevel($e, GetNextLevel($e,$l), $subndr, $var_name, $env, 1, 1);
+                       ParseSubcontextPullEnd($e, $l, $ndr, $env);
                } elsif ($l->{TYPE} eq "ARRAY") {
-                       my $length = ParseArrayPullHeader($e, $l, $ndr, $var_name, $env); 
+                       my $length = ParseArrayPullHeader($e, $l, $ndr, $var_name, $env);
 
                        my $nl = GetNextLevel($e, $l);
 
index 3a291c2cf8f41ed81f4ecf12882cd34ba72dd8e8..a84049a3b070be46a70c88825efd994123078127 100644 (file)
@@ -57,22 +57,6 @@ struct ndr_pull *ndr_pull_init_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx)
        return ndr;
 }
 
-/*
-  create an ndr sub-context based on an existing context. The new context starts
-  at the current offset, with the given size limit
-*/
-NTSTATUS ndr_pull_subcontext(struct ndr_pull *ndr, struct ndr_pull *ndr2, uint32_t size)
-{
-       NDR_PULL_NEED_BYTES(ndr, size);
-       *ndr2 = *ndr;
-       ndr2->data += ndr2->offset;
-       ndr2->offset = 0;
-       ndr2->data_size = size;
-       ndr2->flags = ndr->flags;
-       return NT_STATUS_OK;
-}
-
-
 /*
   advance by 'size' bytes
 */
@@ -322,17 +306,17 @@ NTSTATUS ndr_push_error(struct ndr_push *ndr, enum ndr_err_code err, const char
        return ndr_map_error(err);
 }
 
-
 /*
   handle subcontext buffers, which in midl land are user-marshalled, but
   we use magic in pidl to make them easier to cope with
 */
-NTSTATUS ndr_pull_subcontext_header(struct ndr_pull *ndr, 
-                                   size_t header_size,
-                                   ssize_t size_is,
-                                   struct ndr_pull *ndr2)
+NTSTATUS ndr_pull_subcontext_start(struct ndr_pull *ndr, 
+                                  struct ndr_pull **_subndr,
+                                  size_t header_size,
+                                  ssize_t size_is)
 {
-       ndr2->flags = ndr->flags;
+       struct ndr_pull *subndr;
+       uint32_t r_content_size;
 
        switch (header_size) {
        case 0: {
@@ -340,7 +324,7 @@ NTSTATUS ndr_pull_subcontext_header(struct ndr_pull *ndr,
                if (size_is >= 0) {
                        content_size = size_is;
                }
-               NDR_CHECK(ndr_pull_subcontext(ndr, ndr2, content_size));
+               r_content_size = content_size;
                break;
        }
 
@@ -351,7 +335,7 @@ NTSTATUS ndr_pull_subcontext_header(struct ndr_pull *ndr,
                        return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PULL) size_is(%d) mismatch content_size %d", 
                                                (int)size_is, (int)content_size);
                }
-               NDR_CHECK(ndr_pull_subcontext(ndr, ndr2, content_size));
+               r_content_size = content_size;
                break;
        }
 
@@ -362,31 +346,75 @@ NTSTATUS ndr_pull_subcontext_header(struct ndr_pull *ndr,
                        return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PULL) size_is(%d) mismatch content_size %d", 
                                                (int)size_is, (int)content_size);
                }
-               NDR_CHECK(ndr_pull_subcontext(ndr, ndr2, content_size));
+               r_content_size = content_size;
                break;
        }
        default:
                return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PULL) header_size %d", 
                                      (int)header_size);
        }
+
+       NDR_PULL_NEED_BYTES(ndr, r_content_size);
+
+       subndr = talloc_zero(ndr, struct ndr_pull);
+       NT_STATUS_HAVE_NO_MEMORY(subndr);
+       subndr->flags           = ndr->flags;
+
+       subndr->data = ndr->data + ndr->offset;
+       subndr->offset = 0;
+       subndr->data_size = r_content_size;
+
+       *_subndr = subndr;
+       return NT_STATUS_OK;
+}
+
+NTSTATUS ndr_pull_subcontext_end(struct ndr_pull *ndr, 
+                                struct ndr_pull *subndr,
+                                size_t header_size,
+                                ssize_t size_is)
+{
+       uint32_t advance;
+       if (size_is >= 0) {
+               advance = size_is;
+       } else if (header_size > 0) {
+               advance = subndr->data_size;
+       } else {
+               advance = subndr->offset;
+       }
+       NDR_CHECK(ndr_pull_advance(ndr, advance));
+       return NT_STATUS_OK;
+}
+
+NTSTATUS ndr_push_subcontext_start(struct ndr_push *ndr,
+                                  struct ndr_push **_subndr,
+                                  size_t header_size,
+                                  ssize_t size_is)
+{
+       struct ndr_push *subndr;
+
+       subndr = ndr_push_init_ctx(ndr);
+       NT_STATUS_HAVE_NO_MEMORY(subndr);
+       subndr->flags   = ndr->flags;
+
+       *_subndr = subndr;
        return NT_STATUS_OK;
 }
 
 /*
   push a subcontext header 
 */
-NTSTATUS ndr_push_subcontext_header(struct ndr_push *ndr, 
-                                          size_t header_size,
-                                          ssize_t size_is,
-                                          struct ndr_push *ndr2)
+NTSTATUS ndr_push_subcontext_end(struct ndr_push *ndr,
+                                struct ndr_push *subndr,
+                                size_t header_size,
+                                ssize_t size_is)
 {
        if (size_is >= 0) {
-               ssize_t padding_len = size_is - ndr2->offset;
+               ssize_t padding_len = size_is - subndr->offset;
                if (padding_len > 0) {
-                       NDR_CHECK(ndr_push_zero(ndr2, padding_len));
+                       NDR_CHECK(ndr_push_zero(subndr, padding_len));
                } else if (padding_len < 0) {
                        return ndr_push_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PUSH) content_size %d is larger than size_is(%d)",
-                                             (int)ndr2->offset, (int)size_is);
+                                             (int)subndr->offset, (int)size_is);
                }
        }
 
@@ -395,17 +423,19 @@ NTSTATUS ndr_push_subcontext_header(struct ndr_push *ndr,
                break;
 
        case 2: 
-               NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, ndr2->offset));
+               NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, subndr->offset));
                break;
 
        case 4: 
-               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr2->offset));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, subndr->offset));
                break;
 
        default:
                return ndr_push_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext header size %d", 
                                      (int)header_size);
        }
+
+       NDR_CHECK(ndr_push_bytes(ndr, subndr->data, subndr->offset));
        return NT_STATUS_OK;
 }
 
index cf3c3ae97b82d1840e99d4ae8c2b6fe6d0fb2e5d..097f76c90a733272dbea59d7cacd77a998bb1442 100644 (file)
@@ -71,11 +71,12 @@ static NTSTATUS ndr_pull_compression_mszip_chunk(struct ndr_pull *ndrpull,
 }
 
 static NTSTATUS ndr_pull_compression_mszip(struct ndr_pull *subndr,
-                                          struct ndr_pull *comndr,
+                                          struct ndr_pull **_comndr,
                                           ssize_t decompressed_len)
 {
        NTSTATUS status = NT_STATUS_MORE_PROCESSING_REQUIRED;
        struct ndr_push *ndrpush;
+       struct ndr_pull *comndr;
        DATA_BLOB uncompressed;
        uint32_t payload_header[4];
        uint32_t payload_size;
@@ -101,7 +102,10 @@ static NTSTATUS ndr_pull_compression_mszip(struct ndr_pull *subndr,
                                      (int)uncompressed.length, (int)decompressed_len);
        }
 
-       *comndr = *subndr;
+       comndr = talloc_zero(subndr, struct ndr_pull);
+       NT_STATUS_HAVE_NO_MEMORY(comndr);
+       comndr->flags           = subndr->flags;
+
        comndr->data            = uncompressed.data;
        comndr->data_size       = uncompressed.length;
        comndr->offset          = 0;
@@ -127,6 +131,7 @@ static NTSTATUS ndr_pull_compression_mszip(struct ndr_pull *subndr,
        comndr->data_size       = payload_size;
        comndr->offset          = 0;
 
+       *_comndr = comndr;
        return NT_STATUS_OK;
 }
 
@@ -140,16 +145,14 @@ static NTSTATUS ndr_push_compression_mszip(struct ndr_push *subndr,
   handle compressed subcontext buffers, which in midl land are user-marshalled, but
   we use magic in pidl to make them easier to cope with
 */
-NTSTATUS ndr_pull_compression(struct ndr_pull *subndr,
-                             struct ndr_pull *comndr,
-                             enum ndr_compression_alg compression_alg,
-                             ssize_t decompressed_len)
+NTSTATUS ndr_pull_compression_start(struct ndr_pull *subndr,
+                                   struct ndr_pull **_comndr,
+                                   enum ndr_compression_alg compression_alg,
+                                   ssize_t decompressed_len)
 {
-       comndr->flags = subndr->flags;
-
        switch (compression_alg) {
        case NDR_COMPRESSION_MSZIP:
-               return ndr_pull_compression_mszip(subndr, comndr, decompressed_len);
+               return ndr_pull_compression_mszip(subndr, _comndr, decompressed_len);
        default:
                return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad compression algorithm %d (PULL)", 
                                      compression_alg);
@@ -157,15 +160,40 @@ NTSTATUS ndr_pull_compression(struct ndr_pull *subndr,
        return NT_STATUS_OK;
 }
 
+NTSTATUS ndr_pull_compression_end(struct ndr_pull *subndr,
+                                 struct ndr_pull *comndr,
+                                 enum ndr_compression_alg compression_alg,
+                                 ssize_t decompressed_len)
+{
+       return NT_STATUS_OK;
+}
+
 /*
   push a compressed subcontext
 */
-NTSTATUS ndr_push_compression(struct ndr_push *subndr,
-                             struct ndr_push *comndr,
-                             enum ndr_compression_alg compression_alg)
+NTSTATUS ndr_push_compression_start(struct ndr_push *subndr,
+                                   struct ndr_push **_comndr,
+                                   enum ndr_compression_alg compression_alg,
+                                   ssize_t decompressed_len)
 {
-       comndr->flags = subndr->flags;
+       struct ndr_push *comndr;
+
+       comndr = ndr_push_init_ctx(subndr);
+       NT_STATUS_HAVE_NO_MEMORY(comndr);
+       comndr->flags   = subndr->flags;
 
+       *_comndr = comndr;
+       return NT_STATUS_OK;
+}
+
+/*
+  push a compressed subcontext
+*/
+NTSTATUS ndr_push_compression_end(struct ndr_push *subndr,
+                                 struct ndr_push *comndr,
+                                 enum ndr_compression_alg compression_alg,
+                                 ssize_t decompressed_len)
+{
        switch (compression_alg) {
        case NDR_COMPRESSION_MSZIP:
                return ndr_push_compression_mszip(subndr, comndr);
index 3af3a185e5bda3f88107ac1f659e7e385aa29803..7d7e105e3ecd39d6f5a6d74f8a0586c0496bb72b 100644 (file)
@@ -63,15 +63,10 @@ NTSTATUS ndr_push_PAC_BUFFER(struct ndr_push *ndr, int ndr_flags, const struct P
                                NDR_CHECK(ndr_push_relative_ptr2(ndr, r->info));
                                {
                                        struct ndr_push *_ndr_info;
-
-                                       _ndr_info = ndr_push_init_ctx(ndr);
-                                       if (!_ndr_info) return NT_STATUS_NO_MEMORY;
-                                       _ndr_info->flags = ndr->flags;
-
+                                       NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_info, 0, _subcontext_size_PAC_INFO(r->info,r->type,0)));
                                        NDR_CHECK(ndr_push_set_switch_value(_ndr_info, r->info, r->type));
                                        NDR_CHECK(ndr_push_PAC_INFO(_ndr_info, NDR_SCALARS|NDR_BUFFERS, r->info));
-                                       NDR_CHECK(ndr_push_subcontext_header(ndr, 0, _subcontext_size_PAC_INFO(r->info,r->type,0), _ndr_info));
-                                       NDR_CHECK(ndr_push_bytes(ndr, _ndr_info->data, _ndr_info->offset));
+                                       NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_info, 0, _subcontext_size_PAC_INFO(r->info,r->type,0)));
                                }
                        }
                        ndr->flags = _flags_save_PAC_INFO;
@@ -111,11 +106,10 @@ NTSTATUS ndr_pull_PAC_BUFFER(struct ndr_pull *ndr, int ndr_flags, struct PAC_BUF
                                NDR_CHECK(ndr_pull_relative_ptr2(ndr, r->info));
                                {
                                        struct ndr_pull *_ndr_info;
-                                       NDR_ALLOC(ndr, _ndr_info);
-                                       NDR_CHECK(ndr_pull_subcontext_header(ndr, 0, r->_ndr_size, _ndr_info));
+                                       NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_info, 0, r->_ndr_size));
                                        NDR_CHECK(ndr_pull_set_switch_value(_ndr_info, r->info, r->type));
                                        NDR_CHECK(ndr_pull_PAC_INFO(_ndr_info, NDR_SCALARS|NDR_BUFFERS, r->info));
-                                       NDR_CHECK(ndr_pull_advance(ndr, r->_ndr_size));
+                                       NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_info, 0, r->_ndr_size));
                                }
                                ndr_pull_restore(ndr, &_relative_save);
                        }
index 4f875f19a73491dc54b2baf5672e4097edef4193..3b10e172b77eb9ca8ddddcb2c6d28c23a2695561 100644 (file)
@@ -26,7 +26,7 @@
   handle obfuscated subcontext buffers, which in midl land are user-marshalled, but
   we use magic in pidl to make them easier to cope with
 */
-NTSTATUS ndr_pull_obfuscation(struct ndr_pull *ndr, uint8_t salt)
+NTSTATUS ndr_pull_obfuscation_start(struct ndr_pull *ndr, uint8_t salt)
 {
        uint32_t i;
 
@@ -37,10 +37,20 @@ NTSTATUS ndr_pull_obfuscation(struct ndr_pull *ndr, uint8_t salt)
        return NT_STATUS_OK;
 }
 
+NTSTATUS ndr_pull_obfuscation_end(struct ndr_pull *ndr, uint8_t salt)
+{
+       return NT_STATUS_OK;
+}
+
+NTSTATUS ndr_push_obfuscation_start(struct ndr_push *ndr, uint8_t salt)
+{
+       return NT_STATUS_OK;
+}
+
 /*
   push a obfuscated subcontext
 */
-NTSTATUS ndr_push_obfuscation(struct ndr_push *ndr, uint8_t salt)
+NTSTATUS ndr_push_obfuscation_end(struct ndr_push *ndr, uint8_t salt)
 {
        uint32_t i;