summaryrefslogtreecommitdiff
path: root/librpc
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2023-03-16 19:05:39 +1300
committerAndrew Bartlett <abartlet@samba.org>2023-03-31 01:48:30 +0000
commitc85cadf195208adb9bc204fdbc15f665cdb3d65d (patch)
treeda7f71cdb88817c2328417b88b05c3ec5001f7a4 /librpc
parentb95117dc56e185c8825752b1129ac704f832ce04 (diff)
downloadsamba-c85cadf195208adb9bc204fdbc15f665cdb3d65d.tar.gz
librpc/ndr: Add a "NONE" compression format to libndr
Signed-off-by: Andrew Bartlett <abartlet@samba.org> Reviewed-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Diffstat (limited to 'librpc')
-rw-r--r--librpc/ndr/libndr.h1
-rw-r--r--librpc/ndr/ndr_compression.c70
2 files changed, 71 insertions, 0 deletions
diff --git a/librpc/ndr/libndr.h b/librpc/ndr/libndr.h
index bd3ef958744..811623c463c 100644
--- a/librpc/ndr/libndr.h
+++ b/librpc/ndr/libndr.h
@@ -290,6 +290,7 @@ enum ndr_err_code {
} while (0)
enum ndr_compression_alg {
+ NDR_COMPRESSION_NONE = 0,
NDR_COMPRESSION_MSZIP_CAB = 1,
NDR_COMPRESSION_MSZIP = 2,
NDR_COMPRESSION_XPRESS = 3,
diff --git a/librpc/ndr/ndr_compression.c b/librpc/ndr/ndr_compression.c
index e6602e6ccb2..a8efb6a27f4 100644
--- a/librpc/ndr/ndr_compression.c
+++ b/librpc/ndr/ndr_compression.c
@@ -646,6 +646,62 @@ static enum ndr_err_code ndr_push_compression_xpress_chunk(struct ndr_push *ndrp
return NDR_ERR_SUCCESS;
}
+static enum ndr_err_code ndr_pull_compression_none(struct ndr_pull *ndrpull,
+ struct ndr_push *ndrpush,
+ ssize_t decompressed_len,
+ ssize_t compressed_len)
+{
+ DATA_BLOB comp_chunk;
+ uint32_t comp_chunk_size = compressed_len;
+ uint32_t comp_chunk_offset;
+
+ if (decompressed_len != compressed_len) {
+ return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION,
+ "decompressed len %zd != compressed_len %zd in 'NONE' compression!",
+ decompressed_len,
+ compressed_len);
+ }
+
+ if (comp_chunk_size != compressed_len) {
+ return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION,
+ "compressed_len %zd overflows uint32_t in 'NONE' compression!",
+ compressed_len);
+ }
+
+ comp_chunk_offset = ndrpull->offset;
+ NDR_CHECK(ndr_pull_advance(ndrpull, comp_chunk_size));
+ comp_chunk.length = comp_chunk_size;
+ comp_chunk.data = ndrpull->data + comp_chunk_offset;
+
+ NDR_CHECK(ndr_push_array_uint8(ndrpush,
+ NDR_SCALARS,
+ comp_chunk.data,
+ comp_chunk.length));
+
+ return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_push_compression_none(struct ndr_push *ndrpush,
+ struct ndr_pull *ndrpull)
+{
+ DATA_BLOB plain_chunk;
+ uint32_t plain_chunk_size;
+ uint32_t plain_chunk_offset;
+
+ plain_chunk_size = ndrpull->data_size - ndrpull->offset;
+ plain_chunk_offset = ndrpull->offset;
+ NDR_CHECK(ndr_pull_advance(ndrpull, plain_chunk_size));
+
+ plain_chunk.data = ndrpull->data + plain_chunk_offset;
+ plain_chunk.length = plain_chunk_size;
+
+ NDR_CHECK(ndr_push_array_uint8(ndrpush,
+ NDR_SCALARS,
+ plain_chunk.data,
+ plain_chunk.length));
+ return NDR_ERR_SUCCESS;
+}
+
/*
handle compressed subcontext buffers, which in midl land are user-marshalled, but
we use magic in pidl to make them easier to cope with
@@ -666,6 +722,11 @@ enum ndr_err_code ndr_pull_compression_start(struct ndr_pull *subndr,
NDR_ERR_HAVE_NO_MEMORY(ndrpush);
switch (compression_alg) {
+ case NDR_COMPRESSION_NONE:
+ NDR_CHECK(ndr_pull_compression_none(subndr, ndrpush,
+ decompressed_len,
+ compressed_len));
+ break;
case NDR_COMPRESSION_MSZIP_CAB:
NDR_CHECK(ndr_pull_compression_mszip_cab_chunk(subndr, ndrpush,
subndr->cstate,
@@ -730,6 +791,7 @@ enum ndr_err_code ndr_push_compression_start(struct ndr_push *subndr,
struct ndr_push *uncomndr;
switch (compression_alg) {
+ case NDR_COMPRESSION_NONE:
case NDR_COMPRESSION_MSZIP_CAB:
case NDR_COMPRESSION_MSZIP:
case NDR_COMPRESSION_XPRESS:
@@ -767,6 +829,10 @@ enum ndr_err_code ndr_push_compression_end(struct ndr_push *subndr,
ndrpull->offset = 0;
switch (compression_alg) {
+ case NDR_COMPRESSION_NONE:
+ NDR_CHECK(ndr_push_compression_none(subndr, ndrpull));
+ break;
+
case NDR_COMPRESSION_MSZIP_CAB:
NDR_CHECK(ndr_push_compression_mszip_cab_chunk(subndr, ndrpull, subndr->cstate));
break;
@@ -835,6 +901,7 @@ enum ndr_err_code ndr_pull_compression_state_init(struct ndr_pull *ndr,
s->type = compression_alg;
switch (compression_alg) {
+ case NDR_COMPRESSION_NONE:
case NDR_COMPRESSION_MSZIP:
case NDR_COMPRESSION_XPRESS:
break;
@@ -866,6 +933,7 @@ void ndr_pull_compression_state_free(struct ndr_compression_state *state)
}
switch (state->type) {
+ case NDR_COMPRESSION_NONE:
case NDR_COMPRESSION_MSZIP:
case NDR_COMPRESSION_XPRESS:
break;
@@ -890,6 +958,7 @@ enum ndr_err_code ndr_push_compression_state_init(struct ndr_push *ndr,
s->type = compression_alg;
switch (compression_alg) {
+ case NDR_COMPRESSION_NONE:
case NDR_COMPRESSION_XPRESS:
case NDR_COMPRESSION_MSZIP:
break;
@@ -926,6 +995,7 @@ void ndr_push_compression_state_free(struct ndr_compression_state *state)
}
switch (state->type) {
+ case NDR_COMPRESSION_NONE:
case NDR_COMPRESSION_MSZIP:
case NDR_COMPRESSION_XPRESS:
break;