From 5a9ceee7a524293c67d4c32edde9da32a877ecce Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 25 Mar 2005 13:40:17 +0000 Subject: r6061: add start of compression support in our rpc code this is not complete cuurently... but I want other people to test it and help me on finishing it. (try to change the #if 0 in torture/rpc/drsuapi.c into #if 1) metze (This used to be commit 335adef37082a78e0426decb715629bd778e6582) --- source4/librpc/ndr/ndr_compression.c | 177 +++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 source4/librpc/ndr/ndr_compression.c (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c new file mode 100644 index 0000000000..d4f1a2a927 --- /dev/null +++ b/source4/librpc/ndr/ndr_compression.c @@ -0,0 +1,177 @@ +/* + Unix SMB/CIFS implementation. + + libndr compression support + + Copyright (C) Stefan Metzmacher 2005 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +#ifdef HAVE_ZLIB +#include + +static NTSTATUS ndr_pull_compression_zlib(struct ndr_pull *subndr, + struct ndr_pull *comndr, + ssize_t decompressed_len) +{ + DATA_BLOB inbuf; + DATA_BLOB outbuf = data_blob_talloc(comndr, NULL, decompressed_len); + uint32_t outbuf_len = outbuf.length; + struct z_stream_s zs; + int ret; + + ZERO_STRUCT(zs); + + if (subndr->data_size < 10) { + return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad ZLIB compressed header (PULL) subcontext size %d", + subndr->data_size); + } + + inbuf.data = subndr->data+10; + inbuf.length = subndr->data_size-10; + + zs.avail_in = inbuf.length; + zs.next_in = inbuf.data; + zs.next_out = outbuf.data; + zs.avail_out = outbuf.length; + + ret = inflateInit2(&zs, 15); + if (ret != Z_OK) { + return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad ZLIB (PULL) inflateInit2 error %d", + ret); + } + + while(1) { + ret = inflate(&zs, Z_SYNC_FLUSH); + if (ret == Z_STREAM_END) { + + DEBUG(0,("inbuf.length: %d avail_in: %d, avail_out: %d\n", inbuf.length, zs.avail_in, zs.avail_out)); + break; + } + if (ret != Z_OK) { + return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad ZLIB (PULL) inflate error %d", + ret); + } + } + + inflateEnd(&zs); + + /* TODO: check if the decompressed_len == outbuf_len */ + outbuf.length = outbuf_len - zs.avail_out; + + if (outbuf.length < 16) { + return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad ZLIB uncompressed header (PULL) uncompressed size %d", + outbuf.length); + } + + outbuf.data += 16; + outbuf.length -= 16; + + /* TODO: really decompress the data here */ + *comndr = *subndr; + comndr->data = outbuf.data; + comndr->data_size = outbuf.length; + comndr->offset = 0; + + return NT_STATUS_OK; +} + +static NTSTATUS ndr_push_compression_zlib(struct ndr_push *subndr, + struct ndr_push *comndr) +{ + DATA_BLOB inbuf; + DATA_BLOB outbuf = data_blob_talloc(comndr, NULL, comndr->offset + 10); + struct z_stream_s zs; + int ret; + + ZERO_STRUCT(zs); + + inbuf = ndr_push_blob(comndr); + + zs.avail_in = inbuf.length; + zs.next_in = inbuf.data; + zs.next_out = outbuf.data+10; + zs.avail_out = outbuf.length-10; + + ret = deflateInit(&zs, Z_DEFAULT_COMPRESSION); + if (ret != Z_OK) { + return ndr_push_error(subndr, NDR_ERR_COMPRESSION, "Bad ZLIB (PUSH) deflateInit2 error %d", + ret); + } + + ret = deflate(&zs, Z_SYNC_FLUSH); + + if (ret != Z_OK && ret != Z_STREAM_END) { + return ndr_push_error(subndr, NDR_ERR_COMPRESSION, "Bad ZLIB (PULL) deflate error %d", + ret); + } + + deflateEnd(&zs); + + /* TODO: push the header here */ + + + NDR_CHECK(ndr_push_bytes(subndr, outbuf.data, outbuf.length)); + + return NT_STATUS_OK; +} +#endif + +/* + 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) +{ + comndr->flags = subndr->flags; + + switch (compression_alg) { +#ifdef HAVE_ZLIB + case NDR_COMPRESSION_ZLIB: + return ndr_pull_compression_zlib(subndr, comndr, decompressed_len); +#endif + default: + return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad compression algorithm %d (PULL)", + compression_alg); + } + 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) +{ + comndr->flags = subndr->flags; + + switch (compression_alg) { +#ifdef HAVE_ZLIB + case NDR_COMPRESSION_ZLIB: + return ndr_push_compression_zlib(subndr, comndr); +#endif + default: + return ndr_push_error(subndr, NDR_ERR_COMPRESSION, "Bad compression algorithm %d (PUSH)", + compression_alg); + } + return NT_STATUS_OK; +} -- cgit From 747eb74d2e68745bc817d6f5713915ae63137ee2 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 25 Mar 2005 23:18:35 +0000 Subject: r6065: revert test value metze (This used to be commit fca4dc4827c98c02051165c1aedf5bdc5354bdda) --- source4/librpc/ndr/ndr_compression.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index d4f1a2a927..bcbe8e5650 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -50,7 +50,7 @@ static NTSTATUS ndr_pull_compression_zlib(struct ndr_pull *subndr, zs.next_out = outbuf.data; zs.avail_out = outbuf.length; - ret = inflateInit2(&zs, 15); + ret = inflateInit2(&zs, -15); if (ret != Z_OK) { return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad ZLIB (PULL) inflateInit2 error %d", ret); -- cgit From d15845eb813a2667dfc857d68dc3bf6b262ff496 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 29 Mar 2005 08:10:31 +0000 Subject: r6112: try to decompress all chunks and put them together it produces the correct DATA_BLOB length, but only the first chunk is successfull decompressed... metze (This used to be commit 0d44d077975d756023f1dcc8d2c3ebf06305e355) --- source4/librpc/ndr/ndr_compression.c | 111 +++++++++++++++++++++++------------ 1 file changed, 73 insertions(+), 38 deletions(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index bcbe8e5650..ec29b1cd30 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -25,67 +25,102 @@ #ifdef HAVE_ZLIB #include -static NTSTATUS ndr_pull_compression_zlib(struct ndr_pull *subndr, - struct ndr_pull *comndr, - ssize_t decompressed_len) +static NTSTATUS ndr_pull_compression_zlib_chunk(struct ndr_pull *ndrpull, + struct ndr_push *ndrpush, + struct z_stream_s *zs, int i) { - DATA_BLOB inbuf; - DATA_BLOB outbuf = data_blob_talloc(comndr, NULL, decompressed_len); - uint32_t outbuf_len = outbuf.length; - struct z_stream_s zs; + uint8_t *comp_chunk; + uint32_t comp_chunk_offset; + uint32_t comp_chunk_size; + uint8_t *plain_chunk; + uint32_t plain_chunk_offset; + uint32_t plain_chunk_size; + uint16_t unknown_marker; int ret; - ZERO_STRUCT(zs); + /* I don't know why, this is needed... --metze */ + if (i == 5) ndrpull->offset -=4; - if (subndr->data_size < 10) { - return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad ZLIB compressed header (PULL) subcontext size %d", - subndr->data_size); + NDR_CHECK(ndr_pull_uint32(ndrpull, NDR_SCALARS, &plain_chunk_size)); + if (plain_chunk_size > 0x00008000) { + return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, "Bad ZLIB plain chunk size %08X > 0x00008000 (PULL)", + plain_chunk_size); } - inbuf.data = subndr->data+10; - inbuf.length = subndr->data_size-10; + NDR_CHECK(ndr_pull_uint32(ndrpull, NDR_SCALARS, &comp_chunk_size)); - zs.avail_in = inbuf.length; - zs.next_in = inbuf.data; - zs.next_out = outbuf.data; - zs.avail_out = outbuf.length; + NDR_CHECK(ndr_pull_uint16(ndrpull, NDR_SCALARS, &unknown_marker)); - ret = inflateInit2(&zs, -15); - if (ret != Z_OK) { - return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad ZLIB (PULL) inflateInit2 error %d", - ret); - } + DEBUG(10,("plain_chunk_size: %08X (%u) comp_chunk_size: %08X (%u) unknown_marker: %04X (%u)\n", + plain_chunk_size, plain_chunk_size, comp_chunk_size, comp_chunk_size, unknown_marker, unknown_marker)); + + comp_chunk_offset = ndrpull->offset; + NDR_CHECK(ndr_pull_advance(ndrpull, comp_chunk_size)); + comp_chunk = ndrpull->data + comp_chunk_offset; - while(1) { - ret = inflate(&zs, Z_SYNC_FLUSH); + plain_chunk_offset = ndrpush->offset; + NDR_CHECK(ndr_push_zero(ndrpush, plain_chunk_size)); + plain_chunk = ndrpush->data + plain_chunk_offset; + + zs->avail_in = comp_chunk_size; + zs->next_in = comp_chunk; + zs->next_out = plain_chunk; + zs->avail_out = plain_chunk_size; + + while (True) { + ret = inflate(zs, Z_BLOCK); if (ret == Z_STREAM_END) { - - DEBUG(0,("inbuf.length: %d avail_in: %d, avail_out: %d\n", inbuf.length, zs.avail_in, zs.avail_out)); + DEBUG(0,("comp_chunk_size: %u avail_in: %d, plain_chunk_size: %u, avail_out: %d\n", + comp_chunk_size, zs->avail_in, plain_chunk_size, zs->avail_out)); break; } if (ret != Z_OK) { - return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad ZLIB (PULL) inflate error %d", + return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, "Bad ZLIB (PULL) inflate error %d", ret); } } - inflateEnd(&zs); + if ((plain_chunk_size < 0x00008000) || (ndrpull->offset+4 >= ndrpull->data_size)) { + /* this is the last chunk */ + return NT_STATUS_OK; + } - /* TODO: check if the decompressed_len == outbuf_len */ - outbuf.length = outbuf_len - zs.avail_out; + return NT_STATUS_MORE_PROCESSING_REQUIRED; +} + +static NTSTATUS ndr_pull_compression_zlib(struct ndr_pull *subndr, + struct ndr_pull *comndr, + ssize_t decompressed_len) +{ + NTSTATUS status = NT_STATUS_MORE_PROCESSING_REQUIRED; + struct ndr_push *ndrpush; + DATA_BLOB uncompressed; + struct z_stream_s zs; + int ret; + int i = 0; + + ZERO_STRUCT(zs); + + ndrpush = ndr_push_init_ctx(subndr); + NT_STATUS_HAVE_NO_MEMORY(ndrpush); - if (outbuf.length < 16) { - return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad ZLIB uncompressed header (PULL) uncompressed size %d", - outbuf.length); + ret = inflateInit2(&zs, -15); + if (ret != Z_OK) { + return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad ZLIB (PULL) inflateInit2 error %d", + ret); + } + + while (NT_STATUS_EQUAL(NT_STATUS_MORE_PROCESSING_REQUIRED, status)) { + status = ndr_pull_compression_zlib_chunk(subndr, ndrpush, &zs, i++); } + inflateEnd(&zs); + NT_STATUS_NOT_OK_RETURN(status); - outbuf.data += 16; - outbuf.length -= 16; + uncompressed = ndr_push_blob(ndrpush); - /* TODO: really decompress the data here */ *comndr = *subndr; - comndr->data = outbuf.data; - comndr->data_size = outbuf.length; + comndr->data = uncompressed.data; + comndr->data_size = uncompressed.length; comndr->offset = 0; return NT_STATUS_OK; -- cgit From 4810ec445d377d456f5dddbd7d0699c9be049afd Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 29 Mar 2005 10:01:34 +0000 Subject: r6114: the marker is const and is 0x434B 'CK' metze (This used to be commit 4b88ff29715a98c728cf70db4889daafed8eeeb2) --- source4/librpc/ndr/ndr_compression.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index ec29b1cd30..f09007a715 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -35,7 +35,8 @@ static NTSTATUS ndr_pull_compression_zlib_chunk(struct ndr_pull *ndrpull, uint8_t *plain_chunk; uint32_t plain_chunk_offset; uint32_t plain_chunk_size; - uint16_t unknown_marker; + uint8_t C_CK_marker; + uint8_t K_CK_marker; int ret; /* I don't know why, this is needed... --metze */ @@ -44,15 +45,20 @@ static NTSTATUS ndr_pull_compression_zlib_chunk(struct ndr_pull *ndrpull, NDR_CHECK(ndr_pull_uint32(ndrpull, NDR_SCALARS, &plain_chunk_size)); if (plain_chunk_size > 0x00008000) { return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, "Bad ZLIB plain chunk size %08X > 0x00008000 (PULL)", - plain_chunk_size); + plain_chunk_size); } NDR_CHECK(ndr_pull_uint32(ndrpull, NDR_SCALARS, &comp_chunk_size)); - NDR_CHECK(ndr_pull_uint16(ndrpull, NDR_SCALARS, &unknown_marker)); + NDR_CHECK(ndr_pull_uint8(ndrpull, NDR_SCALARS, &C_CK_marker)); + NDR_CHECK(ndr_pull_uint8(ndrpull, NDR_SCALARS, &K_CK_marker)); + if (!(C_CK_marker == (uint8_t)'C' && K_CK_marker == (uint8_t)'K')) { + return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, "Bad ZLIB invalid CK marker C[%02X] K[%02X] (PULL)", + C_CK_marker, K_CK_marker); + } - DEBUG(10,("plain_chunk_size: %08X (%u) comp_chunk_size: %08X (%u) unknown_marker: %04X (%u)\n", - plain_chunk_size, plain_chunk_size, comp_chunk_size, comp_chunk_size, unknown_marker, unknown_marker)); + DEBUG(10,("plain_chunk_size: %08X (%u) comp_chunk_size: %08X (%u)\n", + plain_chunk_size, plain_chunk_size, comp_chunk_size, comp_chunk_size)); comp_chunk_offset = ndrpull->offset; NDR_CHECK(ndr_pull_advance(ndrpull, comp_chunk_size)); @@ -62,6 +68,8 @@ static NTSTATUS ndr_pull_compression_zlib_chunk(struct ndr_pull *ndrpull, NDR_CHECK(ndr_push_zero(ndrpush, plain_chunk_size)); plain_chunk = ndrpush->data + plain_chunk_offset; + dump_data(10, comp_chunk, 16); + zs->avail_in = comp_chunk_size; zs->next_in = comp_chunk; zs->next_out = plain_chunk; -- cgit From 0403e2032b258d25f6ff744029c3a0327cebda5a Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 30 Mar 2005 10:48:52 +0000 Subject: r6129: - add our own MSZIP decompression implementation (taken from cabextract.c from KDE) this code maybe need to be rewritten and the compression side needs to be done, but for now it seems to works - remove the dependency to zlib metze (This used to be commit 5e8558c5b4365a494aa054c3e08d4084b319e6e5) --- source4/librpc/ndr/ndr_compression.c | 153 +++++++++++++---------------------- 1 file changed, 55 insertions(+), 98 deletions(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index f09007a715..c806f62189 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -21,27 +21,20 @@ */ #include "includes.h" +#include "lib/compression/mszip.h" -#ifdef HAVE_ZLIB -#include - -static NTSTATUS ndr_pull_compression_zlib_chunk(struct ndr_pull *ndrpull, - struct ndr_push *ndrpush, - struct z_stream_s *zs, int i) +static NTSTATUS ndr_pull_compression_mszip_chunk(struct ndr_pull *ndrpull, + struct ndr_push *ndrpush, + struct decomp_state *decomp_state) { - uint8_t *comp_chunk; + DATA_BLOB comp_chunk; uint32_t comp_chunk_offset; uint32_t comp_chunk_size; - uint8_t *plain_chunk; + DATA_BLOB plain_chunk; uint32_t plain_chunk_offset; uint32_t plain_chunk_size; - uint8_t C_CK_marker; - uint8_t K_CK_marker; int ret; - /* I don't know why, this is needed... --metze */ - if (i == 5) ndrpull->offset -=4; - NDR_CHECK(ndr_pull_uint32(ndrpull, NDR_SCALARS, &plain_chunk_size)); if (plain_chunk_size > 0x00008000) { return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, "Bad ZLIB plain chunk size %08X > 0x00008000 (PULL)", @@ -50,42 +43,23 @@ static NTSTATUS ndr_pull_compression_zlib_chunk(struct ndr_pull *ndrpull, NDR_CHECK(ndr_pull_uint32(ndrpull, NDR_SCALARS, &comp_chunk_size)); - NDR_CHECK(ndr_pull_uint8(ndrpull, NDR_SCALARS, &C_CK_marker)); - NDR_CHECK(ndr_pull_uint8(ndrpull, NDR_SCALARS, &K_CK_marker)); - if (!(C_CK_marker == (uint8_t)'C' && K_CK_marker == (uint8_t)'K')) { - return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, "Bad ZLIB invalid CK marker C[%02X] K[%02X] (PULL)", - C_CK_marker, K_CK_marker); - } - DEBUG(10,("plain_chunk_size: %08X (%u) comp_chunk_size: %08X (%u)\n", plain_chunk_size, plain_chunk_size, comp_chunk_size, comp_chunk_size)); comp_chunk_offset = ndrpull->offset; NDR_CHECK(ndr_pull_advance(ndrpull, comp_chunk_size)); - comp_chunk = ndrpull->data + comp_chunk_offset; + comp_chunk.length = comp_chunk_size; + comp_chunk.data = ndrpull->data + comp_chunk_offset; plain_chunk_offset = ndrpush->offset; NDR_CHECK(ndr_push_zero(ndrpush, plain_chunk_size)); - plain_chunk = ndrpush->data + plain_chunk_offset; - - dump_data(10, comp_chunk, 16); - - zs->avail_in = comp_chunk_size; - zs->next_in = comp_chunk; - zs->next_out = plain_chunk; - zs->avail_out = plain_chunk_size; - - while (True) { - ret = inflate(zs, Z_BLOCK); - if (ret == Z_STREAM_END) { - DEBUG(0,("comp_chunk_size: %u avail_in: %d, plain_chunk_size: %u, avail_out: %d\n", - comp_chunk_size, zs->avail_in, plain_chunk_size, zs->avail_out)); - break; - } - if (ret != Z_OK) { - return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, "Bad ZLIB (PULL) inflate error %d", + plain_chunk.length = plain_chunk_size; + plain_chunk.data = ndrpush->data + plain_chunk_offset; + + ret = ZIPdecompress(decomp_state, &comp_chunk, &plain_chunk); + if (ret != DECR_OK) { + return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, "Bad ZIBdecompress() error %d (PULL)", ret); - } } if ((plain_chunk_size < 0x00008000) || (ndrpull->offset+4 >= ndrpull->data_size)) { @@ -96,84 +70,71 @@ static NTSTATUS ndr_pull_compression_zlib_chunk(struct ndr_pull *ndrpull, return NT_STATUS_MORE_PROCESSING_REQUIRED; } -static NTSTATUS ndr_pull_compression_zlib(struct ndr_pull *subndr, - struct ndr_pull *comndr, - ssize_t decompressed_len) +static NTSTATUS ndr_pull_compression_mszip(struct ndr_pull *subndr, + struct ndr_pull *comndr, + ssize_t decompressed_len) { NTSTATUS status = NT_STATUS_MORE_PROCESSING_REQUIRED; struct ndr_push *ndrpush; DATA_BLOB uncompressed; - struct z_stream_s zs; - int ret; - int i = 0; - - ZERO_STRUCT(zs); + uint32_t payload_header[4]; + uint32_t payload_size; + uint32_t payload_offset; + uint8_t *payload; + struct decomp_state *decomp_state; ndrpush = ndr_push_init_ctx(subndr); NT_STATUS_HAVE_NO_MEMORY(ndrpush); - ret = inflateInit2(&zs, -15); - if (ret != Z_OK) { - return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad ZLIB (PULL) inflateInit2 error %d", - ret); - } + decomp_state = ZIPdecomp_state(subndr); + NT_STATUS_HAVE_NO_MEMORY(decomp_state); while (NT_STATUS_EQUAL(NT_STATUS_MORE_PROCESSING_REQUIRED, status)) { - status = ndr_pull_compression_zlib_chunk(subndr, ndrpush, &zs, i++); + status = ndr_pull_compression_mszip_chunk(subndr, ndrpush, decomp_state); } - inflateEnd(&zs); NT_STATUS_NOT_OK_RETURN(status); uncompressed = ndr_push_blob(ndrpush); + if (uncompressed.length != decompressed_len) { + return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad uncompressed_len [%u] != [%d] (PULL)", + uncompressed.length, decompressed_len); + } + *comndr = *subndr; comndr->data = uncompressed.data; comndr->data_size = uncompressed.length; comndr->offset = 0; - return NT_STATUS_OK; -} + NDR_CHECK(ndr_pull_uint32(comndr, NDR_SCALARS, &payload_header[0])); + NDR_CHECK(ndr_pull_uint32(comndr, NDR_SCALARS, &payload_header[1])); + NDR_CHECK(ndr_pull_uint32(comndr, NDR_SCALARS, &payload_header[2])); + NDR_CHECK(ndr_pull_uint32(comndr, NDR_SCALARS, &payload_header[3])); -static NTSTATUS ndr_push_compression_zlib(struct ndr_push *subndr, - struct ndr_push *comndr) -{ - DATA_BLOB inbuf; - DATA_BLOB outbuf = data_blob_talloc(comndr, NULL, comndr->offset + 10); - struct z_stream_s zs; - int ret; + payload_size = payload_header[2]; - ZERO_STRUCT(zs); - - inbuf = ndr_push_blob(comndr); - - zs.avail_in = inbuf.length; - zs.next_in = inbuf.data; - zs.next_out = outbuf.data+10; - zs.avail_out = outbuf.length-10; - - ret = deflateInit(&zs, Z_DEFAULT_COMPRESSION); - if (ret != Z_OK) { - return ndr_push_error(subndr, NDR_ERR_COMPRESSION, "Bad ZLIB (PUSH) deflateInit2 error %d", - ret); - } - - ret = deflate(&zs, Z_SYNC_FLUSH); - - if (ret != Z_OK && ret != Z_STREAM_END) { - return ndr_push_error(subndr, NDR_ERR_COMPRESSION, "Bad ZLIB (PULL) deflate error %d", - ret); + /* TODO: check the first 4 bytes of the header */ + if (payload_header[1] != 0xCCCCCCCC) { + return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad payload_header[1] [0x%08X] != [0xCCCCCCCC] (PULL)", + payload_header[1]); } - deflateEnd(&zs); + payload_offset = comndr->offset; + NDR_CHECK(ndr_pull_advance(comndr, payload_size)); + payload = comndr->data + payload_offset; - /* TODO: push the header here */ - - - NDR_CHECK(ndr_push_bytes(subndr, outbuf.data, outbuf.length)); + comndr->data = payload; + comndr->data_size = payload_size; + comndr->offset = 0; return NT_STATUS_OK; } -#endif + +static NTSTATUS ndr_push_compression_mszip(struct ndr_push *subndr, + struct ndr_push *comndr) +{ + return ndr_push_error(subndr, NDR_ERR_COMPRESSION, "Bad MSZIP compression is not supported yet (PUSH)"); +} /* handle compressed subcontext buffers, which in midl land are user-marshalled, but @@ -187,10 +148,8 @@ NTSTATUS ndr_pull_compression(struct ndr_pull *subndr, comndr->flags = subndr->flags; switch (compression_alg) { -#ifdef HAVE_ZLIB - case NDR_COMPRESSION_ZLIB: - return ndr_pull_compression_zlib(subndr, comndr, decompressed_len); -#endif + case NDR_COMPRESSION_MSZIP: + 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); @@ -208,10 +167,8 @@ NTSTATUS ndr_push_compression(struct ndr_push *subndr, comndr->flags = subndr->flags; switch (compression_alg) { -#ifdef HAVE_ZLIB - case NDR_COMPRESSION_ZLIB: - return ndr_push_compression_zlib(subndr, comndr); -#endif + case NDR_COMPRESSION_MSZIP: + return ndr_push_compression_mszip(subndr, comndr); default: return ndr_push_error(subndr, NDR_ERR_COMPRESSION, "Bad compression algorithm %d (PUSH)", compression_alg); -- cgit From e835621799647ee70630b389fb53d15b15d68355 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 17 Jul 2005 09:20:52 +0000 Subject: r8520: fixed a pile of warnings from the build farm gcc -Wall output on S390. This is an attempt to avoid the panic we're seeing in the automatic builds. The main fixes are: - assumptions that sizeof(size_t) == sizeof(int), mostly in printf formats - use of NULL format statements to perform dn searches. - assumption that sizeof() returns an int (This used to be commit a58ea6b3854973b694d2b1e22323ed7eb00e3a3f) --- source4/librpc/ndr/ndr_compression.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index c806f62189..cf3c3ae97b 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -98,7 +98,7 @@ static NTSTATUS ndr_pull_compression_mszip(struct ndr_pull *subndr, if (uncompressed.length != decompressed_len) { return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad uncompressed_len [%u] != [%d] (PULL)", - uncompressed.length, decompressed_len); + (int)uncompressed.length, (int)decompressed_len); } *comndr = *subndr; -- cgit From a8d31eac00cf13c20343374f11224778e470e849 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 18 Aug 2005 00:45:19 +0000 Subject: r9372: - make the subcontext handling autogenerated code look nicer, - unify the handling of subcontext, compression and obfucation metze (This used to be commit 09de7e0af7f9f7539cf63791baf90ac202536176) --- source4/librpc/ndr/ndr_compression.c | 54 +++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 13 deletions(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index cf3c3ae97b..097f76c90a 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -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); -- cgit From ec96a742f7b6ce4cbb4f649dd8aba92ef80f0ff0 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 18 Aug 2005 01:24:08 +0000 Subject: r9373: - create a hierachical memory tree with recursiv ndr_pull_* functions - with this it's also possible to talloc_free() the ndr_pull structure and talloc_steal(ndr->current_mem_ctx); to fetch the whole data of the hierachical tree - if the toplevel struct is a valid talloc pointer it's also possible to use NDR_PULL_SET_MEM_CTX(ndr, mem_ctx); to the the toplevel pointer with the struct pointer (NOTE: no callers are using this yet, but they shortly will) metze (This used to be commit 1a2b8369586642cc9bc15d015c1e4256c3a92732) --- source4/librpc/ndr/ndr_compression.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index 097f76c90a..def194634f 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -105,6 +105,7 @@ static NTSTATUS ndr_pull_compression_mszip(struct ndr_pull *subndr, comndr = talloc_zero(subndr, struct ndr_pull); NT_STATUS_HAVE_NO_MEMORY(comndr); comndr->flags = subndr->flags; + comndr->current_mem_ctx = subndr->current_mem_ctx; comndr->data = uncompressed.data; comndr->data_size = uncompressed.length; -- cgit From 0e65d30bb72d4ad27c14c8467df115f4c1174d9a Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 10 Oct 2005 12:10:10 +0000 Subject: r10869: add dummy functions and dummy parsing of XPRESS decompression, this is the compression algorithm used by w2k3 for DsGetNCChanges(). This algorithm isn't known yet, but it seems to be some sort of Lempel-Ziv algorithm. metze (This used to be commit 694252b6e02e365ae5baffb76cdbc89eec5358e7) --- source4/librpc/ndr/ndr_compression.c | 92 +++++++++++++++++++++++++++++++++--- 1 file changed, 85 insertions(+), 7 deletions(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index def194634f..9f8fc97f18 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -37,13 +37,13 @@ static NTSTATUS ndr_pull_compression_mszip_chunk(struct ndr_pull *ndrpull, NDR_CHECK(ndr_pull_uint32(ndrpull, NDR_SCALARS, &plain_chunk_size)); if (plain_chunk_size > 0x00008000) { - return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, "Bad ZLIB plain chunk size %08X > 0x00008000 (PULL)", + return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, "Bad MSZIP plain chunk size %08X > 0x00008000 (PULL)", plain_chunk_size); } NDR_CHECK(ndr_pull_uint32(ndrpull, NDR_SCALARS, &comp_chunk_size)); - DEBUG(10,("plain_chunk_size: %08X (%u) comp_chunk_size: %08X (%u)\n", + DEBUG(10,("MSZIP plain_chunk_size: %08X (%u) comp_chunk_size: %08X (%u)\n", plain_chunk_size, plain_chunk_size, comp_chunk_size, comp_chunk_size)); comp_chunk_offset = ndrpull->offset; @@ -58,7 +58,7 @@ static NTSTATUS ndr_pull_compression_mszip_chunk(struct ndr_pull *ndrpull, ret = ZIPdecompress(decomp_state, &comp_chunk, &plain_chunk); if (ret != DECR_OK) { - return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, "Bad ZIBdecompress() error %d (PULL)", + return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, "Bad ZIPdecompress() error %d (PULL)", ret); } @@ -98,7 +98,7 @@ static NTSTATUS ndr_pull_compression_mszip(struct ndr_pull *subndr, uncompressed = ndr_push_blob(ndrpush); if (uncompressed.length != decompressed_len) { - return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad uncompressed_len [%u] != [%d] (PULL)", + return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad MSZIP uncompressed_len [%u] != [%d] (PULL)", (int)uncompressed.length, (int)decompressed_len); } @@ -120,7 +120,7 @@ static NTSTATUS ndr_pull_compression_mszip(struct ndr_pull *subndr, /* TODO: check the first 4 bytes of the header */ if (payload_header[1] != 0xCCCCCCCC) { - return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad payload_header[1] [0x%08X] != [0xCCCCCCCC] (PULL)", + return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad MSZIP payload_header[1] [0x%08X] != [0xCCCCCCCC] (PULL)", payload_header[1]); } @@ -137,9 +137,83 @@ static NTSTATUS ndr_pull_compression_mszip(struct ndr_pull *subndr, } static NTSTATUS ndr_push_compression_mszip(struct ndr_push *subndr, - struct ndr_push *comndr) + struct ndr_push *comndr) { - return ndr_push_error(subndr, NDR_ERR_COMPRESSION, "Bad MSZIP compression is not supported yet (PUSH)"); + return ndr_push_error(subndr, NDR_ERR_COMPRESSION, "Sorry MSZIP compression is not supported yet (PUSH)"); +} + +static NTSTATUS ndr_pull_compression_xpress_chunk(struct ndr_pull *ndrpull, + struct ndr_push *ndrpush) +{ + DATA_BLOB comp_chunk; + uint32_t comp_chunk_offset; + uint32_t comp_chunk_size; + uint32_t plain_chunk_size; + + comp_chunk_offset = ndrpull->offset; + + NDR_CHECK(ndr_pull_uint32(ndrpull, NDR_SCALARS, &plain_chunk_size)); + if (plain_chunk_size > 0x00010000) { + return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, "Bad XPRESS plain chunk size %08X > 0x00010000 (PULL)", + plain_chunk_size); + } + + NDR_CHECK(ndr_pull_uint32(ndrpull, NDR_SCALARS, &comp_chunk_size)); + + NDR_CHECK(ndr_pull_advance(ndrpull, comp_chunk_size)); + comp_chunk.length = comp_chunk_size; + comp_chunk.data = ndrpull->data + comp_chunk_offset; + + DEBUG(10,("XPRESS plain_chunk_size: %08X (%u) comp_chunk_size: %08X (%u)\n", + plain_chunk_size, plain_chunk_size, comp_chunk_size, comp_chunk_size)); + + /* For now, we just copy over the compressed blob */ + NDR_CHECK(ndr_push_bytes(ndrpush, comp_chunk.data, comp_chunk.length)); + + if ((plain_chunk_size < 0x00010000) || (ndrpull->offset+4 >= ndrpull->data_size)) { + /* this is the last chunk */ + return NT_STATUS_OK; + } + + return NT_STATUS_MORE_PROCESSING_REQUIRED; +} + +static NTSTATUS ndr_pull_compression_xpress(struct ndr_pull *subndr, + 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; + + ndrpush = ndr_push_init_ctx(subndr); + NT_STATUS_HAVE_NO_MEMORY(ndrpush); + + while (NT_STATUS_EQUAL(NT_STATUS_MORE_PROCESSING_REQUIRED, status)) { + status = ndr_pull_compression_xpress_chunk(subndr, ndrpush); + } + NT_STATUS_NOT_OK_RETURN(status); + + uncompressed = ndr_push_blob(ndrpush); + + comndr = talloc_zero(subndr, struct ndr_pull); + NT_STATUS_HAVE_NO_MEMORY(comndr); + comndr->flags = subndr->flags; + comndr->current_mem_ctx = subndr->current_mem_ctx; + + comndr->data = uncompressed.data; + comndr->data_size = uncompressed.length; + comndr->offset = 0; + + *_comndr = comndr; + return NT_STATUS_OK; +} + +static NTSTATUS ndr_push_compression_xpress(struct ndr_push *subndr, + struct ndr_push *comndr) +{ + return ndr_push_error(subndr, NDR_ERR_COMPRESSION, "XPRESS compression is not supported yet (PUSH)"); } /* @@ -154,6 +228,8 @@ NTSTATUS ndr_pull_compression_start(struct ndr_pull *subndr, switch (compression_alg) { case NDR_COMPRESSION_MSZIP: return ndr_pull_compression_mszip(subndr, _comndr, decompressed_len); + case NDR_COMPRESSION_XPRESS: + return ndr_pull_compression_xpress(subndr, _comndr, decompressed_len); default: return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad compression algorithm %d (PULL)", compression_alg); @@ -198,6 +274,8 @@ NTSTATUS ndr_push_compression_end(struct ndr_push *subndr, switch (compression_alg) { case NDR_COMPRESSION_MSZIP: return ndr_push_compression_mszip(subndr, comndr); + case NDR_COMPRESSION_XPRESS: + return ndr_push_compression_xpress(subndr, comndr); default: return ndr_push_error(subndr, NDR_ERR_COMPRESSION, "Bad compression algorithm %d (PUSH)", compression_alg); -- cgit From b2490bb98d964f961addf0b99fb8706d46961b6f Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 10 Oct 2005 13:25:11 +0000 Subject: r10872: fix the length of the dummy XPRESS decompressed buffer metze (This used to be commit 0a1e4498a3550721b214716d1106843bf1ff4597) --- source4/librpc/ndr/ndr_compression.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index 9f8fc97f18..fc16faca80 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -161,7 +161,7 @@ static NTSTATUS ndr_pull_compression_xpress_chunk(struct ndr_pull *ndrpull, NDR_CHECK(ndr_pull_uint32(ndrpull, NDR_SCALARS, &comp_chunk_size)); NDR_CHECK(ndr_pull_advance(ndrpull, comp_chunk_size)); - comp_chunk.length = comp_chunk_size; + comp_chunk.length = comp_chunk_size + 8; comp_chunk.data = ndrpull->data + comp_chunk_offset; DEBUG(10,("XPRESS plain_chunk_size: %08X (%u) comp_chunk_size: %08X (%u)\n", -- cgit From 3dfe8c22b835c34453b23b654cd5649d698da3cb Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 10 Oct 2005 14:10:37 +0000 Subject: r10873: check the complete payload header metze (This used to be commit 27f8d82231f2978ff15719e4b23912ae7f910638) --- source4/librpc/ndr/ndr_compression.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index fc16faca80..fb04a1799a 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -116,14 +116,22 @@ static NTSTATUS ndr_pull_compression_mszip(struct ndr_pull *subndr, NDR_CHECK(ndr_pull_uint32(comndr, NDR_SCALARS, &payload_header[2])); NDR_CHECK(ndr_pull_uint32(comndr, NDR_SCALARS, &payload_header[3])); - payload_size = payload_header[2]; - - /* TODO: check the first 4 bytes of the header */ + if (payload_header[0] != 0x00081001) { + return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad MSZIP payload_header[0] [0x%08X] != [0x00081001] (PULL)", + payload_header[0]); + } if (payload_header[1] != 0xCCCCCCCC) { return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad MSZIP payload_header[1] [0x%08X] != [0xCCCCCCCC] (PULL)", payload_header[1]); } + payload_size = payload_header[2]; + + if (payload_header[3] != 0x00000000) { + return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad MSZIP payload_header[3] [0x%08X] != [0x00000000] (PULL)", + payload_header[3]); + } + payload_offset = comndr->offset; NDR_CHECK(ndr_pull_advance(comndr, payload_size)); payload = comndr->data + payload_offset; -- cgit From 35349a58df5b69446607fbd742a05f57f3515319 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 18 Mar 2006 15:42:57 +0000 Subject: r14542: Remove librpc, libndr and libnbt from includes.h (This used to be commit 51b4270513752d2eafbe77f9de598de16ef84a1f) --- source4/librpc/ndr/ndr_compression.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index fb04a1799a..fabfd73704 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -22,6 +22,7 @@ #include "includes.h" #include "lib/compression/mszip.h" +#include "librpc/ndr/libndr.h" static NTSTATUS ndr_pull_compression_mszip_chunk(struct ndr_pull *ndrpull, struct ndr_push *ndrpush, -- cgit From 0479a2f1cbae51fcd8dbdc3c148c808421fb4d25 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 10 Jul 2007 02:07:03 +0000 Subject: r23792: convert Samba4 to GPLv3 There are still a few tidyups of old FSF addresses to come (in both s3 and s4). More commits soon. (This used to be commit fcf38a38ac691abd0fa51b89dc951a08e89fdafa) --- source4/librpc/ndr/ndr_compression.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index fabfd73704..6b3b44109b 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -7,7 +7,7 @@ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -16,8 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with this program. If not, see . */ #include "includes.h" -- cgit From 98b57d5eb61094a9c88e2f7d90d3e21b7e74e9d8 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 8 Sep 2007 16:46:30 +0000 Subject: r25035: Fix some more warnings, use service pointer rather than service number in more places. (This used to be commit df9cebcb97e20564359097148665bd519f31bc6f) --- source4/librpc/ndr/ndr_compression.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index 6b3b44109b..1d8cfec649 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -22,6 +22,7 @@ #include "includes.h" #include "lib/compression/mszip.h" #include "librpc/ndr/libndr.h" +#include "librpc/ndr/ndr_compression.h" static NTSTATUS ndr_pull_compression_mszip_chunk(struct ndr_pull *ndrpull, struct ndr_push *ndrpush, -- cgit From 5ef00987cb8363b32776c14ade64edd7ee9bfed2 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 1 Nov 2007 09:48:42 +0100 Subject: r25776: ndr compression: make use of NDR_CHECK() and not use NTSTATUS directly metze (This used to be commit 52d83561e510e7e5bc406b699a251713dbd0ea91) --- source4/librpc/ndr/ndr_compression.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index 1d8cfec649..4144396fa2 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -26,7 +26,8 @@ static NTSTATUS ndr_pull_compression_mszip_chunk(struct ndr_pull *ndrpull, struct ndr_push *ndrpush, - struct decomp_state *decomp_state) + struct decomp_state *decomp_state, + bool *last) { DATA_BLOB comp_chunk; uint32_t comp_chunk_offset; @@ -65,17 +66,16 @@ static NTSTATUS ndr_pull_compression_mszip_chunk(struct ndr_pull *ndrpull, if ((plain_chunk_size < 0x00008000) || (ndrpull->offset+4 >= ndrpull->data_size)) { /* this is the last chunk */ - return NT_STATUS_OK; + *last = true; } - return NT_STATUS_MORE_PROCESSING_REQUIRED; + return NT_STATUS_OK; } static NTSTATUS ndr_pull_compression_mszip(struct ndr_pull *subndr, 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; @@ -84,6 +84,7 @@ static NTSTATUS ndr_pull_compression_mszip(struct ndr_pull *subndr, uint32_t payload_offset; uint8_t *payload; struct decomp_state *decomp_state; + bool last = false; ndrpush = ndr_push_init_ctx(subndr); NT_STATUS_HAVE_NO_MEMORY(ndrpush); @@ -91,10 +92,9 @@ static NTSTATUS ndr_pull_compression_mszip(struct ndr_pull *subndr, decomp_state = ZIPdecomp_state(subndr); NT_STATUS_HAVE_NO_MEMORY(decomp_state); - while (NT_STATUS_EQUAL(NT_STATUS_MORE_PROCESSING_REQUIRED, status)) { - status = ndr_pull_compression_mszip_chunk(subndr, ndrpush, decomp_state); + while (!last) { + NDR_CHECK(ndr_pull_compression_mszip_chunk(subndr, ndrpush, decomp_state, &last)); } - NT_STATUS_NOT_OK_RETURN(status); uncompressed = ndr_push_blob(ndrpush); @@ -152,7 +152,8 @@ static NTSTATUS ndr_push_compression_mszip(struct ndr_push *subndr, } static NTSTATUS ndr_pull_compression_xpress_chunk(struct ndr_pull *ndrpull, - struct ndr_push *ndrpush) + struct ndr_push *ndrpush, + bool *last) { DATA_BLOB comp_chunk; uint32_t comp_chunk_offset; @@ -181,28 +182,27 @@ static NTSTATUS ndr_pull_compression_xpress_chunk(struct ndr_pull *ndrpull, if ((plain_chunk_size < 0x00010000) || (ndrpull->offset+4 >= ndrpull->data_size)) { /* this is the last chunk */ - return NT_STATUS_OK; + *last = true; } - return NT_STATUS_MORE_PROCESSING_REQUIRED; + return NT_STATUS_OK; } static NTSTATUS ndr_pull_compression_xpress(struct ndr_pull *subndr, 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; + bool last = false; ndrpush = ndr_push_init_ctx(subndr); NT_STATUS_HAVE_NO_MEMORY(ndrpush); - while (NT_STATUS_EQUAL(NT_STATUS_MORE_PROCESSING_REQUIRED, status)) { - status = ndr_pull_compression_xpress_chunk(subndr, ndrpush); + while (!last) { + NDR_CHECK(ndr_pull_compression_xpress_chunk(subndr, ndrpush, &last)); } - NT_STATUS_NOT_OK_RETURN(status); uncompressed = ndr_push_blob(ndrpush); -- cgit From 910ab408afe0ed866d378fb6d58e795dffcbfa58 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 9 Nov 2007 19:24:10 +0100 Subject: r25918: ndr: change NTSTAUS into enum ndr_err_code (samba4 handwritten stuff) ndr_sec_helper.c ndr_spoolss_buf.c ndr_compression.c ndr_drsuapi.[ch] ndr_krb5pac.c ndr_orpc.c metze (This used to be commit 356e027bf883c8fc36fa4759eff56e364daf9fce) --- source4/librpc/ndr/ndr_compression.c | 48 ++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 24 deletions(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index 4144396fa2..411d4a17e2 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -24,7 +24,7 @@ #include "librpc/ndr/libndr.h" #include "librpc/ndr/ndr_compression.h" -static NTSTATUS ndr_pull_compression_mszip_chunk(struct ndr_pull *ndrpull, +static enum ndr_err_code ndr_pull_compression_mszip_chunk(struct ndr_pull *ndrpull, struct ndr_push *ndrpush, struct decomp_state *decomp_state, bool *last) @@ -69,10 +69,10 @@ static NTSTATUS ndr_pull_compression_mszip_chunk(struct ndr_pull *ndrpull, *last = true; } - return NT_STATUS_OK; + return NDR_ERR_SUCCESS; } -static NTSTATUS ndr_pull_compression_mszip(struct ndr_pull *subndr, +static enum ndr_err_code ndr_pull_compression_mszip(struct ndr_pull *subndr, struct ndr_pull **_comndr, ssize_t decompressed_len) { @@ -87,10 +87,10 @@ static NTSTATUS ndr_pull_compression_mszip(struct ndr_pull *subndr, bool last = false; ndrpush = ndr_push_init_ctx(subndr); - NT_STATUS_HAVE_NO_MEMORY(ndrpush); + NDR_ERR_HAVE_NO_MEMORY(ndrpush); decomp_state = ZIPdecomp_state(subndr); - NT_STATUS_HAVE_NO_MEMORY(decomp_state); + NDR_ERR_HAVE_NO_MEMORY(decomp_state); while (!last) { NDR_CHECK(ndr_pull_compression_mszip_chunk(subndr, ndrpush, decomp_state, &last)); @@ -104,7 +104,7 @@ static NTSTATUS ndr_pull_compression_mszip(struct ndr_pull *subndr, } comndr = talloc_zero(subndr, struct ndr_pull); - NT_STATUS_HAVE_NO_MEMORY(comndr); + NDR_ERR_HAVE_NO_MEMORY(comndr); comndr->flags = subndr->flags; comndr->current_mem_ctx = subndr->current_mem_ctx; @@ -142,16 +142,16 @@ static NTSTATUS ndr_pull_compression_mszip(struct ndr_pull *subndr, comndr->offset = 0; *_comndr = comndr; - return NT_STATUS_OK; + return NDR_ERR_SUCCESS; } -static NTSTATUS ndr_push_compression_mszip(struct ndr_push *subndr, +static enum ndr_err_code ndr_push_compression_mszip(struct ndr_push *subndr, struct ndr_push *comndr) { return ndr_push_error(subndr, NDR_ERR_COMPRESSION, "Sorry MSZIP compression is not supported yet (PUSH)"); } -static NTSTATUS ndr_pull_compression_xpress_chunk(struct ndr_pull *ndrpull, +static enum ndr_err_code ndr_pull_compression_xpress_chunk(struct ndr_pull *ndrpull, struct ndr_push *ndrpush, bool *last) { @@ -185,10 +185,10 @@ static NTSTATUS ndr_pull_compression_xpress_chunk(struct ndr_pull *ndrpull, *last = true; } - return NT_STATUS_OK; + return NDR_ERR_SUCCESS; } -static NTSTATUS ndr_pull_compression_xpress(struct ndr_pull *subndr, +static enum ndr_err_code ndr_pull_compression_xpress(struct ndr_pull *subndr, struct ndr_pull **_comndr, ssize_t decompressed_len) { @@ -198,7 +198,7 @@ static NTSTATUS ndr_pull_compression_xpress(struct ndr_pull *subndr, bool last = false; ndrpush = ndr_push_init_ctx(subndr); - NT_STATUS_HAVE_NO_MEMORY(ndrpush); + NDR_ERR_HAVE_NO_MEMORY(ndrpush); while (!last) { NDR_CHECK(ndr_pull_compression_xpress_chunk(subndr, ndrpush, &last)); @@ -207,7 +207,7 @@ static NTSTATUS ndr_pull_compression_xpress(struct ndr_pull *subndr, uncompressed = ndr_push_blob(ndrpush); comndr = talloc_zero(subndr, struct ndr_pull); - NT_STATUS_HAVE_NO_MEMORY(comndr); + NDR_ERR_HAVE_NO_MEMORY(comndr); comndr->flags = subndr->flags; comndr->current_mem_ctx = subndr->current_mem_ctx; @@ -216,10 +216,10 @@ static NTSTATUS ndr_pull_compression_xpress(struct ndr_pull *subndr, comndr->offset = 0; *_comndr = comndr; - return NT_STATUS_OK; + return NDR_ERR_SUCCESS; } -static NTSTATUS ndr_push_compression_xpress(struct ndr_push *subndr, +static enum ndr_err_code ndr_push_compression_xpress(struct ndr_push *subndr, struct ndr_push *comndr) { return ndr_push_error(subndr, NDR_ERR_COMPRESSION, "XPRESS compression is not supported yet (PUSH)"); @@ -229,7 +229,7 @@ static NTSTATUS ndr_push_compression_xpress(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_start(struct ndr_pull *subndr, +enum ndr_err_code ndr_pull_compression_start(struct ndr_pull *subndr, struct ndr_pull **_comndr, enum ndr_compression_alg compression_alg, ssize_t decompressed_len) @@ -243,21 +243,21 @@ NTSTATUS ndr_pull_compression_start(struct ndr_pull *subndr, return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad compression algorithm %d (PULL)", compression_alg); } - return NT_STATUS_OK; + return NDR_ERR_SUCCESS; } -NTSTATUS ndr_pull_compression_end(struct ndr_pull *subndr, +enum ndr_err_code 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; + return NDR_ERR_SUCCESS; } /* push a compressed subcontext */ -NTSTATUS ndr_push_compression_start(struct ndr_push *subndr, +enum ndr_err_code ndr_push_compression_start(struct ndr_push *subndr, struct ndr_push **_comndr, enum ndr_compression_alg compression_alg, ssize_t decompressed_len) @@ -265,17 +265,17 @@ NTSTATUS ndr_push_compression_start(struct ndr_push *subndr, struct ndr_push *comndr; comndr = ndr_push_init_ctx(subndr); - NT_STATUS_HAVE_NO_MEMORY(comndr); + NDR_ERR_HAVE_NO_MEMORY(comndr); comndr->flags = subndr->flags; *_comndr = comndr; - return NT_STATUS_OK; + return NDR_ERR_SUCCESS; } /* push a compressed subcontext */ -NTSTATUS ndr_push_compression_end(struct ndr_push *subndr, +enum ndr_err_code ndr_push_compression_end(struct ndr_push *subndr, struct ndr_push *comndr, enum ndr_compression_alg compression_alg, ssize_t decompressed_len) @@ -289,5 +289,5 @@ NTSTATUS ndr_push_compression_end(struct ndr_push *subndr, return ndr_push_error(subndr, NDR_ERR_COMPRESSION, "Bad compression algorithm %d (PUSH)", compression_alg); } - return NT_STATUS_OK; + return NDR_ERR_SUCCESS; } -- cgit From 61873ce94c172c801a4831de5550a8e0fe54c5f5 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 13 Dec 2007 22:46:23 +0100 Subject: r26431: Require ndr_push creators to specify a iconv_convenience context. (This used to be commit 7352206f4450fdf881b95bda064cedd9d2477e4c) --- source4/librpc/ndr/ndr_compression.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index 411d4a17e2..310f8c4ce4 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -86,7 +86,7 @@ static enum ndr_err_code ndr_pull_compression_mszip(struct ndr_pull *subndr, struct decomp_state *decomp_state; bool last = false; - ndrpush = ndr_push_init_ctx(subndr); + ndrpush = ndr_push_init_ctx(subndr, subndr->iconv_convenience); NDR_ERR_HAVE_NO_MEMORY(ndrpush); decomp_state = ZIPdecomp_state(subndr); @@ -197,7 +197,7 @@ static enum ndr_err_code ndr_pull_compression_xpress(struct ndr_pull *subndr, DATA_BLOB uncompressed; bool last = false; - ndrpush = ndr_push_init_ctx(subndr); + ndrpush = ndr_push_init_ctx(subndr, subndr->iconv_convenience); NDR_ERR_HAVE_NO_MEMORY(ndrpush); while (!last) { @@ -264,7 +264,7 @@ enum ndr_err_code ndr_push_compression_start(struct ndr_push *subndr, { struct ndr_push *comndr; - comndr = ndr_push_init_ctx(subndr); + comndr = ndr_push_init_ctx(subndr, subndr->iconv_convenience); NDR_ERR_HAVE_NO_MEMORY(comndr); comndr->flags = subndr->flags; -- cgit From 8623c981b4a67dafc19234faffced1796f33b975 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 21 Jan 2008 20:56:27 +1100 Subject: Be sure to pass iconv handle down to compression subcontexts (fixes segfaults in NET-API-BECOME-DC) Andrew Bartlett (This used to be commit 70c1e918e6bd01946425e2d89cb680f14152f9fc) --- source4/librpc/ndr/ndr_compression.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index 310f8c4ce4..86a5a2560e 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -112,6 +112,8 @@ static enum ndr_err_code ndr_pull_compression_mszip(struct ndr_pull *subndr, comndr->data_size = uncompressed.length; comndr->offset = 0; + comndr->iconv_convenience = talloc_reference(comndr, subndr->iconv_convenience); + NDR_CHECK(ndr_pull_uint32(comndr, NDR_SCALARS, &payload_header[0])); NDR_CHECK(ndr_pull_uint32(comndr, NDR_SCALARS, &payload_header[1])); NDR_CHECK(ndr_pull_uint32(comndr, NDR_SCALARS, &payload_header[2])); @@ -215,6 +217,8 @@ static enum ndr_err_code ndr_pull_compression_xpress(struct ndr_pull *subndr, comndr->data_size = uncompressed.length; comndr->offset = 0; + comndr->iconv_convenience = talloc_reference(comndr, subndr->iconv_convenience); + *_comndr = comndr; return NDR_ERR_SUCCESS; } -- cgit From ffa18ca49a2e9d179c122c4dff56fe2dcf54c365 Mon Sep 17 00:00:00 2001 From: Matthieu Suiche Date: Thu, 10 Jul 2008 09:31:43 +0000 Subject: librpc/ndr: add support for XPRESS decompression Signed-off-by: Stefan Metzmacher (This used to be commit 6a9720c99d36a575ea8ed92e94ff6d2fe6f3e27d) --- source4/librpc/ndr/ndr_compression.c | 61 +++++++++++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 5 deletions(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index 86a5a2560e..ffa37f61a3 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -4,6 +4,7 @@ libndr compression support Copyright (C) Stefan Metzmacher 2005 + Copyright (C) Matthieu Suiche 2008 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,6 +22,7 @@ #include "includes.h" #include "lib/compression/mszip.h" +#include "lib/compression/lzxpress.h" #include "librpc/ndr/libndr.h" #include "librpc/ndr/ndr_compression.h" @@ -158,12 +160,12 @@ static enum ndr_err_code ndr_pull_compression_xpress_chunk(struct ndr_pull *ndrp bool *last) { DATA_BLOB comp_chunk; + DATA_BLOB plain_chunk; uint32_t comp_chunk_offset; + uint32_t plain_chunk_offset; uint32_t comp_chunk_size; uint32_t plain_chunk_size; - comp_chunk_offset = ndrpull->offset; - NDR_CHECK(ndr_pull_uint32(ndrpull, NDR_SCALARS, &plain_chunk_size)); if (plain_chunk_size > 0x00010000) { return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, "Bad XPRESS plain chunk size %08X > 0x00010000 (PULL)", @@ -172,15 +174,21 @@ static enum ndr_err_code ndr_pull_compression_xpress_chunk(struct ndr_pull *ndrp NDR_CHECK(ndr_pull_uint32(ndrpull, NDR_SCALARS, &comp_chunk_size)); + comp_chunk_offset = ndrpull->offset; NDR_CHECK(ndr_pull_advance(ndrpull, comp_chunk_size)); - comp_chunk.length = comp_chunk_size + 8; + comp_chunk.length = comp_chunk_size; comp_chunk.data = ndrpull->data + comp_chunk_offset; + plain_chunk_offset = ndrpush->offset; + NDR_CHECK(ndr_push_zero(ndrpush, plain_chunk_size)); + plain_chunk.length = plain_chunk_size; + plain_chunk.data = ndrpush->data + plain_chunk_offset; + DEBUG(10,("XPRESS plain_chunk_size: %08X (%u) comp_chunk_size: %08X (%u)\n", plain_chunk_size, plain_chunk_size, comp_chunk_size, comp_chunk_size)); - /* For now, we just copy over the compressed blob */ - NDR_CHECK(ndr_push_bytes(ndrpush, comp_chunk.data, comp_chunk.length)); + /* Uncompressing the buffer using LZ Xpress algorithm */ + lzxpress_decompress(&comp_chunk, &plain_chunk); if ((plain_chunk_size < 0x00010000) || (ndrpull->offset+4 >= ndrpull->data_size)) { /* this is the last chunk */ @@ -197,6 +205,10 @@ static enum ndr_err_code ndr_pull_compression_xpress(struct ndr_pull *subndr, struct ndr_push *ndrpush; struct ndr_pull *comndr; DATA_BLOB uncompressed; + uint32_t payload_header[4]; + uint32_t payload_size; + uint32_t payload_offset; + uint8_t *payload; bool last = false; ndrpush = ndr_push_init_ctx(subndr, subndr->iconv_convenience); @@ -207,6 +219,13 @@ static enum ndr_err_code ndr_pull_compression_xpress(struct ndr_pull *subndr, } uncompressed = ndr_push_blob(ndrpush); + if (uncompressed.length != decompressed_len) { + return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, + "Bad XPRESS uncompressed_len [%u] != [%u](0x%08X) (PULL)", + (int)uncompressed.length, + (int)decompressed_len, + (int)decompressed_len); + } comndr = talloc_zero(subndr, struct ndr_pull); NDR_ERR_HAVE_NO_MEMORY(comndr); @@ -219,6 +238,38 @@ static enum ndr_err_code ndr_pull_compression_xpress(struct ndr_pull *subndr, comndr->iconv_convenience = talloc_reference(comndr, subndr->iconv_convenience); + NDR_CHECK(ndr_pull_uint32(comndr, NDR_SCALARS, &payload_header[0])); + NDR_CHECK(ndr_pull_uint32(comndr, NDR_SCALARS, &payload_header[1])); + NDR_CHECK(ndr_pull_uint32(comndr, NDR_SCALARS, &payload_header[2])); + NDR_CHECK(ndr_pull_uint32(comndr, NDR_SCALARS, &payload_header[3])); + + if (payload_header[0] != 0x00081001) { + return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, + "Bad XPRESS payload_header[0] [0x%08X] != [0x00081001] (PULL)", + payload_header[0]); + } + if (payload_header[1] != 0xCCCCCCCC) { + return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, + "Bad XPRESS payload_header[1] [0x%08X] != [0xCCCCCCCC] (PULL)", + payload_header[1]); + } + + payload_size = payload_header[2]; + + if (payload_header[3] != 0x00000000) { + return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, + "Bad XPRESS payload_header[3] [0x%08X] != [0x00000000] (PULL)", + payload_header[3]); + } + + payload_offset = comndr->offset; + NDR_CHECK(ndr_pull_advance(comndr, payload_size)); + payload = comndr->data + payload_offset; + + comndr->data = payload; + comndr->data_size = payload_size; + comndr->offset = 0; + *_comndr = comndr; return NDR_ERR_SUCCESS; } -- cgit From 6cd8e2bccf2023833f679963244f56ca6854eb66 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 7 Aug 2008 16:24:57 +0000 Subject: ndr_compression: use zlib's inflate() for decompression metze (This used to be commit 25876fc4ab8ba11f00d24bb8ceb517c0e4a4d72d) --- source4/librpc/ndr/ndr_compression.c | 92 +++++++++++++++++++++++++++++++----- 1 file changed, 81 insertions(+), 11 deletions(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index ffa37f61a3..7c2aca72e9 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -21,14 +21,24 @@ */ #include "includes.h" -#include "lib/compression/mszip.h" #include "lib/compression/lzxpress.h" #include "librpc/ndr/libndr.h" #include "librpc/ndr/ndr_compression.h" +#include + +static voidpf ndr_zlib_alloc(voidpf opaque, uInt items, uInt size) +{ + return talloc_zero_size(opaque, items * size); +} + +static void ndr_zlib_free(voidpf opaque, voidpf address) +{ + talloc_free(address); +} static enum ndr_err_code ndr_pull_compression_mszip_chunk(struct ndr_pull *ndrpull, struct ndr_push *ndrpush, - struct decomp_state *decomp_state, + z_stream *z, bool *last) { DATA_BLOB comp_chunk; @@ -37,7 +47,7 @@ static enum ndr_err_code ndr_pull_compression_mszip_chunk(struct ndr_pull *ndrpu DATA_BLOB plain_chunk; uint32_t plain_chunk_offset; uint32_t plain_chunk_size; - int ret; + int z_ret; NDR_CHECK(ndr_pull_uint32(ndrpull, NDR_SCALARS, &plain_chunk_size)); if (plain_chunk_size > 0x00008000) { @@ -60,10 +70,71 @@ static enum ndr_err_code ndr_pull_compression_mszip_chunk(struct ndr_pull *ndrpu plain_chunk.length = plain_chunk_size; plain_chunk.data = ndrpush->data + plain_chunk_offset; - ret = ZIPdecompress(decomp_state, &comp_chunk, &plain_chunk); - if (ret != DECR_OK) { - return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, "Bad ZIPdecompress() error %d (PULL)", - ret); + if (comp_chunk.length < 2) { + return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, + "Bad MSZIP comp chunk size %u < 2 (PULL)", + (unsigned int)comp_chunk.length); + } + /* CK = Chris Kirmse, official Microsoft purloiner */ + if (comp_chunk.data[0] != 'C' || + comp_chunk.data[1] != 'K') { + return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, + "Bad MSZIP invalid prefix [%c%c] != [CK]", + comp_chunk.data[0], comp_chunk.data[1]); + } + + z->next_in = comp_chunk.data + 2; + z->avail_in = comp_chunk.length -2; + z->total_in = 0; + + z->next_out = plain_chunk.data; + z->avail_out = plain_chunk.length; + z->total_out = 0; + + if (!z->opaque) { + /* the first time we need to intialize completely */ + z->zalloc = ndr_zlib_alloc; + z->zfree = ndr_zlib_free; + z->opaque = ndrpull; + + z_ret = inflateInit2(z, -15); + if (z_ret != Z_OK) { + return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, + "Bad inflateInit2 error %s(%d) (PULL)", + zError(z_ret), z_ret); + + } + } else { + z_ret = inflateReset2(z, Z_RESET_KEEP_WINDOW); + if (z_ret != Z_OK) { + return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, + "Bad inflateReset2 error %s(%d) (PULL)", + zError(z_ret), z_ret); + } + } + + /* call inflate untill we get Z_STREAM_END or an error */ + while (true) { + z_ret = inflate(z, Z_BLOCK); + if (z_ret != Z_OK) break; + } + + if (z_ret != Z_STREAM_END) { + return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, + "Bad inflate(Z_BLOCK) error %s(%d) (PULL)", + zError(z_ret), z_ret); + } + + if (z->avail_in) { + return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, + "MSZIP not all avail_in[%u] bytes consumed (PULL)", + z->avail_in); + } + + if (z->avail_out) { + return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, + "MSZIP not all avail_out[%u] bytes consumed (PULL)", + z->avail_out); } if ((plain_chunk_size < 0x00008000) || (ndrpull->offset+4 >= ndrpull->data_size)) { @@ -85,17 +156,16 @@ static enum ndr_err_code ndr_pull_compression_mszip(struct ndr_pull *subndr, uint32_t payload_size; uint32_t payload_offset; uint8_t *payload; - struct decomp_state *decomp_state; + z_stream z; bool last = false; ndrpush = ndr_push_init_ctx(subndr, subndr->iconv_convenience); NDR_ERR_HAVE_NO_MEMORY(ndrpush); - decomp_state = ZIPdecomp_state(subndr); - NDR_ERR_HAVE_NO_MEMORY(decomp_state); + ZERO_STRUCT(z); while (!last) { - NDR_CHECK(ndr_pull_compression_mszip_chunk(subndr, ndrpush, decomp_state, &last)); + NDR_CHECK(ndr_pull_compression_mszip_chunk(subndr, ndrpush, &z, &last)); } uncompressed = ndr_push_blob(ndrpush); -- cgit From 17fcc4118f4d104d314e0acb0eae87954654a1a5 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 19 Aug 2008 10:29:40 +0200 Subject: ndr_compression: unify the common handling of mszip and xpress compression metze (This used to be commit 925a2066ffa18a86704a8ee1a7a6908e0cd65a2a) --- source4/librpc/ndr/ndr_compression.c | 140 +++++++++-------------------------- 1 file changed, 33 insertions(+), 107 deletions(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index 7c2aca72e9..ad8dda1f6e 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -145,80 +145,6 @@ static enum ndr_err_code ndr_pull_compression_mszip_chunk(struct ndr_pull *ndrpu return NDR_ERR_SUCCESS; } -static enum ndr_err_code ndr_pull_compression_mszip(struct ndr_pull *subndr, - struct ndr_pull **_comndr, - ssize_t decompressed_len) -{ - struct ndr_push *ndrpush; - struct ndr_pull *comndr; - DATA_BLOB uncompressed; - uint32_t payload_header[4]; - uint32_t payload_size; - uint32_t payload_offset; - uint8_t *payload; - z_stream z; - bool last = false; - - ndrpush = ndr_push_init_ctx(subndr, subndr->iconv_convenience); - NDR_ERR_HAVE_NO_MEMORY(ndrpush); - - ZERO_STRUCT(z); - - while (!last) { - NDR_CHECK(ndr_pull_compression_mszip_chunk(subndr, ndrpush, &z, &last)); - } - - uncompressed = ndr_push_blob(ndrpush); - - if (uncompressed.length != decompressed_len) { - return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad MSZIP uncompressed_len [%u] != [%d] (PULL)", - (int)uncompressed.length, (int)decompressed_len); - } - - comndr = talloc_zero(subndr, struct ndr_pull); - NDR_ERR_HAVE_NO_MEMORY(comndr); - comndr->flags = subndr->flags; - comndr->current_mem_ctx = subndr->current_mem_ctx; - - comndr->data = uncompressed.data; - comndr->data_size = uncompressed.length; - comndr->offset = 0; - - comndr->iconv_convenience = talloc_reference(comndr, subndr->iconv_convenience); - - NDR_CHECK(ndr_pull_uint32(comndr, NDR_SCALARS, &payload_header[0])); - NDR_CHECK(ndr_pull_uint32(comndr, NDR_SCALARS, &payload_header[1])); - NDR_CHECK(ndr_pull_uint32(comndr, NDR_SCALARS, &payload_header[2])); - NDR_CHECK(ndr_pull_uint32(comndr, NDR_SCALARS, &payload_header[3])); - - if (payload_header[0] != 0x00081001) { - return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad MSZIP payload_header[0] [0x%08X] != [0x00081001] (PULL)", - payload_header[0]); - } - if (payload_header[1] != 0xCCCCCCCC) { - return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad MSZIP payload_header[1] [0x%08X] != [0xCCCCCCCC] (PULL)", - payload_header[1]); - } - - payload_size = payload_header[2]; - - if (payload_header[3] != 0x00000000) { - return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad MSZIP payload_header[3] [0x%08X] != [0x00000000] (PULL)", - payload_header[3]); - } - - payload_offset = comndr->offset; - NDR_CHECK(ndr_pull_advance(comndr, payload_size)); - payload = comndr->data + payload_offset; - - comndr->data = payload; - comndr->data_size = payload_size; - comndr->offset = 0; - - *_comndr = comndr; - return NDR_ERR_SUCCESS; -} - static enum ndr_err_code ndr_push_compression_mszip(struct ndr_push *subndr, struct ndr_push *comndr) { @@ -268,9 +194,20 @@ static enum ndr_err_code ndr_pull_compression_xpress_chunk(struct ndr_pull *ndrp return NDR_ERR_SUCCESS; } -static enum ndr_err_code ndr_pull_compression_xpress(struct ndr_pull *subndr, - struct ndr_pull **_comndr, - ssize_t decompressed_len) +static enum ndr_err_code ndr_push_compression_xpress(struct ndr_push *subndr, + struct ndr_push *comndr) +{ + return ndr_push_error(subndr, NDR_ERR_COMPRESSION, "XPRESS compression is not supported yet (PUSH)"); +} + +/* + handle compressed subcontext buffers, which in midl land are user-marshalled, but + we use magic in pidl to make them easier to cope with +*/ +enum ndr_err_code ndr_pull_compression_start(struct ndr_pull *subndr, + struct ndr_pull **_comndr, + enum ndr_compression_alg compression_alg, + ssize_t decompressed_len) { struct ndr_push *ndrpush; struct ndr_pull *comndr; @@ -280,18 +217,34 @@ static enum ndr_err_code ndr_pull_compression_xpress(struct ndr_pull *subndr, uint32_t payload_offset; uint8_t *payload; bool last = false; + z_stream z; ndrpush = ndr_push_init_ctx(subndr, subndr->iconv_convenience); NDR_ERR_HAVE_NO_MEMORY(ndrpush); - while (!last) { - NDR_CHECK(ndr_pull_compression_xpress_chunk(subndr, ndrpush, &last)); + switch (compression_alg) { + case NDR_COMPRESSION_MSZIP: + ZERO_STRUCT(z); + while (!last) { + NDR_CHECK(ndr_pull_compression_mszip_chunk(subndr, ndrpush, &z, &last)); + } + break; + + case NDR_COMPRESSION_XPRESS: + while (!last) { + NDR_CHECK(ndr_pull_compression_xpress_chunk(subndr, ndrpush, &last)); + } + break; + + default: + return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad compression algorithm %d (PULL)", + compression_alg); } uncompressed = ndr_push_blob(ndrpush); if (uncompressed.length != decompressed_len) { return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, - "Bad XPRESS uncompressed_len [%u] != [%u](0x%08X) (PULL)", + "Bad uncompressed_len [%u] != [%u](0x%08X) (PULL)", (int)uncompressed.length, (int)decompressed_len, (int)decompressed_len); @@ -344,33 +297,6 @@ static enum ndr_err_code ndr_pull_compression_xpress(struct ndr_pull *subndr, return NDR_ERR_SUCCESS; } -static enum ndr_err_code ndr_push_compression_xpress(struct ndr_push *subndr, - struct ndr_push *comndr) -{ - return ndr_push_error(subndr, NDR_ERR_COMPRESSION, "XPRESS compression is not supported yet (PUSH)"); -} - -/* - handle compressed subcontext buffers, which in midl land are user-marshalled, but - we use magic in pidl to make them easier to cope with -*/ -enum ndr_err_code ndr_pull_compression_start(struct ndr_pull *subndr, - struct ndr_pull **_comndr, - enum ndr_compression_alg compression_alg, - ssize_t decompressed_len) -{ - switch (compression_alg) { - case NDR_COMPRESSION_MSZIP: - return ndr_pull_compression_mszip(subndr, _comndr, decompressed_len); - case NDR_COMPRESSION_XPRESS: - return ndr_pull_compression_xpress(subndr, _comndr, decompressed_len); - default: - return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, "Bad compression algorithm %d (PULL)", - compression_alg); - } - return NDR_ERR_SUCCESS; -} - enum ndr_err_code ndr_pull_compression_end(struct ndr_pull *subndr, struct ndr_pull *comndr, enum ndr_compression_alg compression_alg, -- cgit From fbeb6d7801ab7dae46a4e255044bf849953a179c Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 19 Aug 2008 10:33:03 +0200 Subject: ndr_compression: remove the type serialization handling from the compression layer metze (This used to be commit 70a7b1f6c2e359102467ea270c2bb1efe736f64a) --- source4/librpc/ndr/ndr_compression.c | 36 ------------------------------------ 1 file changed, 36 deletions(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index ad8dda1f6e..f6de0a1319 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -212,10 +212,6 @@ enum ndr_err_code ndr_pull_compression_start(struct ndr_pull *subndr, struct ndr_push *ndrpush; struct ndr_pull *comndr; DATA_BLOB uncompressed; - uint32_t payload_header[4]; - uint32_t payload_size; - uint32_t payload_offset; - uint8_t *payload; bool last = false; z_stream z; @@ -261,38 +257,6 @@ enum ndr_err_code ndr_pull_compression_start(struct ndr_pull *subndr, comndr->iconv_convenience = talloc_reference(comndr, subndr->iconv_convenience); - NDR_CHECK(ndr_pull_uint32(comndr, NDR_SCALARS, &payload_header[0])); - NDR_CHECK(ndr_pull_uint32(comndr, NDR_SCALARS, &payload_header[1])); - NDR_CHECK(ndr_pull_uint32(comndr, NDR_SCALARS, &payload_header[2])); - NDR_CHECK(ndr_pull_uint32(comndr, NDR_SCALARS, &payload_header[3])); - - if (payload_header[0] != 0x00081001) { - return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, - "Bad XPRESS payload_header[0] [0x%08X] != [0x00081001] (PULL)", - payload_header[0]); - } - if (payload_header[1] != 0xCCCCCCCC) { - return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, - "Bad XPRESS payload_header[1] [0x%08X] != [0xCCCCCCCC] (PULL)", - payload_header[1]); - } - - payload_size = payload_header[2]; - - if (payload_header[3] != 0x00000000) { - return ndr_pull_error(subndr, NDR_ERR_COMPRESSION, - "Bad XPRESS payload_header[3] [0x%08X] != [0x00000000] (PULL)", - payload_header[3]); - } - - payload_offset = comndr->offset; - NDR_CHECK(ndr_pull_advance(comndr, payload_size)); - payload = comndr->data + payload_offset; - - comndr->data = payload; - comndr->data_size = payload_size; - comndr->offset = 0; - *_comndr = comndr; return NDR_ERR_SUCCESS; } -- cgit From 2d2e7f6c4881ecbf79dd9277e1d31a4ef91b751c Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 7 Aug 2008 16:26:45 +0000 Subject: ndr_compression: add common parts of ndr compression metze (This used to be commit 9fe466f84afcbd64c9bbfe0f9ea6c1933acb07fe) --- source4/librpc/ndr/ndr_compression.c | 67 ++++++++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 15 deletions(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index f6de0a1319..3b38c6b913 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -145,10 +145,12 @@ static enum ndr_err_code ndr_pull_compression_mszip_chunk(struct ndr_pull *ndrpu return NDR_ERR_SUCCESS; } -static enum ndr_err_code ndr_push_compression_mszip(struct ndr_push *subndr, - struct ndr_push *comndr) +static enum ndr_err_code ndr_push_compression_mszip_chunk(struct ndr_push *ndrpush, + struct ndr_pull *ndrpull, + z_stream *z, + bool *last) { - return ndr_push_error(subndr, NDR_ERR_COMPRESSION, "Sorry MSZIP compression is not supported yet (PUSH)"); + return ndr_push_error(ndrpush, NDR_ERR_COMPRESSION, "MSZIP compression is not supported yet (PUSH)"); } static enum ndr_err_code ndr_pull_compression_xpress_chunk(struct ndr_pull *ndrpull, @@ -194,10 +196,11 @@ static enum ndr_err_code ndr_pull_compression_xpress_chunk(struct ndr_pull *ndrp return NDR_ERR_SUCCESS; } -static enum ndr_err_code ndr_push_compression_xpress(struct ndr_push *subndr, - struct ndr_push *comndr) +static enum ndr_err_code ndr_push_compression_xpress_chunk(struct ndr_push *ndrpush, + struct ndr_pull *ndrpull, + bool *last) { - return ndr_push_error(subndr, NDR_ERR_COMPRESSION, "XPRESS compression is not supported yet (PUSH)"); + return ndr_push_error(ndrpush, NDR_ERR_COMPRESSION, "XPRESS compression is not supported yet (PUSH)"); } /* @@ -273,17 +276,27 @@ enum ndr_err_code ndr_pull_compression_end(struct ndr_pull *subndr, push a compressed subcontext */ enum ndr_err_code ndr_push_compression_start(struct ndr_push *subndr, - struct ndr_push **_comndr, + struct ndr_push **_uncomndr, enum ndr_compression_alg compression_alg, ssize_t decompressed_len) { - struct ndr_push *comndr; + struct ndr_push *uncomndr; - comndr = ndr_push_init_ctx(subndr, subndr->iconv_convenience); - NDR_ERR_HAVE_NO_MEMORY(comndr); - comndr->flags = subndr->flags; + switch (compression_alg) { + case NDR_COMPRESSION_MSZIP: + case NDR_COMPRESSION_XPRESS: + break; + default: + return ndr_push_error(subndr, NDR_ERR_COMPRESSION, + "Bad compression algorithm %d (PUSH)", + compression_alg); + } - *_comndr = comndr; + uncomndr = ndr_push_init_ctx(subndr, subndr->iconv_convenience); + NDR_ERR_HAVE_NO_MEMORY(uncomndr); + uncomndr->flags = subndr->flags; + + *_uncomndr = uncomndr; return NDR_ERR_SUCCESS; } @@ -291,18 +304,42 @@ enum ndr_err_code ndr_push_compression_start(struct ndr_push *subndr, push a compressed subcontext */ enum ndr_err_code ndr_push_compression_end(struct ndr_push *subndr, - struct ndr_push *comndr, + struct ndr_push *uncomndr, enum ndr_compression_alg compression_alg, ssize_t decompressed_len) { + struct ndr_pull *ndrpull; + bool last = false; + z_stream z; + + ndrpull = talloc_zero(uncomndr, struct ndr_pull); + NDR_ERR_HAVE_NO_MEMORY(ndrpull); + ndrpull->flags = uncomndr->flags; + ndrpull->data = uncomndr->data; + ndrpull->data_size = uncomndr->offset; + ndrpull->offset = 0; + + ndrpull->iconv_convenience = talloc_reference(ndrpull, subndr->iconv_convenience); + switch (compression_alg) { case NDR_COMPRESSION_MSZIP: - return ndr_push_compression_mszip(subndr, comndr); + ZERO_STRUCT(z); + while (!last) { + NDR_CHECK(ndr_push_compression_mszip_chunk(subndr, ndrpull, &z, &last)); + } + break; + case NDR_COMPRESSION_XPRESS: - return ndr_push_compression_xpress(subndr, comndr); + while (!last) { + NDR_CHECK(ndr_push_compression_xpress_chunk(subndr, ndrpull, &last)); + } + break; + default: return ndr_push_error(subndr, NDR_ERR_COMPRESSION, "Bad compression algorithm %d (PUSH)", compression_alg); } + + talloc_free(uncomndr); return NDR_ERR_SUCCESS; } -- cgit From 9d3add9b9f9fff2163bd04cfc5d8919ca053ef55 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 20 Aug 2008 15:48:00 +0200 Subject: ndr_compression: implement mszip compression based on deflate() The output doesn't match the output from windows servers, but it's a start... metze (This used to be commit 8a2f9688275aa150b739b5525e738df15c5e25cc) --- source4/librpc/ndr/ndr_compression.c | 99 +++++++++++++++++++++++++++++++++++- 1 file changed, 98 insertions(+), 1 deletion(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index 3b38c6b913..37f95bb1b6 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -150,7 +150,104 @@ static enum ndr_err_code ndr_push_compression_mszip_chunk(struct ndr_push *ndrpu z_stream *z, bool *last) { - return ndr_push_error(ndrpush, NDR_ERR_COMPRESSION, "MSZIP compression is not supported yet (PUSH)"); + DATA_BLOB comp_chunk; + uint32_t comp_chunk_size; + uint32_t comp_chunk_size_offset; + DATA_BLOB plain_chunk; + uint32_t plain_chunk_size; + uint32_t plain_chunk_offset; + uint32_t max_plain_size = 0x00008000; + uint32_t max_comp_size = 0x00008000 + 2 + 12 /*TODO: what value do we really need here?*/; + uint32_t tmp_offset; + int z_ret; + + plain_chunk_size = MIN(max_plain_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; + + if (plain_chunk_size < max_plain_size) { + *last = true; + } + + NDR_CHECK(ndr_push_uint32(ndrpush, NDR_SCALARS, plain_chunk_size)); + comp_chunk_size_offset = ndrpush->offset; + NDR_CHECK(ndr_push_uint32(ndrpush, NDR_SCALARS, 0xFEFEFEFE)); + + NDR_CHECK(ndr_push_expand(ndrpush, max_comp_size)); + + comp_chunk.data = ndrpush->data + ndrpush->offset; + comp_chunk.length = max_comp_size; + + /* CK = Chris Kirmse, official Microsoft purloiner */ + comp_chunk.data[0] = 'C'; + comp_chunk.data[1] = 'K'; + + z->next_in = plain_chunk.data; + z->avail_in = plain_chunk.length; + z->total_in = 0; + + z->next_out = comp_chunk.data + 2; + z->avail_out = comp_chunk.length - 2; + z->total_out = 0; + + if (!z->opaque) { + /* the first time we need to intialize completely */ + z->zalloc = ndr_zlib_alloc; + z->zfree = ndr_zlib_free; + z->opaque = ndrpull; + + /* TODO: find how to trigger the same parameters windows uses */ + z_ret = deflateInit2(z, + Z_DEFAULT_COMPRESSION, + Z_DEFLATED, + -15, + 9, + Z_DEFAULT_STRATEGY); + if (z_ret != Z_OK) { + return ndr_push_error(ndrpush, NDR_ERR_COMPRESSION, + "Bad deflateInit2 error %s(%d) (PUSH)", + zError(z_ret), z_ret); + + } + } else { + /* TODO: keep the window */ + z_ret = deflateReset(z); + if (z_ret != Z_OK) { + return ndr_push_error(ndrpush, NDR_ERR_COMPRESSION, + "Bad delateReset2 error %s(%d) (PUSH)", + zError(z_ret), z_ret); + } + } + + /* call deflate untill we get Z_STREAM_END or an error */ + while (true) { + z_ret = deflate(z, Z_FINISH); + if (z_ret != Z_OK) break; + } + if (z_ret != Z_STREAM_END) { + return ndr_push_error(ndrpush, NDR_ERR_COMPRESSION, + "Bad delate(Z_BLOCK) error %s(%d) (PUSH)", + zError(z_ret), z_ret); + } + + if (z->avail_in) { + return ndr_push_error(ndrpush, NDR_ERR_COMPRESSION, + "MSZIP not all avail_in[%u] bytes consumed (PUSH)", + z->avail_in); + } + + comp_chunk_size = 2 + z->total_out; + + tmp_offset = ndrpush->offset; + ndrpush->offset = comp_chunk_size_offset; + NDR_CHECK(ndr_push_uint32(ndrpush, NDR_SCALARS, comp_chunk_size)); + ndrpush->offset = tmp_offset; + + ndrpush->offset += comp_chunk_size; + return NDR_ERR_SUCCESS; } static enum ndr_err_code ndr_pull_compression_xpress_chunk(struct ndr_pull *ndrpull, -- cgit From 79cc502e5d065a9a700f46d004873b0a6fac1130 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 5 Sep 2008 20:18:07 +0200 Subject: ndr_compression: use inflateReset() and inflateSetDictionary() instead of inflateReset2() Now we can use an unmodified system zlib-1.2.3 metze (This used to be commit d68e36b485239cbaf99a6dce3f3bf52b4abcd06d) --- source4/librpc/ndr/ndr_compression.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index 37f95bb1b6..0b33d40c24 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -104,13 +104,6 @@ static enum ndr_err_code ndr_pull_compression_mszip_chunk(struct ndr_pull *ndrpu zError(z_ret), z_ret); } - } else { - z_ret = inflateReset2(z, Z_RESET_KEEP_WINDOW); - if (z_ret != Z_OK) { - return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, - "Bad inflateReset2 error %s(%d) (PULL)", - zError(z_ret), z_ret); - } } /* call inflate untill we get Z_STREAM_END or an error */ @@ -142,6 +135,20 @@ static enum ndr_err_code ndr_pull_compression_mszip_chunk(struct ndr_pull *ndrpu *last = true; } + z_ret = inflateReset(z); + if (z_ret != Z_OK) { + return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, + "Bad inflateReset error %s(%d) (PULL)", + zError(z_ret), z_ret); + } + + z_ret = inflateSetDictionary(z, plain_chunk.data, plain_chunk.length); + if (z_ret != Z_OK) { + return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, + "Bad inflateSetDictionary error %s(%d) (PULL)", + zError(z_ret), z_ret); + } + return NDR_ERR_SUCCESS; } -- cgit From 3b8c11b4d9f967a907c89797279d164b423cc9ed Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sat, 6 Sep 2008 16:16:00 +0200 Subject: ndr_compression: use deflateReset() together with defalteSetDictionary() metze (This used to be commit dcc57512b030995d9b186c7a6cb3b304d5680867) --- source4/librpc/ndr/ndr_compression.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index 0b33d40c24..a92877ccc2 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -219,14 +219,6 @@ static enum ndr_err_code ndr_push_compression_mszip_chunk(struct ndr_push *ndrpu zError(z_ret), z_ret); } - } else { - /* TODO: keep the window */ - z_ret = deflateReset(z); - if (z_ret != Z_OK) { - return ndr_push_error(ndrpush, NDR_ERR_COMPRESSION, - "Bad delateReset2 error %s(%d) (PUSH)", - zError(z_ret), z_ret); - } } /* call deflate untill we get Z_STREAM_END or an error */ @@ -248,11 +240,28 @@ static enum ndr_err_code ndr_push_compression_mszip_chunk(struct ndr_push *ndrpu comp_chunk_size = 2 + z->total_out; + z_ret = deflateReset(z); + if (z_ret != Z_OK) { + return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, + "Bad deflateReset error %s(%d) (PULL)", + zError(z_ret), z_ret); + } + + z_ret = deflateSetDictionary(z, plain_chunk.data, plain_chunk.length); + if (z_ret != Z_OK) { + return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, + "Bad deflateSetDictionary error %s(%d) (PULL)", + zError(z_ret), z_ret); + } + tmp_offset = ndrpush->offset; ndrpush->offset = comp_chunk_size_offset; NDR_CHECK(ndr_push_uint32(ndrpush, NDR_SCALARS, comp_chunk_size)); ndrpush->offset = tmp_offset; + DEBUG(10,("MSZIP comp plain_chunk_size: %08X (%u) comp_chunk_size: %08X (%u)\n", + plain_chunk.length, plain_chunk.length, comp_chunk_size, comp_chunk_size)); + ndrpush->offset += comp_chunk_size; return NDR_ERR_SUCCESS; } -- cgit From 253e222831d5fc3305363cb186022df5f4f45d14 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sat, 6 Sep 2008 10:55:04 +0200 Subject: ndr_compression: change debug levels metze (This used to be commit 83446e22dd1eda958ef62bbe998da0a47b9ff8ef) --- source4/librpc/ndr/ndr_compression.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index a92877ccc2..5939c3838a 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -57,8 +57,8 @@ static enum ndr_err_code ndr_pull_compression_mszip_chunk(struct ndr_pull *ndrpu NDR_CHECK(ndr_pull_uint32(ndrpull, NDR_SCALARS, &comp_chunk_size)); - DEBUG(10,("MSZIP plain_chunk_size: %08X (%u) comp_chunk_size: %08X (%u)\n", - plain_chunk_size, plain_chunk_size, comp_chunk_size, comp_chunk_size)); + DEBUG(9,("MSZIP plain_chunk_size: %08X (%u) comp_chunk_size: %08X (%u)\n", + plain_chunk_size, plain_chunk_size, comp_chunk_size, comp_chunk_size)); comp_chunk_offset = ndrpull->offset; NDR_CHECK(ndr_pull_advance(ndrpull, comp_chunk_size)); @@ -259,8 +259,8 @@ static enum ndr_err_code ndr_push_compression_mszip_chunk(struct ndr_push *ndrpu NDR_CHECK(ndr_push_uint32(ndrpush, NDR_SCALARS, comp_chunk_size)); ndrpush->offset = tmp_offset; - DEBUG(10,("MSZIP comp plain_chunk_size: %08X (%u) comp_chunk_size: %08X (%u)\n", - plain_chunk.length, plain_chunk.length, comp_chunk_size, comp_chunk_size)); + DEBUG(9,("MSZIP comp plain_chunk_size: %08X (%u) comp_chunk_size: %08X (%u)\n", + plain_chunk.length, plain_chunk.length, comp_chunk_size, comp_chunk_size)); ndrpush->offset += comp_chunk_size; return NDR_ERR_SUCCESS; @@ -295,8 +295,8 @@ static enum ndr_err_code ndr_pull_compression_xpress_chunk(struct ndr_pull *ndrp plain_chunk.length = plain_chunk_size; plain_chunk.data = ndrpush->data + plain_chunk_offset; - DEBUG(10,("XPRESS plain_chunk_size: %08X (%u) comp_chunk_size: %08X (%u)\n", - plain_chunk_size, plain_chunk_size, comp_chunk_size, comp_chunk_size)); + DEBUG(9,("XPRESS plain_chunk_size: %08X (%u) comp_chunk_size: %08X (%u)\n", + plain_chunk_size, plain_chunk_size, comp_chunk_size, comp_chunk_size)); /* Uncompressing the buffer using LZ Xpress algorithm */ lzxpress_decompress(&comp_chunk, &plain_chunk); -- cgit From 6e0335f8648f5ca2869ad1dd16c1e2aec20bd282 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sun, 7 Sep 2008 18:52:29 +0200 Subject: ndr_compression: fix the build after lzxpress_decompress() prototype change metze (This used to be commit b36056aac3f55587d2b3e7b66feea8173dbc67f0) --- source4/librpc/ndr/ndr_compression.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index 5939c3838a..aa9f907eed 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -276,6 +276,7 @@ static enum ndr_err_code ndr_pull_compression_xpress_chunk(struct ndr_pull *ndrp uint32_t plain_chunk_offset; uint32_t comp_chunk_size; uint32_t plain_chunk_size; + ssize_t ret; NDR_CHECK(ndr_pull_uint32(ndrpull, NDR_SCALARS, &plain_chunk_size)); if (plain_chunk_size > 0x00010000) { @@ -299,7 +300,16 @@ static enum ndr_err_code ndr_pull_compression_xpress_chunk(struct ndr_pull *ndrp plain_chunk_size, plain_chunk_size, comp_chunk_size, comp_chunk_size)); /* Uncompressing the buffer using LZ Xpress algorithm */ - lzxpress_decompress(&comp_chunk, &plain_chunk); + ret = lzxpress_decompress(comp_chunk.data, + comp_chunk.length, + plain_chunk.data, + plain_chunk.length); + if (ret < 0) { + return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, + "XPRESS lzxpress_decompress() returned %d\n", + ret); + } + plain_chunk.length = ret; if ((plain_chunk_size < 0x00010000) || (ndrpull->offset+4 >= ndrpull->data_size)) { /* this is the last chunk */ -- cgit From 1efff73068e933dd0b4cc81ff901f6010fda9a6b Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 20 Aug 2008 22:12:51 +0200 Subject: ndr_compression: add XPRESS compression support metze (This used to be commit 1432a96d37e367d9d97d48b69c6f16351a9ad066) --- source4/librpc/ndr/ndr_compression.c | 50 +++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) (limited to 'source4/librpc/ndr/ndr_compression.c') diff --git a/source4/librpc/ndr/ndr_compression.c b/source4/librpc/ndr/ndr_compression.c index aa9f907eed..92c5b049df 100644 --- a/source4/librpc/ndr/ndr_compression.c +++ b/source4/librpc/ndr/ndr_compression.c @@ -323,7 +323,55 @@ static enum ndr_err_code ndr_push_compression_xpress_chunk(struct ndr_push *ndrp struct ndr_pull *ndrpull, bool *last) { - return ndr_push_error(ndrpush, NDR_ERR_COMPRESSION, "XPRESS compression is not supported yet (PUSH)"); + DATA_BLOB comp_chunk; + uint32_t comp_chunk_size_offset; + DATA_BLOB plain_chunk; + uint32_t plain_chunk_size; + uint32_t plain_chunk_offset; + uint32_t max_plain_size = 0x00010000; + uint32_t max_comp_size = 0x00020000 + 2; /* TODO: use the correct value here */ + uint32_t tmp_offset; + ssize_t ret; + + plain_chunk_size = MIN(max_plain_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; + + if (plain_chunk_size < max_plain_size) { + *last = true; + } + + NDR_CHECK(ndr_push_uint32(ndrpush, NDR_SCALARS, plain_chunk_size)); + comp_chunk_size_offset = ndrpush->offset; + NDR_CHECK(ndr_push_uint32(ndrpush, NDR_SCALARS, 0xFEFEFEFE)); + + NDR_CHECK(ndr_push_expand(ndrpush, max_comp_size)); + + comp_chunk.data = ndrpush->data + ndrpush->offset; + comp_chunk.length = max_comp_size; + + /* Compressing the buffer using LZ Xpress algorithm */ + ret = lzxpress_compress(plain_chunk.data, + plain_chunk.length, + comp_chunk.data, + comp_chunk.length); + if (ret < 0) { + return ndr_pull_error(ndrpull, NDR_ERR_COMPRESSION, + "XPRESS lzxpress_compress() returned %d\n", + ret); + } + comp_chunk.length = ret; + + tmp_offset = ndrpush->offset; + ndrpush->offset = comp_chunk_size_offset; + NDR_CHECK(ndr_push_uint32(ndrpush, NDR_SCALARS, comp_chunk.length)); + ndrpush->offset = tmp_offset; + + ndrpush->offset += comp_chunk.length; + return NDR_ERR_SUCCESS; } /* -- cgit