Quellcode durchsuchen

Improved Zlib detection

Arjun Barrett vor 4 Jahren
Ursprung
Commit
362a972e5f
3 geänderte Dateien mit 14 neuen und 6 gelöschten Zeilen
  1. 6 0
      CHANGELOG.md
  2. 1 1
      package.json
  3. 7 5
      src/index.ts

+ 6 - 0
CHANGELOG.md

@@ -1,3 +1,9 @@
+## 0.2.3
+- Improved Zlib autodetection
+## 0.2.2
+- Fixed Node Worker
+## 0.2.1
+- Fixed ZIP bug
 ## 0.2.0
 - Added support for ZIP files (parallelized)
 - Added ability to terminate running asynchronous operations

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "fflate",
-  "version": "0.2.2",
+  "version": "0.2.3",
   "description": "High performance (de)compression in an 8kB package",
   "main": "lib/index.js",
   "module": "esm/index.js",

+ 7 - 5
src/index.ts

@@ -839,7 +839,7 @@ const gzpre = (o: GzipOptions) => 10 + ((o && o.filename && o.filename.length) |
 // zlib unwrap
 const zluwrp = (d: Uint8Array) => {
   const l = d.length;
-  if (l < 6 || (d[0] & 15) != 8 || (d[0] >>> 4) > 7) throw 'invalid zlib data';
+  if (l < 6 || (d[0] & 15) != 8 || (d[0] >>> 4) > 7 || ((d[0] << 8 | d[1]) % 31)) throw 'invalid zlib data';
   if (d[1] & 32) throw 'invalid zlib data: dictionaries not supported';
   return d.subarray(2, -4);
 }
@@ -1063,7 +1063,7 @@ export function decompress(data: Uint8Array, opts: AsyncInflateOptions | FlateCa
   if (!cb) cb = opts as FlateCallback, opts = {};
   return (data[0] == 31 && data[1] == 139 && data[2] == 8)
     ? gunzip(data, opts as AsyncInflateOptions, cb)
-    : ((data[0] & 15) != 8 || (data[0] >> 4) > 7)
+    : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))
       ? inflate(data, opts as AsyncInflateOptions, cb)
       : unzlib(data, opts as AsyncInflateOptions, cb);
 }
@@ -1075,9 +1075,11 @@ export function decompress(data: Uint8Array, opts: AsyncInflateOptions | FlateCa
  * @returns The decompressed version of the data
  */
 export function decompressSync(data: Uint8Array, out?: Uint8Array) {
-  if (data[0] == 31 && data[1] == 139 && data[2] == 8) return gunzipSync(data, out);
-  if ((data[0] & 15) != 8 || (data[0] >> 4) > 7) return inflateSync(data, out);
-  return unzlibSync(data, out);
+  return (data[0] == 31 && data[1] == 139 && data[2] == 8)
+    ? gunzipSync(data, out)
+    : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))
+      ? inflateSync(data, out)
+      : unzlibSync(data, out);
 }
 
 /**