librpc/ndr: add ndr_push_pipe_chunk_trailer() and ndr_check_pipe_chunk_trailer()
authorStefan Metzmacher <metze@samba.org>
Tue, 21 Sep 2010 03:18:02 +0000 (05:18 +0200)
committerStefan Metzmacher <metze@samba.org>
Thu, 10 Mar 2011 15:19:29 +0000 (16:19 +0100)
metze
(cherry picked from commit 2a47ed81066ccf7573b80e0a85bce8eb9866c628)

librpc/ndr/libndr.h
librpc/ndr/ndr.c

index 15fc08a9b2e03af02281b540a782920bcff8e65a..1f1f0198f752fe715d8c97b74c1af4178d81bcbc 100644 (file)
@@ -469,6 +469,8 @@ enum ndr_err_code ndr_check_array_size(struct ndr_pull *ndr, void *p, uint32_t s
 enum ndr_err_code ndr_pull_array_length(struct ndr_pull *ndr, const void *p);
 uint32_t ndr_get_array_length(struct ndr_pull *ndr, const void *p);
 enum ndr_err_code ndr_check_array_length(struct ndr_pull *ndr, void *p, uint32_t length);
+enum ndr_err_code ndr_push_pipe_chunk_trailer(struct ndr_push *ndr, int ndr_flags, uint32_t count);
+enum ndr_err_code ndr_check_pipe_chunk_trailer(struct ndr_pull *ndr, int ndr_flags, uint32_t count);
 enum ndr_err_code ndr_push_set_switch_value(struct ndr_push *ndr, const void *p, uint32_t val);
 enum ndr_err_code ndr_pull_set_switch_value(struct ndr_pull *ndr, const void *p, uint32_t val);
 enum ndr_err_code ndr_print_set_switch_value(struct ndr_print *ndr, const void *p, uint32_t val);
index cfeb2314878b948a7aa9849d4b1bbac36b0d667c..56d1fab05e4b2b778f558eb84d8eff204dfeacc5 100644 (file)
@@ -829,6 +829,40 @@ _PUBLIC_ enum ndr_err_code ndr_check_array_length(struct ndr_pull *ndr, void *p,
        return NDR_ERR_SUCCESS;
 }
 
+_PUBLIC_ enum ndr_err_code ndr_push_pipe_chunk_trailer(struct ndr_push *ndr, int ndr_flags, uint32_t count)
+{
+       if (ndr->flags & LIBNDR_FLAG_NDR64) {
+               int64_t tmp = 0 - (int64_t)count;
+               uint64_t ncount = tmp;
+
+               NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, ncount));
+       }
+
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_check_pipe_chunk_trailer(struct ndr_pull *ndr, int ndr_flags, uint32_t count)
+{
+       if (ndr->flags & LIBNDR_FLAG_NDR64) {
+               int64_t tmp = 0 - (int64_t)count;
+               uint64_t ncount1 = tmp;
+               uint64_t ncount2;
+
+               NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &ncount2));
+               if (ncount1 == ncount2) {
+                       return NDR_ERR_SUCCESS;
+               }
+
+               return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE,
+                       "Bad pipe trailer[%lld should be %lld] size was %lu\"",
+                       (unsigned long long)ncount2,
+                       (unsigned long long)ncount1,
+                       (unsigned long)count);
+       }
+
+       return NDR_ERR_SUCCESS;
+}
+
 /*
   store a switch value
  */