diff options
author | Andrew Bartlett <abartlet@samba.org> | 2023-03-16 19:05:39 +1300 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2023-03-31 01:48:30 +0000 |
commit | c85cadf195208adb9bc204fdbc15f665cdb3d65d (patch) | |
tree | da7f71cdb88817c2328417b88b05c3ec5001f7a4 /librpc | |
parent | b95117dc56e185c8825752b1129ac704f832ce04 (diff) | |
download | samba-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.h | 1 | ||||
-rw-r--r-- | librpc/ndr/ndr_compression.c | 70 |
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; |