Skip to content

Commit 709620c

Browse files
committed
fix: prevent infinite recursion in deconstructPacket
1 parent c05ce69 commit 709620c

1 file changed

Lines changed: 13 additions & 3 deletions

File tree

lib/binary.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,34 @@ export function deconstructPacket(packet) {
1717
return { packet: pack, buffers: buffers };
1818
}
1919

20-
function _deconstructPacket(data, buffers) {
20+
function _deconstructPacket(
21+
data,
22+
buffers: Array<any>,
23+
known: object[] = [],
24+
retVals: WeakMap<any, object> = new WeakMap()
25+
) {
2126
if (!data) return data;
2227

2328
if (isBinary(data)) {
2429
const placeholder = { _placeholder: true, num: buffers.length };
2530
buffers.push(data);
2631
return placeholder;
32+
} else if (retVals.has(data)) {
33+
return retVals.get(data);
34+
} else if (known.includes(data)) {
35+
return data;
2736
} else if (Array.isArray(data)) {
2837
const newData = new Array(data.length);
2938
for (let i = 0; i < data.length; i++) {
30-
newData[i] = _deconstructPacket(data[i], buffers);
39+
newData[i] = _deconstructPacket(data[i], buffers, known, retVals);
3140
}
3241
return newData;
3342
} else if (typeof data === "object" && !(data instanceof Date)) {
3443
const newData = {};
44+
retVals.set(data, newData);
3545
for (const key in data) {
3646
if (Object.prototype.hasOwnProperty.call(data, key)) {
37-
newData[key] = _deconstructPacket(data[key], buffers);
47+
newData[key] = _deconstructPacket(data[key], buffers, known, retVals);
3848
}
3949
}
4050
return newData;

0 commit comments

Comments
 (0)