diff options
author | 2023-07-17 04:18:00 -0700 | |
---|---|---|
committer | 2023-07-17 04:18:43 -0700 | |
commit | 55b5aa3571b25fb081d36b007ff6d8bd96151340 (patch) | |
tree | 1d70e2f386f84634e018ae94516920dd285790da | |
parent | 6ca20424d6aee5f68a1383293105473406faad81 (diff) | |
download | bun-55b5aa3571b25fb081d36b007ff6d8bd96151340.tar.gz bun-55b5aa3571b25fb081d36b007ff6d8bd96151340.tar.zst bun-55b5aa3571b25fb081d36b007ff6d8bd96151340.zip |
Fix speculative crashes in console.log(formData) and console.log(headers)
-rw-r--r-- | src/bun.js/bindings/webcore/JSDOMFormData.cpp | 26 | ||||
-rw-r--r-- | src/bun.js/bindings/webcore/JSFetchHeaders.cpp | 28 |
2 files changed, 24 insertions, 30 deletions
diff --git a/src/bun.js/bindings/webcore/JSDOMFormData.cpp b/src/bun.js/bindings/webcore/JSDOMFormData.cpp index 181b20e45..ca91bd83e 100644 --- a/src/bun.js/bindings/webcore/JSDOMFormData.cpp +++ b/src/bun.js/bindings/webcore/JSDOMFormData.cpp @@ -533,16 +533,26 @@ static inline JSC::EncodedJSValue jsDOMFormDataPrototypeFunction_toJSONBody(JSC: if (seenKeys.contains(key)) { JSValue jsValue = obj->getDirect(vm, ident); if (jsValue.isString() || jsValue.inherits<JSBlob>()) { - GCDeferralContext deferralContext(lexicalGlobalObject->vm()); - JSC::ObjectInitializationScope initializationScope(lexicalGlobalObject->vm()); + // Make sure this runs before the deferral scope is called. + JSValue resultValue = toJSValue(value); + ensureStillAliveHere(resultValue); - JSC::JSArray* array = JSC::JSArray::tryCreateUninitializedRestricted( - initializationScope, &deferralContext, - lexicalGlobalObject->arrayStructureForIndexingTypeDuringAllocation(JSC::ArrayWithContiguous), - 2); + JSC::JSArray* array = nullptr; + + { + GCDeferralContext deferralContext(lexicalGlobalObject->vm()); + JSC::ObjectInitializationScope initializationScope(lexicalGlobalObject->vm()); + + array = JSC::JSArray::tryCreateUninitializedRestricted( + initializationScope, &deferralContext, + lexicalGlobalObject->arrayStructureForIndexingTypeDuringAllocation(JSC::ArrayWithContiguous), + 2); + RELEASE_ASSERT(array); + + array->initializeIndex(initializationScope, 0, jsValue); + array->initializeIndex(initializationScope, 1, resultValue); + } - array->initializeIndex(initializationScope, 0, jsValue); - array->initializeIndex(initializationScope, 1, toJSValue(value)); obj->putDirect(vm, ident, array, 0); } else if (jsValue.isObject() && jsValue.getObject()->inherits<JSC::JSArray>()) { JSC::JSArray* array = jsCast<JSC::JSArray*>(jsValue.getObject()); diff --git a/src/bun.js/bindings/webcore/JSFetchHeaders.cpp b/src/bun.js/bindings/webcore/JSFetchHeaders.cpp index 6bea5dc84..bb9a14833 100644 --- a/src/bun.js/bindings/webcore/JSFetchHeaders.cpp +++ b/src/bun.js/bindings/webcore/JSFetchHeaders.cpp @@ -416,31 +416,15 @@ static inline JSC::EncodedJSValue jsFetchHeadersPrototypeFunction_toJSONBody(JSC size_t count = values.size(); if (count > 0) { - JSC::JSArray* array = nullptr; - GCDeferralContext deferralContext(lexicalGlobalObject->vm()); - JSC::ObjectInitializationScope initializationScope(lexicalGlobalObject->vm()); - if ((array = JSC::JSArray::tryCreateUninitializedRestricted( - initializationScope, &deferralContext, - lexicalGlobalObject->arrayStructureForIndexingTypeDuringAllocation(JSC::ArrayWithContiguous), - count))) { - for (unsigned i = 0; i < count; ++i) { - array->initializeIndex(initializationScope, i, jsString(vm, values[i])); - RETURN_IF_EXCEPTION(throwScope, JSValue::encode(jsUndefined())); - } - } else { - array = constructEmptyArray(lexicalGlobalObject, nullptr, count); - RETURN_IF_EXCEPTION(throwScope, JSValue::encode(jsUndefined())); - if (!array) { - throwOutOfMemoryError(lexicalGlobalObject, throwScope); - return JSValue::encode(jsUndefined()); - } - for (unsigned i = 0; i < count; ++i) { - array->putDirectIndex(lexicalGlobalObject, i, jsString(vm, values[i])); - RETURN_IF_EXCEPTION(throwScope, JSValue::encode(jsUndefined())); - } + JSC::JSArray* array = constructEmptyArray(lexicalGlobalObject, nullptr, count); + RETURN_IF_EXCEPTION(throwScope, JSValue::encode(jsUndefined())); + + for (size_t i = 0; i < count; ++i) { + array->putDirectIndex(lexicalGlobalObject, i, jsString(vm, values[i])); RETURN_IF_EXCEPTION(throwScope, JSValue::encode(jsUndefined())); } + RETURN_IF_EXCEPTION(throwScope, JSValue::encode(jsUndefined())); obj->putDirect(vm, JSC::Identifier::fromString(vm, httpHeaderNameString(HTTPHeaderName::SetCookie).toStringWithoutCopying()), array, 0); } } |