Browse Source

Fix accidental infinite decompression loop, (h-haha)

pull/46/head
coomdev 2 years ago
parent
commit
ce08933a72
  1. 2
      README.md
  2. 28
      chrome/dist/main.js
  3. 2
      chrome/manifest.json
  4. 28
      dist/main.js
  5. BIN
      efdb47d2f0e04144bbaa-0.290.xpi
  6. 28
      firefox/dist/main.js
  7. 2
      firefox/manifest.json
  8. 2
      firefox_update.json
  9. 2
      main.meta.js
  10. 30
      main.user.js
  11. BIN
      pngextraembedder-0.290.xpi
  12. 7
      src/bitstream.ts
  13. 23
      src/dh-deflate.ts
  14. 6
      src/main.ts

2
README.md

@ -25,7 +25,7 @@ Please report any issue you have with those (only for mainstream browsers)
Also, use this if you plan to use b4k's archive.
- [Install 4chanX (recommended)](https://www.4chan-x.net/builds/4chan-X.user.js)
- Install the correct WebExtension for your Browser ([Firefox](https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.289.xpi) or Chrome-based (Down for "maintainance"))
- Install the correct WebExtension for your Browser ([Firefox](https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.290.xpi) or Chrome-based (Down for "maintainance"))
For FF users, the extension is signed so you can just drag and drop it on your about:addons tab.

28
chrome/dist/main.js

@ -73,7 +73,7 @@
var define_BUILD_VERSION_default;
var init_define_BUILD_VERSION = __esm({
"<define:BUILD_VERSION>"() {
define_BUILD_VERSION_default = [0, 289];
define_BUILD_VERSION_default = [0, 290];
}
});
@ -21243,7 +21243,9 @@
}
readSync(length) {
let value = 0;
const byte = this.buffers[0][this._offset >> 3];
if (this._offset >> 3 > this.buffers[0].byteLength) {
throw "Out of data";
}
for (let i = length - 1; i >= 0; --i) {
value = value * 2 + this.getBit(this._offset + i);
}
@ -21306,7 +21308,6 @@
this.trans = new Uint16Array(288);
}
};
var pathMap = /* @__PURE__ */ new Map();
var getPathTo = (tree, value) => {
if (tree[0] === value)
return "0";
@ -21362,6 +21363,7 @@
this.dests = dests;
this.to_hide = to_hide;
this.hidden = hidden;
this.pathMap = /* @__PURE__ */ new Map();
this.dest = [];
this.ltree = new Tree();
this.dtree = new Tree();
@ -21547,22 +21549,12 @@
i--;
return [i, bits_table[i], value - base_table[i]];
};
var encode_symbol = (sym, tree) => {
let m;
if (m = pathMap.get(tree)) {
const v2 = m.get(sym);
if (v2)
return v2;
} else {
m = /* @__PURE__ */ new Map();
pathMap.set(tree, m);
}
var encode_symbol = (sym, tree, pathMap) => {
const code = getPathTo(tree, sym);
const v = {
length: code?.length,
val: parseInt(code, 2)
};
m.set(sym, v);
return v;
};
var capacity = 0;
@ -21584,7 +21576,7 @@
let backoffset = tinf_read_bits(d, dist_bits[dist], dist_base[dist]);
const offs2 = d.dest.length - backoffset;
let match;
const skip = d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0;
const skip = !d.to_hide || d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0;
if (!skip && (match = Buffer2.from(d.dest.slice(offs2, offs2 + length))).length == length) {
let begin = d.dest.length - 32768;
if (begin < 0)
@ -21622,7 +21614,7 @@
}
}
const [dsym, dlen, doff] = get_symbol(backoffset, dist_bits, dist_base);
const encdist = encode_symbol(dsym, d.rdtree);
const encdist = encode_symbol(dsym, d.rdtree, d.pathMap);
d.hidden?.write(encdist.length, revbyte(encdist.val, encdist.length));
d.hidden?.write(dlen, doff);
for (let i = offs2; i < offs2 + length; ++i) {
@ -32020,7 +32012,7 @@
const filenames = threads.reduce((a, b) => [...a, ...b.posts.filter((p) => p.ext).map((p) => p)], []).filter((p) => p.ext != ".webm" && p.ext != ".gif").map((p) => [p.resto || p.no, `https://i.4cdn.org/${boardname}/${p.tim}${p.ext}`, p.md5, p.filename + p.ext, p.no]);
console.log(filenames);
fireNotification("info", "Analyzing images...");
const n = 7;
const n = 1;
const processFile = (src, fn, hex) => {
return Promise.all(processors.filter((e) => e.match(fn)).map(async (proc) => {
if (proc.skip) {
@ -32254,7 +32246,7 @@ Use the WebExtension version of PEE if you want to use b4k!`);
if (csettings5.notcata)
return;
}
const n = 7;
const n = 1;
const range = ~~(posts.length / n) + 1;
await Promise.all([...new Array(n + 1)].map(async (e, i) => {
const postsslice = posts.slice(i * range, (i + 1) * range);

2
chrome/manifest.json

@ -2,7 +2,7 @@
"manifest_version": 3,
"name": "PngExtraEmbedder",
"description": "Discover embedded files on 4chan and archives!",
"version": "0.289",
"version": "0.290",
"icons": {
"64": "1449696017588.png"
},

28
dist/main.js

@ -73,7 +73,7 @@
var define_BUILD_VERSION_default;
var init_define_BUILD_VERSION = __esm({
"<define:BUILD_VERSION>"() {
define_BUILD_VERSION_default = [0, 289];
define_BUILD_VERSION_default = [0, 290];
}
});
@ -21078,7 +21078,9 @@
}
readSync(length) {
let value = 0;
const byte = this.buffers[0][this._offset >> 3];
if (this._offset >> 3 > this.buffers[0].byteLength) {
throw "Out of data";
}
for (let i = length - 1; i >= 0; --i) {
value = value * 2 + this.getBit(this._offset + i);
}
@ -21141,7 +21143,6 @@
this.trans = new Uint16Array(288);
}
};
var pathMap = /* @__PURE__ */ new Map();
var getPathTo = (tree, value) => {
if (tree[0] === value)
return "0";
@ -21197,6 +21198,7 @@
this.dests = dests;
this.to_hide = to_hide;
this.hidden = hidden;
this.pathMap = /* @__PURE__ */ new Map();
this.dest = [];
this.ltree = new Tree();
this.dtree = new Tree();
@ -21382,22 +21384,12 @@
i--;
return [i, bits_table[i], value - base_table[i]];
};
var encode_symbol = (sym, tree) => {
let m;
if (m = pathMap.get(tree)) {
const v2 = m.get(sym);
if (v2)
return v2;
} else {
m = /* @__PURE__ */ new Map();
pathMap.set(tree, m);
}
var encode_symbol = (sym, tree, pathMap) => {
const code = getPathTo(tree, sym);
const v = {
length: code?.length,
val: parseInt(code, 2)
};
m.set(sym, v);
return v;
};
var capacity = 0;
@ -21419,7 +21411,7 @@
let backoffset = tinf_read_bits(d, dist_bits[dist], dist_base[dist]);
const offs2 = d.dest.length - backoffset;
let match;
const skip = d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0;
const skip = !d.to_hide || d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0;
if (!skip && (match = Buffer2.from(d.dest.slice(offs2, offs2 + length))).length == length) {
let begin = d.dest.length - 32768;
if (begin < 0)
@ -21457,7 +21449,7 @@
}
}
const [dsym, dlen, doff] = get_symbol(backoffset, dist_bits, dist_base);
const encdist = encode_symbol(dsym, d.rdtree);
const encdist = encode_symbol(dsym, d.rdtree, d.pathMap);
d.hidden?.write(encdist.length, revbyte(encdist.val, encdist.length));
d.hidden?.write(dlen, doff);
for (let i = offs2; i < offs2 + length; ++i) {
@ -31855,7 +31847,7 @@
const filenames = threads.reduce((a, b) => [...a, ...b.posts.filter((p) => p.ext).map((p) => p)], []).filter((p) => p.ext != ".webm" && p.ext != ".gif").map((p) => [p.resto || p.no, `https://i.4cdn.org/${boardname}/${p.tim}${p.ext}`, p.md5, p.filename + p.ext, p.no]);
console.log(filenames);
fireNotification("info", "Analyzing images...");
const n = 7;
const n = 1;
const processFile = (src, fn, hex) => {
return Promise.all(processors.filter((e) => e.match(fn)).map(async (proc) => {
if (proc.skip) {
@ -32089,7 +32081,7 @@ Use the WebExtension version of PEE if you want to use b4k!`);
if (csettings5.notcata)
return;
}
const n = 7;
const n = 1;
const range = ~~(posts.length / n) + 1;
await Promise.all([...new Array(n + 1)].map(async (e, i) => {
const postsslice = posts.slice(i * range, (i + 1) * range);

BIN
efdb47d2f0e04144bbaa-0.290.xpi

Binary file not shown.

28
firefox/dist/main.js

@ -73,7 +73,7 @@
var define_BUILD_VERSION_default;
var init_define_BUILD_VERSION = __esm({
"<define:BUILD_VERSION>"() {
define_BUILD_VERSION_default = [0, 289];
define_BUILD_VERSION_default = [0, 290];
}
});
@ -21220,7 +21220,9 @@
}
readSync(length) {
let value = 0;
const byte = this.buffers[0][this._offset >> 3];
if (this._offset >> 3 > this.buffers[0].byteLength) {
throw "Out of data";
}
for (let i = length - 1; i >= 0; --i) {
value = value * 2 + this.getBit(this._offset + i);
}
@ -21283,7 +21285,6 @@
this.trans = new Uint16Array(288);
}
};
var pathMap = /* @__PURE__ */ new Map();
var getPathTo = (tree, value) => {
if (tree[0] === value)
return "0";
@ -21339,6 +21340,7 @@
this.dests = dests;
this.to_hide = to_hide;
this.hidden = hidden;
this.pathMap = /* @__PURE__ */ new Map();
this.dest = [];
this.ltree = new Tree();
this.dtree = new Tree();
@ -21524,22 +21526,12 @@
i--;
return [i, bits_table[i], value - base_table[i]];
};
var encode_symbol = (sym, tree) => {
let m;
if (m = pathMap.get(tree)) {
const v2 = m.get(sym);
if (v2)
return v2;
} else {
m = /* @__PURE__ */ new Map();
pathMap.set(tree, m);
}
var encode_symbol = (sym, tree, pathMap) => {
const code = getPathTo(tree, sym);
const v = {
length: code?.length,
val: parseInt(code, 2)
};
m.set(sym, v);
return v;
};
var capacity = 0;
@ -21561,7 +21553,7 @@
let backoffset = tinf_read_bits(d, dist_bits[dist], dist_base[dist]);
const offs2 = d.dest.length - backoffset;
let match;
const skip = d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0;
const skip = !d.to_hide || d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0;
if (!skip && (match = Buffer2.from(d.dest.slice(offs2, offs2 + length))).length == length) {
let begin = d.dest.length - 32768;
if (begin < 0)
@ -21599,7 +21591,7 @@
}
}
const [dsym, dlen, doff] = get_symbol(backoffset, dist_bits, dist_base);
const encdist = encode_symbol(dsym, d.rdtree);
const encdist = encode_symbol(dsym, d.rdtree, d.pathMap);
d.hidden?.write(encdist.length, revbyte(encdist.val, encdist.length));
d.hidden?.write(dlen, doff);
for (let i = offs2; i < offs2 + length; ++i) {
@ -31997,7 +31989,7 @@
const filenames = threads.reduce((a, b) => [...a, ...b.posts.filter((p) => p.ext).map((p) => p)], []).filter((p) => p.ext != ".webm" && p.ext != ".gif").map((p) => [p.resto || p.no, `https://i.4cdn.org/${boardname}/${p.tim}${p.ext}`, p.md5, p.filename + p.ext, p.no]);
console.log(filenames);
fireNotification("info", "Analyzing images...");
const n = 7;
const n = 1;
const processFile = (src, fn, hex) => {
return Promise.all(processors.filter((e) => e.match(fn)).map(async (proc) => {
if (proc.skip) {
@ -32231,7 +32223,7 @@ Use the WebExtension version of PEE if you want to use b4k!`);
if (csettings5.notcata)
return;
}
const n = 7;
const n = 1;
const range = ~~(posts.length / n) + 1;
await Promise.all([...new Array(n + 1)].map(async (e, i) => {
const postsslice = posts.slice(i * range, (i + 1) * range);

2
firefox/manifest.json

@ -7,7 +7,7 @@
},
"name": "PngExtraEmbedder",
"description": "Discover embedded files on 4chan and archives!",
"version": "0.289",
"version": "0.290",
"icons": {
"64": "1449696017588.png"
},

2
firefox_update.json

@ -1 +1 @@
{"addons":{"{34ac4994-07f2-44d2-8599-682516a6c6a6}":{"updates":[{"version":"0.289","update_link":"https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.289.xpi"}]}}}
{"addons":{"{34ac4994-07f2-44d2-8599-682516a6c6a6}":{"updates":[{"version":"0.290","update_link":"https://git.coom.tech/fuckjannies/lolipiss/raw/branch/%E4%B8%AD%E5%87%BA%E3%81%97/pngextraembedder-0.290.xpi"}]}}}

2
main.meta.js

@ -1,7 +1,7 @@
// ==UserScript==
// @name PNGExtraEmbed
// @namespace https://coom.tech/
// @version 0.289
// @version 0.290
// @description uhh
// @author You
// @match https://boards.4channel.org/*

30
main.user.js

@ -1,7 +1,7 @@
// ==UserScript==
// @name PNGExtraEmbed
// @namespace https://coom.tech/
// @version 0.289
// @version 0.290
// @description uhh
// @author You
// @match https://boards.4channel.org/*
@ -109,7 +109,7 @@ const _DOMParser = DOMParser;
var define_BUILD_VERSION_default;
var init_define_BUILD_VERSION = __esm({
"<define:BUILD_VERSION>"() {
define_BUILD_VERSION_default = [0, 289];
define_BUILD_VERSION_default = [0, 290];
}
});
@ -21114,7 +21114,9 @@ const _DOMParser = DOMParser;
}
readSync(length) {
let value = 0;
const byte = this.buffers[0][this._offset >> 3];
if (this._offset >> 3 > this.buffers[0].byteLength) {
throw "Out of data";
}
for (let i = length - 1; i >= 0; --i) {
value = value * 2 + this.getBit(this._offset + i);
}
@ -21177,7 +21179,6 @@ const _DOMParser = DOMParser;
this.trans = new Uint16Array(288);
}
};
var pathMap = /* @__PURE__ */ new Map();
var getPathTo = (tree, value) => {
if (tree[0] === value)
return "0";
@ -21233,6 +21234,7 @@ const _DOMParser = DOMParser;
this.dests = dests;
this.to_hide = to_hide;
this.hidden = hidden;
this.pathMap = /* @__PURE__ */ new Map();
this.dest = [];
this.ltree = new Tree();
this.dtree = new Tree();
@ -21418,22 +21420,12 @@ const _DOMParser = DOMParser;
i--;
return [i, bits_table[i], value - base_table[i]];
};
var encode_symbol = (sym, tree) => {
let m;
if (m = pathMap.get(tree)) {
const v2 = m.get(sym);
if (v2)
return v2;
} else {
m = /* @__PURE__ */ new Map();
pathMap.set(tree, m);
}
var encode_symbol = (sym, tree, pathMap) => {
const code = getPathTo(tree, sym);
const v = {
length: code?.length,
val: parseInt(code, 2)
};
m.set(sym, v);
return v;
};
var capacity = 0;
@ -21455,7 +21447,7 @@ const _DOMParser = DOMParser;
let backoffset = tinf_read_bits(d, dist_bits[dist], dist_base[dist]);
const offs2 = d.dest.length - backoffset;
let match;
const skip = d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0;
const skip = !d.to_hide || d.to_hide && d.to_hide instanceof BitstreamReader2 && d.to_hide.available == 0;
if (!skip && (match = Buffer2.from(d.dest.slice(offs2, offs2 + length))).length == length) {
let begin = d.dest.length - 32768;
if (begin < 0)
@ -21493,7 +21485,7 @@ const _DOMParser = DOMParser;
}
}
const [dsym, dlen, doff] = get_symbol(backoffset, dist_bits, dist_base);
const encdist = encode_symbol(dsym, d.rdtree);
const encdist = encode_symbol(dsym, d.rdtree, d.pathMap);
d.hidden?.write(encdist.length, revbyte(encdist.val, encdist.length));
d.hidden?.write(dlen, doff);
for (let i = offs2; i < offs2 + length; ++i) {
@ -31891,7 +31883,7 @@ const _DOMParser = DOMParser;
const filenames = threads.reduce((a, b) => [...a, ...b.posts.filter((p) => p.ext).map((p) => p)], []).filter((p) => p.ext != ".webm" && p.ext != ".gif").map((p) => [p.resto || p.no, `https://i.4cdn.org/${boardname}/${p.tim}${p.ext}`, p.md5, p.filename + p.ext, p.no]);
console.log(filenames);
fireNotification("info", "Analyzing images...");
const n = 7;
const n = 1;
const processFile = (src, fn, hex) => {
return Promise.all(processors.filter((e) => e.match(fn)).map(async (proc) => {
if (proc.skip) {
@ -32125,7 +32117,7 @@ Use the WebExtension version of PEE if you want to use b4k!`);
if (csettings5.notcata)
return;
}
const n = 7;
const n = 1;
const range = ~~(posts.length / n) + 1;
await Promise.all([...new Array(n + 1)].map(async (e, i) => {
const postsslice = posts.slice(i * range, (i + 1) * range);

BIN
pngextraembedder-0.290.xpi

Binary file not shown.

7
src/bitstream.ts

@ -14,7 +14,7 @@ export const revbyte = (n: number, len = 8) => {
};
export class BitstreamReader {
private buffers: any[] = [];
private buffers: Uint8Array[] = [];
private bufferedLength = 0;
@ -64,7 +64,10 @@ export class BitstreamReader {
readSync(length: number): number {
let value = 0;
//console.log(this.buffers[0])
const byte = this.buffers[0][this._offset >> 3];
if (this._offset >> 3 > this.buffers[0].byteLength) {
throw "Out of data";
}
//const byte = this.buffers[0][this._offset >> 3];
for (let i = length - 1; i >= 0; --i) {
value = value * 2 + this.getBit(this._offset + i);
}

23
src/dh-deflate.ts

@ -13,10 +13,6 @@ type HCtree = [number | HCtree, (number | HCtree)?];
// these two functions are a big bottleneck because im not clever enough to figure out how to encode
// something directly by using the sorted code length/value tables, haha
const pathMap = new Map<HCtree, Map<number, {
length: number,
val: number
}>>();
const getPathTo = (tree: HCtree, value: number): string | undefined => {
if (tree[0] === value)
@ -75,6 +71,11 @@ function buildHuffmanTable(codeLengths: ArrayLike<number>, values: ArrayLike<num
}
class Data {
pathMap = new Map<HCtree, Map<number, {
length: number,
val: number
}>>();
computeReverse() {
this.rltree = buildHuffmanTable(this.ltree.table, this.ltree.trans)[0]! as any; // unneeded, but maybe sometime i'll throw symbol reduction into the mix
this.rdtree = buildHuffmanTable(this.dtree.table, this.dtree.trans)[0]! as any;
@ -352,15 +353,15 @@ const get_symbol = (value: number, bits_table: Uint8Array, base_table: Uint16Arr
return [i, bits_table[i], value - base_table[i]];
};
const encode_symbol = (sym: number, tree: HCtree) => {
let m: Map<number, { length: number, val: number }> | undefined;
const encode_symbol = (sym: number, tree: HCtree, pathMap: Map<HCtree, Map<number, { length: number, val: number }>>) => {
/*let m: Map<number, { length: number, val: number }> | undefined;
if ((m = pathMap.get(tree))) {
const v = m.get(sym);
if (v) return v;
} else {
m = new Map;
pathMap.set(tree, m);
}
}*/
const code = getPathTo(tree, sym)!;
@ -368,7 +369,7 @@ const encode_symbol = (sym: number, tree: HCtree) => {
length: code?.length,
val: parseInt(code, 2)
};
m.set(sym, v);
//m.set(sym, v);
return v;
};
/* ----------------------------- *
@ -386,7 +387,7 @@ function tinf_inflate_block_data(d: Data, lt: Tree, dt: Tree) {
if (sym === 256) {
return TINF_OK;
}
if (sym < 256) {
d.dest.push(sym);
// same
@ -412,7 +413,7 @@ function tinf_inflate_block_data(d: Data, lt: Tree, dt: Tree) {
let match: Buffer;
// don't consider matches that could be in the lookahead buffer
const skip = d.to_hide && d.to_hide instanceof BitstreamReader && d.to_hide.available == 0;
const skip = !d.to_hide || (d.to_hide && d.to_hide instanceof BitstreamReader && d.to_hide.available == 0);
if (!skip && (match = Buffer.from(d.dest.slice(offs, offs + length))).length == length) {
let begin = d.dest.length - 32768;
if (begin < 0)
@ -460,7 +461,7 @@ function tinf_inflate_block_data(d: Data, lt: Tree, dt: Tree) {
//d.hidden.write(enclen.length, enclen.val);
//d.hidden.write(llen, loff);
const [dsym, dlen, doff] = get_symbol(backoffset, dist_bits, dist_base);
const encdist = encode_symbol(dsym, d.rdtree);
const encdist = encode_symbol(dsym, d.rdtree, d.pathMap);
d.hidden?.write(encdist.length, revbyte(encdist.val, encdist.length));
d.hidden?.write(dlen, doff);

6
src/main.ts

@ -109,7 +109,7 @@ const processImage = async (srcs: AsyncGenerator<string, void, void>, fn: string
try {
const n = await srcs.next();
if (n.done)
return; // no more links to try
return; // no more links to try
const iter = streamRemote(n.value);
if (!iter)
return;
@ -304,7 +304,7 @@ const scrapeBoard = async (self: HTMLButtonElement) => {
console.log(filenames);
fireNotification("info", "Analyzing images...");
const n = 7;
const n = 1;
//console.log(posts);
const processFile = (src: string, fn: string, hex: string) => {
return Promise.all(processors.filter(e => e.match(fn)).map(async proc => {
@ -612,7 +612,7 @@ const startup = async (is4chanX = true) => {
return;
}
const n = 7;
const n = 1;
//console.log(posts);
const range = ~~(posts.length / n) + 1;
await Promise.all([...new Array(n + 1)].map(async (e, i) => {

Loading…
Cancel
Save