1
0
Fork 0
mirror of https://github.com/0x5eal/rbxts-pako.git synced 2025-04-09 13:20:59 +01:00

Fix for raw inflate with dictionary ()

Fixes https://github.com/nodeca/pako/issues/155
`inflateSetDictionary()` is called at different conditions during normal and raw modes, according to http://zlib.net/manual.html#Advanced 
Also providing basic tests for raw inflate with directory, and fix for broken test Inflate with dictionary/spdy dictionary
This commit is contained in:
Vitaly Puzrin 2019-01-14 21:03:52 +03:00 committed by GitHub
commit 44b15356e4
Signed by: DevComp
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 44 additions and 17 deletions

View file

@ -144,6 +144,22 @@ function Inflate(options) {
this.header = new GZheader();
zlib_inflate.inflateGetHeader(this.strm, this.header);
// Setup dictionary
if (opt.dictionary) {
// Convert data if needed
if (typeof opt.dictionary === 'string') {
opt.dictionary = strings.string2buf(opt.dictionary);
} else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {
opt.dictionary = new Uint8Array(opt.dictionary);
}
if (opt.raw) { //In raw mode we need to set the dictionary early
status = zlib_inflate.inflateSetDictionary(this.strm, opt.dictionary);
if (status !== c.Z_OK) {
throw new Error(msg[status]);
}
}
}
}
/**
@ -180,7 +196,6 @@ Inflate.prototype.push = function (data, mode) {
var dictionary = this.options.dictionary;
var status, _mode;
var next_out_utf8, tail, utf8str;
var dict;
// Flag to properly process Z_BUF_ERROR on testing inflate call
// when we check that all output data was flushed.
@ -212,17 +227,7 @@ Inflate.prototype.push = function (data, mode) {
status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH); /* no bad return value */
if (status === c.Z_NEED_DICT && dictionary) {
// Convert data if needed
if (typeof dictionary === 'string') {
dict = strings.string2buf(dictionary);
} else if (toString.call(dictionary) === '[object ArrayBuffer]') {
dict = new Uint8Array(dictionary);
} else {
dict = dictionary;
}
status = zlib_inflate.inflateSetDictionary(this.strm, dict);
status = zlib_inflate.inflateSetDictionary(this.strm, dictionary);
}
if (status === c.Z_BUF_ERROR && allowBufError === true) {

View file

@ -169,22 +169,44 @@ describe('Inflate with dictionary', function () {
it('should throw on the wrong dictionary', function () {
// var zCompressed = helpers.deflateSync('world', { dictionary: new Buffer('hello') });
var zCompressed = new Buffer([ 120, 187, 6, 44, 2, 21, 43, 207, 47, 202, 73, 1, 0, 6, 166, 2, 41 ]);
var zCompressed = new Uint8Array([ 120, 187, 6, 44, 2, 21, 43, 207, 47, 202, 73, 1, 0, 6, 166, 2, 41 ]);
assert.throws(function () {
pako.inflate(zCompressed, { dictionary: new Buffer('world') });
pako.inflate(zCompressed, { dictionary: 'world' });
}, /data error/);
});
it('trivial dictionary', function () {
var dict = new Buffer('abcdefghijklmnoprstuvwxyz');
var dict = 'abcdefghijklmnoprstuvwxyz';
testInflate(samples, { dictionary: dict }, { dictionary: dict });
});
it('spdy dictionary', function () {
var spdyDict = require('fs').readFileSync(require('path').join(__dirname, 'fixtures', 'spdy_dict.txt'));
testInflate(samples, { dictionary: spdyDict }, { dictionary: helpers.spdyDict });
testInflate(samples, { dictionary: spdyDict }, { dictionary: spdyDict });
});
it('should throw if directory is not supplied to raw inflate', function () {
var dict = 'abcdefghijklmnoprstuvwxyz';
assert.throws(function () {
testInflate(samples, { raw: true }, { raw: true, dictionary: dict });
});
});
it('tests raw inflate with spdy dictionary', function () {
var spdyDict = require('fs').readFileSync(require('path').join(__dirname, 'fixtures', 'spdy_dict.txt'));
testInflate(samples, { raw: true, dictionary: spdyDict }, { raw: true, dictionary: spdyDict });
});
it('tests dictionary as Uint8Array', function () {
var dict = new Uint8Array(100);
for (var i = 0; i < 100; i++) dict[i] = Math.random() * 256;
testInflate(samples, { dictionary: dict }, { dictionary: dict });
});
it('tests dictionary as ArrayBuffer', function () {
var dict = new Uint8Array(100);
for (var i = 0; i < 100; i++) dict[i] = Math.random() * 256;
testInflate(samples, { dictionary: dict.buffer }, { dictionary: dict });
});
});