aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/builtins/cpp/ReadableStreamInternalsBuiltins.cpp
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/cpp/ReadableStreamInternalsBuiltins.cpp
parent0b27a26edbac5d77c32669f5f5aaf9a032337e3c (diff)
downloadbun-ac7ad4d5c606cd6fd2d13fd0510d18449ce6e899.tar.gz
bun-ac7ad4d5c606cd6fd2d13fd0510d18449ce6e899.tar.zst
bun-ac7ad4d5c606cd6fd2d13fd0510d18449ce6e899.zip
Fix double free
Diffstat (limited to 'src/bun.js/builtins/cpp/ReadableStreamInternalsBuiltins.cpp')
-rw-r--r--src/bun.js/builtins/cpp/ReadableStreamInternalsBuiltins.cpp22
1 files changed, 14 insertions, 8 deletions
diff --git a/src/bun.js/builtins/cpp/ReadableStreamInternalsBuiltins.cpp b/src/bun.js/builtins/cpp/ReadableStreamInternalsBuiltins.cpp
index 1e9e81519..753e1a7c2 100644
--- a/src/bun.js/builtins/cpp/ReadableStreamInternalsBuiltins.cpp
+++ b/src/bun.js/builtins/cpp/ReadableStreamInternalsBuiltins.cpp
@@ -2268,7 +2268,7 @@ const char* const s_readableStreamInternalsReadableStreamDefaultControllerCanClo
const JSC::ConstructAbility s_readableStreamInternalsLazyLoadStreamCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const JSC::ConstructorKind s_readableStreamInternalsLazyLoadStreamCodeConstructorKind = JSC::ConstructorKind::None;
const JSC::ImplementationVisibility s_readableStreamInternalsLazyLoadStreamCodeImplementationVisibility = JSC::ImplementationVisibility::Public;
-const int s_readableStreamInternalsLazyLoadStreamCodeLength = 3703;
+const int s_readableStreamInternalsLazyLoadStreamCodeLength = 3827;
static const JSC::Intrinsic s_readableStreamInternalsLazyLoadStreamCodeIntrinsic = JSC::NoIntrinsic;
const char* const s_readableStreamInternalsLazyLoadStreamCode =
"(function (stream, autoAllocateChunkSize) {\n" \
@@ -2328,9 +2328,11 @@ const char* const s_readableStreamInternalsLazyLoadStreamCode =
" return handleResult(result, controller, view);\n" \
" }\n" \
"\n" \
+ " const registry = deinit ? new FinalizationRegistry(deinit) : null;\n" \
" Prototype = class NativeReadableStreamSource {\n" \
" constructor(tag, autoAllocateChunkSize, drainValue) {\n" \
" this.#tag = tag;\n" \
+ " this.#cancellationToken = {};\n" \
" this.pull = this.#pull.bind(this);\n" \
" this.cancel = this.#cancel.bind(this);\n" \
" this.autoAllocateChunkSize = autoAllocateChunkSize;\n" \
@@ -2338,11 +2340,15 @@ const char* const s_readableStreamInternalsLazyLoadStreamCode =
" if (drainValue !== @undefined) {\n" \
" this.start = (controller) => {\n" \
" controller.enqueue(drainValue);\n" \
- " console.log(\"chunkSize\", chunkSize);\n" \
" };\n" \
" }\n" \
+ "\n" \
+ " if (registry) {\n" \
+ " registry.register(this, tag, this.#cancellationToken);\n" \
+ " }\n" \
" }\n" \
"\n" \
+ " #cancellationToken;\n" \
" pull;\n" \
" cancel;\n" \
" start;\n" \
@@ -2368,10 +2374,10 @@ const char* const s_readableStreamInternalsLazyLoadStreamCode =
" #cancel(reason) {\n" \
" var tag = this.#tag;\n" \
" setRefOrUnref && setRefOrUnref(tag, false);\n" \
+ " registry.unregister(this.#cancellationToken);\n" \
" cancel(tag, reason);\n" \
" }\n" \
" static deinit = deinit;\n" \
- " static registry = new FinalizationRegistry(deinit);\n" \
" static drain = drain;\n" \
" };\n" \
" @lazyStreamPrototypeMap.@set(nativeType, Prototype);\n" \
@@ -2379,15 +2385,16 @@ const char* const s_readableStreamInternalsLazyLoadStreamCode =
"\n" \
" const chunkSize = Prototype.startSync(nativePtr, autoAllocateChunkSize);\n" \
" var drainValue;\n" \
- " const drainFn = Prototype.drain;\n" \
+ " const {drain: drainFn, deinit: deinitFn} = Prototype;\n" \
" if (drainFn) {\n" \
" drainValue = drainFn(nativePtr);\n" \
" }\n" \
"\n" \
" //\n" \
" if (chunkSize === 0) {\n" \
+ " deinit && nativePtr && @enqueueJob(deinit, nativePtr);\n" \
+ "\n" \
" if ((drainValue?.byteLength ?? 0) > 0) {\n" \
- " deinit && nativePtr && @enqueueJob(deinit, nativePtr);\n" \
" return {\n" \
" start(controller) {\n" \
" controller.enqueue(drainValue);\n" \
@@ -2404,9 +2411,8 @@ const char* const s_readableStreamInternalsLazyLoadStreamCode =
" type: \"bytes\",\n" \
" };\n" \
" }\n" \
- " var instance = new Prototype(nativePtr, chunkSize, drainValue);\n" \
- " Prototype.registry.register(instance, nativePtr);\n" \
- " return instance;\n" \
+ "\n" \
+ " return new Prototype(nativePtr, chunkSize, drainValue);\n" \
"})\n" \
;