aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/builtins/js/ReadableStreamInternals.js
diff options
context:
space:
mode:
authorGravatar Jarred SUmner <jarred@jarredsumner.com> 2022-11-25 22:52:32 -0800
committerGravatar Jarred SUmner <jarred@jarredsumner.com> 2022-11-25 22:52:32 -0800
commitac7ad4d5c606cd6fd2d13fd0510d18449ce6e899 (patch)
tree5da02a5ec134c086d070b454bac5aafc626c5da5 /src/bun.js/builtins/js/ReadableStreamInternals.js
parent0b27a26edbac5d77c32669f5f5aaf9a032337e3c (diff)
downloadbun-ac7ad4d5c606cd6fd2d13fd0510d18449ce6e899.tar.gz
bun-ac7ad4d5c606cd6fd2d13fd0510d18449ce6e899.tar.zst
bun-ac7ad4d5c606cd6fd2d13fd0510d18449ce6e899.zip
Fix double free
Diffstat (limited to 'src/bun.js/builtins/js/ReadableStreamInternals.js')
-rw-r--r--src/bun.js/builtins/js/ReadableStreamInternals.js21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/bun.js/builtins/js/ReadableStreamInternals.js b/src/bun.js/builtins/js/ReadableStreamInternals.js
index 3e715a542..fd99ab2ea 100644
--- a/src/bun.js/builtins/js/ReadableStreamInternals.js
+++ b/src/bun.js/builtins/js/ReadableStreamInternals.js
@@ -1905,9 +1905,11 @@ function lazyLoadStream(stream, autoAllocateChunkSize) {
return handleResult(result, controller, view);
}
+ const registry = deinit ? new FinalizationRegistry(deinit) : null;
Prototype = class NativeReadableStreamSource {
constructor(tag, autoAllocateChunkSize, drainValue) {
this.#tag = tag;
+ this.#cancellationToken = {};
this.pull = this.#pull.bind(this);
this.cancel = this.#cancel.bind(this);
this.autoAllocateChunkSize = autoAllocateChunkSize;
@@ -1915,11 +1917,15 @@ function lazyLoadStream(stream, autoAllocateChunkSize) {
if (drainValue !== @undefined) {
this.start = (controller) => {
controller.enqueue(drainValue);
- console.log("chunkSize", chunkSize);
};
}
+
+ if (registry) {
+ registry.register(this, tag, this.#cancellationToken);
+ }
}
+ #cancellationToken;
pull;
cancel;
start;
@@ -1944,11 +1950,12 @@ function lazyLoadStream(stream, autoAllocateChunkSize) {
#cancel(reason) {
var tag = this.#tag;
+
+ registry && registry.unregister(this.#cancellationToken);
setRefOrUnref && setRefOrUnref(tag, false);
cancel(tag, reason);
}
static deinit = deinit;
- static registry = new FinalizationRegistry(deinit);
static drain = drain;
};
@lazyStreamPrototypeMap.@set(nativeType, Prototype);
@@ -1956,15 +1963,16 @@ function lazyLoadStream(stream, autoAllocateChunkSize) {
const chunkSize = Prototype.startSync(nativePtr, autoAllocateChunkSize);
var drainValue;
- const drainFn = Prototype.drain;
+ const {drain: drainFn, deinit: deinitFn} = Prototype;
if (drainFn) {
drainValue = drainFn(nativePtr);
}
// empty file, no need for native back-and-forth on this
if (chunkSize === 0) {
+ deinit && nativePtr && @enqueueJob(deinit, nativePtr);
+
if ((drainValue?.byteLength ?? 0) > 0) {
- deinit && nativePtr && @enqueueJob(deinit, nativePtr);
return {
start(controller) {
controller.enqueue(drainValue);
@@ -1981,9 +1989,8 @@ function lazyLoadStream(stream, autoAllocateChunkSize) {
type: "bytes",
};
}
- var instance = new Prototype(nativePtr, chunkSize, drainValue);
- Prototype.registry.register(instance, nativePtr);
- return instance;
+
+ return new Prototype(nativePtr, chunkSize, drainValue);
}
function readableStreamIntoArray(stream) {