diff options
author | 2022-11-25 22:52:32 -0800 | |
---|---|---|
committer | 2022-11-25 22:52:32 -0800 | |
commit | ac7ad4d5c606cd6fd2d13fd0510d18449ce6e899 (patch) | |
tree | 5da02a5ec134c086d070b454bac5aafc626c5da5 /src/bun.js/builtins/js/ReadableStreamInternals.js | |
parent | 0b27a26edbac5d77c32669f5f5aaf9a032337e3c (diff) | |
download | bun-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.js | 21 |
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) { |