mirror of
https://github.com/samba-team/samba.git
synced 2025-03-08 04:58:40 +03:00
Merge branch 'v4-0-test' of ssh://git.samba.org/data/git/samba into 4-0-abartlet
(This used to be commit 27d07df301d60e49d36efd003f2fd2305c83c3fe)
This commit is contained in:
commit
aef684da31
@ -1,6 +1,6 @@
|
||||
[SUBSYSTEM::LIBCOMPRESSION]
|
||||
[SUBSYSTEM::LZXPRESS]
|
||||
|
||||
LIBCOMPRESSION_OBJ_FILES = $(libcompressionsrcdir)/mszip.o
|
||||
LZXPRESS_OBJ_FILES = $(libcompressionsrcdir)/lzxpress.o
|
||||
|
||||
[SUBSYSTEM::GENCACHE]
|
||||
PRIVATE_DEPENDENCIES = TDB_WRAP
|
||||
|
144
source4/lib/compression/lzxpress.c
Normal file
144
source4/lib/compression/lzxpress.c
Normal file
@ -0,0 +1,144 @@
|
||||
/*
|
||||
* Copyright (C) Matthieu Suiche 2008
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the author nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "replace.h"
|
||||
#include "lzxpress.h"
|
||||
|
||||
|
||||
#define __BUF_POS_CONST(buf,ofs)(((const uint8_t *)buf)+(ofs))
|
||||
#define __PULL_BYTE(buf,ofs) \
|
||||
((uint8_t)((*__BUF_POS_CONST(buf,ofs)) & 0xFF))
|
||||
|
||||
#ifndef PULL_LE_UINT16
|
||||
#define PULL_LE_UINT16(buf,ofs) ((uint16_t)( \
|
||||
((uint16_t)(((uint16_t)(__PULL_BYTE(buf,(ofs)+0))) << 0)) | \
|
||||
((uint16_t)(((uint16_t)(__PULL_BYTE(buf,(ofs)+1))) << 8)) \
|
||||
))
|
||||
#endif
|
||||
|
||||
#ifndef PULL_LE_UINT32
|
||||
#define PULL_LE_UINT32(buf,ofs) ((uint32_t)( \
|
||||
((uint32_t)(((uint32_t)(__PULL_BYTE(buf,(ofs)+0))) << 0)) | \
|
||||
((uint32_t)(((uint32_t)(__PULL_BYTE(buf,(ofs)+1))) << 8)) | \
|
||||
((uint32_t)(((uint32_t)(__PULL_BYTE(buf,(ofs)+2))) << 16)) | \
|
||||
((uint32_t)(((uint32_t)(__PULL_BYTE(buf,(ofs)+3))) << 24)) \
|
||||
))
|
||||
#endif
|
||||
|
||||
static uint32_t xpress_decompress(uint8_t *input,
|
||||
uint32_t input_size,
|
||||
uint8_t *output,
|
||||
uint32_t output_size)
|
||||
{
|
||||
uint32_t output_index, input_index;
|
||||
uint32_t indicator, indicator_bit;
|
||||
uint32_t length;
|
||||
uint32_t offset;
|
||||
uint32_t nibble_index;
|
||||
|
||||
output_index = 0;
|
||||
input_index = 0;
|
||||
indicator = 0;
|
||||
indicator_bit = 0;
|
||||
length = 0;
|
||||
offset = 0;
|
||||
nibble_index = 0;
|
||||
|
||||
do {
|
||||
if (indicator_bit == 0) {
|
||||
indicator = PULL_LE_UINT32(input, input_index);
|
||||
input_index += sizeof(uint32_t);
|
||||
indicator_bit = 32;
|
||||
}
|
||||
indicator_bit--;
|
||||
|
||||
/*
|
||||
* check whether the bit specified by indicator_bit is set or not
|
||||
* set in indicator. For example, if indicator_bit has value 4
|
||||
* check whether the 4th bit of the value in indicator is set
|
||||
*/
|
||||
if (((indicator >> indicator_bit) & 1) == 0) {
|
||||
output[output_index] = input[input_index];
|
||||
input_index += sizeof(uint8_t);
|
||||
output_index += sizeof(uint8_t);
|
||||
} else {
|
||||
length = PULL_LE_UINT16(input, input_index);
|
||||
input_index += sizeof(uint16_t);
|
||||
offset = length / 8;
|
||||
length = length % 8;
|
||||
|
||||
if (length == 7) {
|
||||
if (nibble_index == 0) {
|
||||
nibble_index = input_index;
|
||||
length = input[input_index] % 16;
|
||||
input_index += sizeof(uint8_t);
|
||||
} else {
|
||||
length = input[nibble_index] / 16;
|
||||
nibble_index = 0;
|
||||
}
|
||||
|
||||
if (length == 15) {
|
||||
length = input[input_index];
|
||||
input_index += sizeof(uint8_t);
|
||||
if (length == 255) {
|
||||
length = PULL_LE_UINT16(input, input_index);
|
||||
input_index += sizeof(uint16_t);
|
||||
length -= (15 + 7);
|
||||
}
|
||||
length += 15;
|
||||
}
|
||||
length += 7;
|
||||
}
|
||||
|
||||
length += 3;
|
||||
|
||||
do {
|
||||
if (output_index >= output_size) break;
|
||||
output[output_index] = output[output_index - offset - 1];
|
||||
output_index += sizeof(uint8_t);
|
||||
length -= sizeof(uint8_t);
|
||||
} while (length != 0);
|
||||
}
|
||||
|
||||
} while ((output_index < output_size) && (input_index < input_size));
|
||||
|
||||
return output_index;
|
||||
}
|
||||
|
||||
uint32_t lzxpress_decompress(DATA_BLOB *inbuf,
|
||||
DATA_BLOB *outbuf)
|
||||
{
|
||||
return xpress_decompress(inbuf->data, inbuf->length, outbuf->data, outbuf->length);
|
||||
}
|
43
source4/lib/compression/lzxpress.h
Normal file
43
source4/lib/compression/lzxpress.h
Normal file
@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Copyright (C) Matthieu Suiche 2008
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of the author nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _LZXPRESS_H
|
||||
#define _LZXPRESS_H
|
||||
|
||||
#define XPRESS_BLOCK_SIZE 0x10000
|
||||
|
||||
uint32_t lzxpress_decompress(DATA_BLOB *inbuf,
|
||||
DATA_BLOB *outbuf);
|
||||
|
||||
#endif /* _LZXPRESS_H */
|
@ -5,8 +5,7 @@
|
||||
|
||||
/* @(#) $Id$ */
|
||||
|
||||
#define ZLIB_INTERNAL
|
||||
#include "zlib.h"
|
||||
#include "zutil.h"
|
||||
|
||||
#define BASE 65521UL /* largest prime smaller than 65536 */
|
||||
#define NMAX 5552
|
||||
|
@ -5,8 +5,7 @@
|
||||
|
||||
/* @(#) $Id$ */
|
||||
|
||||
#define ZLIB_INTERNAL
|
||||
#include "zlib.h"
|
||||
#include "zutil.h"
|
||||
|
||||
/* ===========================================================================
|
||||
Compresses the source buffer into the destination buffer. The level
|
||||
@ -29,7 +28,7 @@ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
|
||||
z_stream stream;
|
||||
int err;
|
||||
|
||||
stream.next_in = (Bytef*)source;
|
||||
stream.next_in = source;
|
||||
stream.avail_in = (uInt)sourceLen;
|
||||
#ifdef MAXSEG_64K
|
||||
/* Check for source > 64K on 16-bit machine: */
|
||||
|
@ -11,6 +11,8 @@
|
||||
|
||||
/* @(#) $Id$ */
|
||||
|
||||
#include "zutil.h" /* for STDC and FAR definitions */
|
||||
|
||||
/*
|
||||
Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore
|
||||
protection on the static variables used to control the first-use generation
|
||||
@ -26,8 +28,6 @@
|
||||
# endif /* !DYNAMIC_CRC_TABLE */
|
||||
#endif /* MAKECRCH */
|
||||
|
||||
#include "zutil.h" /* for STDC and FAR definitions */
|
||||
|
||||
#define local static
|
||||
|
||||
/* Find a four-byte integer type for crc32_little() and crc32_big(). */
|
||||
|
@ -154,9 +154,6 @@ local const config configuration_table[10] = {
|
||||
* meaning.
|
||||
*/
|
||||
|
||||
#define EQUAL 0
|
||||
/* result of memcmp for equal strings */
|
||||
|
||||
#ifndef NO_DUMMY_DECL
|
||||
struct static_tree_desc_s {int dummy;}; /* for buggy compilers */
|
||||
#endif
|
||||
@ -297,7 +294,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
|
||||
if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
|
||||
s->pending_buf == Z_NULL) {
|
||||
s->status = FINISH_STATE;
|
||||
strm->msg = (char*)ERR_MSG(Z_MEM_ERROR);
|
||||
strm->msg = ERR_MSG(Z_MEM_ERROR);
|
||||
deflateEnd (strm);
|
||||
return Z_MEM_ERROR;
|
||||
}
|
||||
@ -1226,6 +1223,9 @@ local uInt longest_match_fast(s, cur_match)
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
#define EQUAL 0
|
||||
/* result of memcmp for equal strings */
|
||||
|
||||
/* ===========================================================================
|
||||
* Check that the match at match_start is indeed a match.
|
||||
*/
|
||||
|
@ -7,8 +7,6 @@
|
||||
|
||||
/* @(#) $Id$ */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "zutil.h"
|
||||
|
||||
#ifdef NO_DEFLATE /* for compatibility with old definition */
|
||||
@ -46,7 +44,7 @@ extern void free OF((voidpf ptr));
|
||||
static int const gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */
|
||||
|
||||
/* gzip flag byte */
|
||||
#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */
|
||||
/*#define ASCII_FLAG 0x01 *//* bit 0 set: file probably ascii text */
|
||||
#define HEAD_CRC 0x02 /* bit 1 set: header CRC present */
|
||||
#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */
|
||||
#define ORIG_NAME 0x08 /* bit 3 set: original file name present */
|
||||
@ -98,7 +96,7 @@ local gzFile gz_open (path, mode, fd)
|
||||
int err;
|
||||
int level = Z_DEFAULT_COMPRESSION; /* compression level */
|
||||
int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */
|
||||
char *p = (char*)mode;
|
||||
const char *p = mode;
|
||||
gz_stream *s;
|
||||
char fmode[80]; /* copy of mode, without the compression level */
|
||||
char *m = fmode;
|
||||
@ -565,7 +563,7 @@ int ZEXPORT gzwrite (file, buf, len)
|
||||
|
||||
if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR;
|
||||
|
||||
s->stream.next_in = (Bytef*)buf;
|
||||
s->stream.next_in = (const Bytef*)buf;
|
||||
s->stream.avail_in = len;
|
||||
|
||||
while (s->stream.avail_in != 0) {
|
||||
@ -694,7 +692,7 @@ int ZEXPORT gzputs(file, s)
|
||||
gzFile file;
|
||||
const char *s;
|
||||
{
|
||||
return gzwrite(file, (char*)s, (unsigned)strlen(s));
|
||||
return gzwrite(file, (voidpc)s, (unsigned)strlen(s));
|
||||
}
|
||||
|
||||
|
||||
@ -988,7 +986,7 @@ const char * ZEXPORT gzerror (file, errnum)
|
||||
gzFile file;
|
||||
int *errnum;
|
||||
{
|
||||
char *m;
|
||||
const char *m;
|
||||
gz_stream *s = (gz_stream*)file;
|
||||
|
||||
if (s == NULL) {
|
||||
@ -998,9 +996,9 @@ const char * ZEXPORT gzerror (file, errnum)
|
||||
*errnum = s->z_err;
|
||||
if (*errnum == Z_OK) return (const char*)"";
|
||||
|
||||
m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg);
|
||||
m = (*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg);
|
||||
|
||||
if (m == NULL || *m == '\0') m = (char*)ERR_MSG(s->z_err);
|
||||
if (m == NULL || *m == '\0') m = ERR_MSG(s->z_err);
|
||||
|
||||
TRYFREE(s->msg);
|
||||
s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3);
|
||||
|
@ -246,7 +246,7 @@ out_func out;
|
||||
void FAR *out_desc;
|
||||
{
|
||||
struct inflate_state FAR *state;
|
||||
unsigned char FAR *next; /* next input */
|
||||
unsigned const char FAR *next; /* next input */
|
||||
unsigned char FAR *put; /* next output */
|
||||
unsigned have, left; /* available input and output */
|
||||
unsigned long hold; /* bit buffer */
|
||||
@ -308,7 +308,7 @@ void FAR *out_desc;
|
||||
state->mode = TABLE;
|
||||
break;
|
||||
case 3:
|
||||
strm->msg = (char *)"invalid block type";
|
||||
strm->msg = "invalid block type";
|
||||
state->mode = BAD;
|
||||
}
|
||||
DROPBITS(2);
|
||||
@ -319,7 +319,7 @@ void FAR *out_desc;
|
||||
BYTEBITS(); /* go to byte boundary */
|
||||
NEEDBITS(32);
|
||||
if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
|
||||
strm->msg = (char *)"invalid stored block lengths";
|
||||
strm->msg = "invalid stored block lengths";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -357,7 +357,7 @@ void FAR *out_desc;
|
||||
DROPBITS(4);
|
||||
#ifndef PKZIP_BUG_WORKAROUND
|
||||
if (state->nlen > 286 || state->ndist > 30) {
|
||||
strm->msg = (char *)"too many length or distance symbols";
|
||||
strm->msg = "too many length or distance symbols";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -379,7 +379,7 @@ void FAR *out_desc;
|
||||
ret = inflate_table(CODES, state->lens, 19, &(state->next),
|
||||
&(state->lenbits), state->work);
|
||||
if (ret) {
|
||||
strm->msg = (char *)"invalid code lengths set";
|
||||
strm->msg = "invalid code lengths set";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -403,7 +403,7 @@ void FAR *out_desc;
|
||||
NEEDBITS(this.bits + 2);
|
||||
DROPBITS(this.bits);
|
||||
if (state->have == 0) {
|
||||
strm->msg = (char *)"invalid bit length repeat";
|
||||
strm->msg = "invalid bit length repeat";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -426,7 +426,7 @@ void FAR *out_desc;
|
||||
DROPBITS(7);
|
||||
}
|
||||
if (state->have + copy > state->nlen + state->ndist) {
|
||||
strm->msg = (char *)"invalid bit length repeat";
|
||||
strm->msg = "invalid bit length repeat";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -445,7 +445,7 @@ void FAR *out_desc;
|
||||
ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
|
||||
&(state->lenbits), state->work);
|
||||
if (ret) {
|
||||
strm->msg = (char *)"invalid literal/lengths set";
|
||||
strm->msg = "invalid literal/lengths set";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -454,7 +454,7 @@ void FAR *out_desc;
|
||||
ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
|
||||
&(state->next), &(state->distbits), state->work);
|
||||
if (ret) {
|
||||
strm->msg = (char *)"invalid distances set";
|
||||
strm->msg = "invalid distances set";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -512,7 +512,7 @@ void FAR *out_desc;
|
||||
|
||||
/* invalid code */
|
||||
if (this.op & 64) {
|
||||
strm->msg = (char *)"invalid literal/length code";
|
||||
strm->msg = "invalid literal/length code";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -544,7 +544,7 @@ void FAR *out_desc;
|
||||
}
|
||||
DROPBITS(this.bits);
|
||||
if (this.op & 64) {
|
||||
strm->msg = (char *)"invalid distance code";
|
||||
strm->msg = "invalid distance code";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -559,7 +559,7 @@ void FAR *out_desc;
|
||||
}
|
||||
if (state->offset > state->wsize - (state->whave < state->wsize ?
|
||||
left : 0)) {
|
||||
strm->msg = (char *)"invalid distance too far back";
|
||||
strm->msg = "invalid distance too far back";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
|
@ -69,8 +69,8 @@ z_streamp strm;
|
||||
unsigned start; /* inflate()'s starting value for strm->avail_out */
|
||||
{
|
||||
struct inflate_state FAR *state;
|
||||
unsigned char FAR *in; /* local strm->next_in */
|
||||
unsigned char FAR *last; /* while in < last, enough input available */
|
||||
unsigned const char FAR *in; /* local strm->next_in */
|
||||
unsigned const char FAR *last; /* while in < last, enough input available */
|
||||
unsigned char FAR *out; /* local strm->next_out */
|
||||
unsigned char FAR *beg; /* inflate()'s initial strm->next_out */
|
||||
unsigned char FAR *end; /* while out < end, enough space available */
|
||||
@ -187,7 +187,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
|
||||
if (dist > op) { /* see if copy from window */
|
||||
op = dist - op; /* distance back in window */
|
||||
if (op > whave) {
|
||||
strm->msg = (char *)"invalid distance too far back";
|
||||
strm->msg = "invalid distance too far back";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -263,7 +263,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
|
||||
goto dodist;
|
||||
}
|
||||
else {
|
||||
strm->msg = (char *)"invalid distance code";
|
||||
strm->msg = "invalid distance code";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -278,7 +278,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
|
||||
break;
|
||||
}
|
||||
else {
|
||||
strm->msg = (char *)"invalid literal/length code";
|
||||
strm->msg = "invalid literal/length code";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
|
@ -97,7 +97,7 @@ local int updatewindow OF((z_streamp strm, unsigned out));
|
||||
#ifdef BUILDFIXED
|
||||
void makefixed OF((void));
|
||||
#endif
|
||||
local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf,
|
||||
local unsigned syncsearch OF((unsigned FAR *have, unsigned const char FAR *buf,
|
||||
unsigned len));
|
||||
|
||||
int ZEXPORT inflateReset2(strm, flags)
|
||||
@ -565,7 +565,7 @@ z_streamp strm;
|
||||
int flush;
|
||||
{
|
||||
struct inflate_state FAR *state;
|
||||
unsigned char FAR *next; /* next input */
|
||||
unsigned const char FAR *next; /* next input */
|
||||
unsigned char FAR *put; /* next output */
|
||||
unsigned have, left; /* available input and output */
|
||||
unsigned long hold; /* bit buffer */
|
||||
@ -617,19 +617,19 @@ int flush;
|
||||
if (
|
||||
#endif
|
||||
((BITS(8) << 8) + (hold >> 8)) % 31) {
|
||||
strm->msg = (char *)"incorrect header check";
|
||||
strm->msg = "incorrect header check";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
if (BITS(4) != Z_DEFLATED) {
|
||||
strm->msg = (char *)"unknown compression method";
|
||||
strm->msg = "unknown compression method";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
DROPBITS(4);
|
||||
len = BITS(4) + 8;
|
||||
if (len > state->wbits) {
|
||||
strm->msg = (char *)"invalid window size";
|
||||
strm->msg = "invalid window size";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -644,12 +644,12 @@ int flush;
|
||||
NEEDBITS(16);
|
||||
state->flags = (int)(hold);
|
||||
if ((state->flags & 0xff) != Z_DEFLATED) {
|
||||
strm->msg = (char *)"unknown compression method";
|
||||
strm->msg = "unknown compression method";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
if (state->flags & 0xe000) {
|
||||
strm->msg = (char *)"unknown header flags set";
|
||||
strm->msg = "unknown header flags set";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -753,7 +753,7 @@ int flush;
|
||||
if (state->flags & 0x0200) {
|
||||
NEEDBITS(16);
|
||||
if (hold != (state->check & 0xffff)) {
|
||||
strm->msg = (char *)"header crc mismatch";
|
||||
strm->msg = "header crc mismatch";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -808,7 +808,7 @@ int flush;
|
||||
state->mode = TABLE;
|
||||
break;
|
||||
case 3:
|
||||
strm->msg = (char *)"invalid block type";
|
||||
strm->msg = "invalid block type";
|
||||
state->mode = BAD;
|
||||
}
|
||||
DROPBITS(2);
|
||||
@ -817,7 +817,7 @@ int flush;
|
||||
BYTEBITS(); /* go to byte boundary */
|
||||
NEEDBITS(32);
|
||||
if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
|
||||
strm->msg = (char *)"invalid stored block lengths";
|
||||
strm->msg = "invalid stored block lengths";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -853,7 +853,7 @@ int flush;
|
||||
DROPBITS(4);
|
||||
#ifndef PKZIP_BUG_WORKAROUND
|
||||
if (state->nlen > 286 || state->ndist > 30) {
|
||||
strm->msg = (char *)"too many length or distance symbols";
|
||||
strm->msg = "too many length or distance symbols";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -875,7 +875,7 @@ int flush;
|
||||
ret = inflate_table(CODES, state->lens, 19, &(state->next),
|
||||
&(state->lenbits), state->work);
|
||||
if (ret) {
|
||||
strm->msg = (char *)"invalid code lengths set";
|
||||
strm->msg = "invalid code lengths set";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -899,7 +899,7 @@ int flush;
|
||||
NEEDBITS(this.bits + 2);
|
||||
DROPBITS(this.bits);
|
||||
if (state->have == 0) {
|
||||
strm->msg = (char *)"invalid bit length repeat";
|
||||
strm->msg = "invalid bit length repeat";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -922,7 +922,7 @@ int flush;
|
||||
DROPBITS(7);
|
||||
}
|
||||
if (state->have + copy > state->nlen + state->ndist) {
|
||||
strm->msg = (char *)"invalid bit length repeat";
|
||||
strm->msg = "invalid bit length repeat";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -941,7 +941,7 @@ int flush;
|
||||
ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
|
||||
&(state->lenbits), state->work);
|
||||
if (ret) {
|
||||
strm->msg = (char *)"invalid literal/lengths set";
|
||||
strm->msg = "invalid literal/lengths set";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -950,7 +950,7 @@ int flush;
|
||||
ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
|
||||
&(state->next), &(state->distbits), state->work);
|
||||
if (ret) {
|
||||
strm->msg = (char *)"invalid distances set";
|
||||
strm->msg = "invalid distances set";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -993,7 +993,7 @@ int flush;
|
||||
break;
|
||||
}
|
||||
if (this.op & 64) {
|
||||
strm->msg = (char *)"invalid literal/length code";
|
||||
strm->msg = "invalid literal/length code";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -1025,7 +1025,7 @@ int flush;
|
||||
}
|
||||
DROPBITS(this.bits);
|
||||
if (this.op & 64) {
|
||||
strm->msg = (char *)"invalid distance code";
|
||||
strm->msg = "invalid distance code";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -1040,13 +1040,13 @@ int flush;
|
||||
}
|
||||
#ifdef INFLATE_STRICT
|
||||
if (state->offset > state->dmax) {
|
||||
strm->msg = (char *)"invalid distance too far back";
|
||||
strm->msg = "invalid distance too far back";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
if (state->offset > state->whave + out - left) {
|
||||
strm->msg = (char *)"invalid distance too far back";
|
||||
strm->msg = "invalid distance too far back";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -1098,7 +1098,7 @@ int flush;
|
||||
state->flags ? hold :
|
||||
#endif
|
||||
REVERSE(hold)) != state->check) {
|
||||
strm->msg = (char *)"incorrect data check";
|
||||
strm->msg = "incorrect data check";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -1111,7 +1111,7 @@ int flush;
|
||||
if (state->wrap && state->flags) {
|
||||
NEEDBITS(32);
|
||||
if (hold != (state->total & 0xffffffffUL)) {
|
||||
strm->msg = (char *)"incorrect length check";
|
||||
strm->msg = "incorrect length check";
|
||||
state->mode = BAD;
|
||||
break;
|
||||
}
|
||||
@ -1247,7 +1247,7 @@ gz_headerp head;
|
||||
*/
|
||||
local unsigned syncsearch(have, buf, len)
|
||||
unsigned FAR *have;
|
||||
unsigned char FAR *buf;
|
||||
unsigned const char FAR *buf;
|
||||
unsigned len;
|
||||
{
|
||||
unsigned got;
|
||||
|
@ -150,8 +150,8 @@ local void send_tree OF((deflate_state *s, ct_data *tree, int max_code));
|
||||
local int build_bl_tree OF((deflate_state *s));
|
||||
local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,
|
||||
int blcodes));
|
||||
local void compress_block OF((deflate_state *s, ct_data *ltree,
|
||||
ct_data *dtree));
|
||||
local void compress_block OF((deflate_state *s, const ct_data *ltree,
|
||||
const ct_data *dtree));
|
||||
local void set_data_type OF((deflate_state *s));
|
||||
local unsigned bi_reverse OF((unsigned value, int length));
|
||||
local void bi_windup OF((deflate_state *s));
|
||||
@ -986,7 +986,7 @@ void _tr_flush_block(s, buf, stored_len, eof)
|
||||
} else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) {
|
||||
#endif
|
||||
send_bits(s, (STATIC_TREES<<1)+eof, 3);
|
||||
compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree);
|
||||
compress_block(s, static_ltree, static_dtree);
|
||||
#ifdef DEBUG
|
||||
s->compressed_len += 3 + s->static_len;
|
||||
#endif
|
||||
@ -994,7 +994,7 @@ void _tr_flush_block(s, buf, stored_len, eof)
|
||||
send_bits(s, (DYN_TREES<<1)+eof, 3);
|
||||
send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,
|
||||
max_blindex+1);
|
||||
compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree);
|
||||
compress_block(s, s->dyn_ltree, s->dyn_dtree);
|
||||
#ifdef DEBUG
|
||||
s->compressed_len += 3 + s->opt_len;
|
||||
#endif
|
||||
@ -1071,8 +1071,8 @@ int _tr_tally (s, dist, lc)
|
||||
*/
|
||||
local void compress_block(s, ltree, dtree)
|
||||
deflate_state *s;
|
||||
ct_data *ltree; /* literal tree */
|
||||
ct_data *dtree; /* distance tree */
|
||||
const ct_data *ltree; /* literal tree */
|
||||
const ct_data *dtree; /* distance tree */
|
||||
{
|
||||
unsigned dist; /* distance of matched string */
|
||||
int lc; /* match length or unmatched char (if dist == 0) */
|
||||
|
@ -5,8 +5,7 @@
|
||||
|
||||
/* @(#) $Id$ */
|
||||
|
||||
#define ZLIB_INTERNAL
|
||||
#include "zlib.h"
|
||||
#include "zutil.h"
|
||||
|
||||
/* ===========================================================================
|
||||
Decompresses the source buffer into the destination buffer. sourceLen is
|
||||
@ -32,7 +31,7 @@ int ZEXPORT uncompress (dest, destLen, source, sourceLen)
|
||||
z_stream stream;
|
||||
int err;
|
||||
|
||||
stream.next_in = (Bytef*)source;
|
||||
stream.next_in = source;
|
||||
stream.avail_in = (uInt)sourceLen;
|
||||
/* Check for source > 64K on 16-bit machine: */
|
||||
if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
|
||||
|
@ -37,8 +37,14 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define ZLIB_VERSION "1.2.3"
|
||||
#define ZLIB_VERNUM 0x1230
|
||||
#define ZLIB_VERSION "1.2.3.1.Samba"
|
||||
#define ZLIB_VERNUM 0x1231
|
||||
/*
|
||||
* Modified for Samba by Stefan Metzmacher <metze@samba.org> 2008
|
||||
*
|
||||
* inflateReset2() added and compiler warnings fixed
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
The 'zlib' compression library provides in-memory compression and
|
||||
@ -80,7 +86,7 @@ typedef void (*free_func) OF((voidpf opaque, voidpf address));
|
||||
struct internal_state;
|
||||
|
||||
typedef struct z_stream_s {
|
||||
Bytef *next_in; /* next input byte */
|
||||
const Bytef *next_in; /* next input byte */
|
||||
uInt avail_in; /* number of bytes available at next_in */
|
||||
uLong total_in; /* total nb of input bytes read so far */
|
||||
|
||||
@ -88,7 +94,7 @@ typedef struct z_stream_s {
|
||||
uInt avail_out; /* remaining free space at next_out */
|
||||
uLong total_out; /* total nb of bytes output so far */
|
||||
|
||||
char *msg; /* last error message, NULL if no error */
|
||||
const char *msg; /* last error message, NULL if no error */
|
||||
struct internal_state FAR *state; /* not visible by applications */
|
||||
|
||||
alloc_func zalloc; /* used to allocate the internal state */
|
||||
@ -210,6 +216,16 @@ typedef gz_header FAR *gz_headerp;
|
||||
#define zlib_version zlibVersion()
|
||||
/* for compatibility with versions < 1.0.2 */
|
||||
|
||||
#if (__GNUC__ >= 3) && (__GNUC_MINOR__ >= 1)
|
||||
/** Use gcc attribute to check printf fns. a1 is the 1-based index of
|
||||
* the parameter containing the format, and a2 the index of the first
|
||||
* argument. Note that some gcc 2.x versions don't handle this
|
||||
* properly **/
|
||||
#define _Z_PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2)))
|
||||
#else
|
||||
#define _Z_PRINTF_ATTRIBUTE(a1, a2)
|
||||
#endif
|
||||
|
||||
/* basic functions */
|
||||
|
||||
ZEXTERN const char * ZEXPORT zlibVersion OF((void));
|
||||
@ -789,8 +805,6 @@ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
|
||||
destination.
|
||||
*/
|
||||
|
||||
ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, unsigned flags));
|
||||
|
||||
ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
|
||||
/*
|
||||
This function is equivalent to inflateEnd followed by inflateInit,
|
||||
@ -889,7 +903,7 @@ ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
|
||||
match the version of the header file.
|
||||
*/
|
||||
|
||||
typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *));
|
||||
typedef unsigned (*in_func) OF((void FAR *, unsigned const char FAR * FAR *));
|
||||
typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));
|
||||
|
||||
ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
|
||||
@ -1134,7 +1148,8 @@ ZEXTERN int ZEXPORT gzwrite OF((gzFile file,
|
||||
(0 in case of error).
|
||||
*/
|
||||
|
||||
ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...));
|
||||
ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...))
|
||||
_Z_PRINTF_ATTRIBUTE(2, 3);
|
||||
/*
|
||||
Converts, formats, and writes the args to the compressed file under
|
||||
control of the format string, as in fprintf. gzprintf returns the number of
|
||||
|
@ -56,7 +56,7 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
|
||||
#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
|
||||
|
||||
#define ERR_RETURN(strm,err) \
|
||||
return (strm->msg = (char*)ERR_MSG(err), (err))
|
||||
return (strm->msg = ERR_MSG(err), (err))
|
||||
/* To be used only when the state is known to be valid */
|
||||
|
||||
/* common constants */
|
||||
|
@ -43,7 +43,8 @@ MANPAGES += $(librpcsrcdir)/tools/ndrdump.1
|
||||
################################################
|
||||
# Start SUBSYSTEM NDR_COMPRESSION
|
||||
[SUBSYSTEM::NDR_COMPRESSION]
|
||||
PUBLIC_DEPENDENCIES = LIBCOMPRESSION LIBSAMBA-ERRORS LIBNDR
|
||||
PRIVATE_DEPENDENCIES = ZLIB LZXPRESS
|
||||
PUBLIC_DEPENDENCIES = LIBSAMBA-ERRORS LIBNDR
|
||||
# End SUBSYSTEM NDR_COMPRESSION
|
||||
################################################
|
||||
|
||||
|
@ -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
|
||||
@ -20,13 +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 <zlib.h>
|
||||
|
||||
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;
|
||||
@ -35,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) {
|
||||
@ -58,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)) {
|
||||
@ -83,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);
|
||||
@ -158,12 +230,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 +244,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 +275,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 +289,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 +308,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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user