Changeset 239256 in webkit
- Timestamp:
- Dec 15, 2018 9:49:01 PM (5 years ago)
- Location:
- trunk/Source
- Files:
-
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r239255 r239256 1 2018-12-15 Yusuke Suzuki <yusukesuzuki@slowstart.org> 2 3 Null pointer dereference in JSC::WriteBarrierBase() 4 https://bugs.webkit.org/show_bug.cgi?id=191252 5 6 Reviewed by Keith Miller. 7 8 JSPromiseDeferred::create can return nullptr and an exception if stack overflow happens. 9 We would like to make it RELEASE_ASSERT since the current module mechanism is not immune 10 to stack overflow. 11 12 This patch renames JSPromiseDeferred::create to JSPromiseDeferred::tryCreate to tell that 13 it can return nullptr. And we insert error checks or assertions after this call. 14 15 * jsc.cpp: 16 (GlobalObject::moduleLoaderImportModule): 17 (GlobalObject::moduleLoaderFetch): 18 * runtime/Completion.cpp: 19 (JSC::rejectPromise): 20 * runtime/JSGlobalObjectFunctions.cpp: 21 (JSC::globalFuncImportModule): 22 * runtime/JSInternalPromiseDeferred.cpp: 23 (JSC::JSInternalPromiseDeferred::tryCreate): 24 (JSC::JSInternalPromiseDeferred::create): Deleted. 25 * runtime/JSInternalPromiseDeferred.h: 26 * runtime/JSModuleLoader.cpp: 27 (JSC::JSModuleLoader::importModule): 28 (JSC::JSModuleLoader::resolve): 29 (JSC::JSModuleLoader::fetch): 30 (JSC::moduleLoaderParseModule): 31 * runtime/JSPromise.h: 32 * runtime/JSPromiseDeferred.cpp: 33 (JSC::JSPromiseDeferred::tryCreate): 34 * runtime/JSPromiseDeferred.h: 35 * wasm/js/WebAssemblyPrototype.cpp: 36 (JSC::webAssemblyCompileFunc): 37 (JSC::webAssemblyInstantiateFunc): 38 (JSC::webAssemblyCompileStreamingInternal): 39 (JSC::webAssemblyInstantiateStreamingInternal): 40 1 41 2018-12-15 Darin Adler <darin@apple.com> 2 42 -
trunk/Source/JavaScriptCore/jsc.cpp
r239254 r239256 807 807 auto throwScope = DECLARE_THROW_SCOPE(vm); 808 808 809 auto* deferred = JSInternalPromiseDeferred:: create(exec, globalObject);809 auto* deferred = JSInternalPromiseDeferred::tryCreate(exec, globalObject); 810 810 RETURN_IF_EXCEPTION(throwScope, nullptr); 811 811 … … 1001 1001 VM& vm = globalObject->vm(); 1002 1002 auto throwScope = DECLARE_THROW_SCOPE(vm); 1003 JSInternalPromiseDeferred* deferred = JSInternalPromiseDeferred:: create(exec, globalObject);1003 JSInternalPromiseDeferred* deferred = JSInternalPromiseDeferred::tryCreate(exec, globalObject); 1004 1004 RETURN_IF_EXCEPTION(throwScope, nullptr); 1005 1005 -
trunk/Source/JavaScriptCore/runtime/Completion.cpp
r236904 r239256 155 155 JSValue exception = scope.exception()->value(); 156 156 scope.clearException(); 157 JSInternalPromiseDeferred* deferred = JSInternalPromiseDeferred::create(exec, globalObject); 157 JSInternalPromiseDeferred* deferred = JSInternalPromiseDeferred::tryCreate(exec, globalObject); 158 scope.releaseAssertNoException(); 158 159 deferred->reject(exec, exception); 160 scope.releaseAssertNoException(); 159 161 return deferred->promise(); 160 162 } -
trunk/Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp
r238391 r239256 788 788 auto* globalObject = exec->lexicalGlobalObject(); 789 789 790 auto* promise = JSPromiseDeferred:: create(exec, globalObject);790 auto* promise = JSPromiseDeferred::tryCreate(exec, globalObject); 791 791 RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); 792 792 -
trunk/Source/JavaScriptCore/runtime/JSInternalPromiseDeferred.cpp
r236372 r239256 38 38 const ClassInfo JSInternalPromiseDeferred::s_info = { "JSInternalPromiseDeferred", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(JSInternalPromiseDeferred) }; 39 39 40 JSInternalPromiseDeferred* JSInternalPromiseDeferred:: create(ExecState* exec, JSGlobalObject* globalObject)40 JSInternalPromiseDeferred* JSInternalPromiseDeferred::tryCreate(ExecState* exec, JSGlobalObject* globalObject) 41 41 { 42 42 VM& vm = exec->vm(); -
trunk/Source/JavaScriptCore/runtime/JSInternalPromiseDeferred.h
r214218 r239256 37 37 static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal; 38 38 39 JS_EXPORT_PRIVATE static JSInternalPromiseDeferred* create(ExecState*, JSGlobalObject*);39 JS_EXPORT_PRIVATE static JSInternalPromiseDeferred* tryCreate(ExecState*, JSGlobalObject*); 40 40 41 41 static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) -
trunk/Source/JavaScriptCore/runtime/JSModuleLoader.cpp
r238391 r239256 239 239 RELEASE_AND_RETURN(throwScope, globalObject->globalObjectMethodTable()->moduleLoaderImportModule(globalObject, exec, this, moduleName, parameters, referrer)); 240 240 241 auto* deferred = JSInternalPromiseDeferred:: create(exec, globalObject);241 auto* deferred = JSInternalPromiseDeferred::tryCreate(exec, globalObject); 242 242 RETURN_IF_EXCEPTION(throwScope, nullptr); 243 243 … … 272 272 auto throwScope = DECLARE_THROW_SCOPE(vm); 273 273 274 JSInternalPromiseDeferred* deferred = JSInternalPromiseDeferred:: create(exec, exec->lexicalGlobalObject());274 JSInternalPromiseDeferred* deferred = JSInternalPromiseDeferred::tryCreate(exec, exec->lexicalGlobalObject()); 275 275 RETURN_IF_EXCEPTION(throwScope, nullptr); 276 276 … … 302 302 RELEASE_AND_RETURN(throwScope, globalObject->globalObjectMethodTable()->moduleLoaderFetch(globalObject, exec, this, key, parameters, scriptFetcher)); 303 303 304 JSInternalPromiseDeferred* deferred = JSInternalPromiseDeferred:: create(exec, globalObject);304 JSInternalPromiseDeferred* deferred = JSInternalPromiseDeferred::tryCreate(exec, globalObject); 305 305 RETURN_IF_EXCEPTION(throwScope, nullptr); 306 306 … … 363 363 auto throwScope = DECLARE_THROW_SCOPE(vm); 364 364 365 JSInternalPromiseDeferred* deferred = JSInternalPromiseDeferred:: create(exec, exec->lexicalGlobalObject());365 JSInternalPromiseDeferred* deferred = JSInternalPromiseDeferred::tryCreate(exec, exec->lexicalGlobalObject()); 366 366 RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); 367 367 -
trunk/Source/JavaScriptCore/runtime/JSPromise.h
r236372 r239256 32 32 class JSPromise : public JSNonFinalObject { 33 33 public: 34 typedef JSNonFinalObject Base;34 using Base = JSNonFinalObject; 35 35 36 36 static JSPromise* create(VM&, Structure*); 37 struct JSPromiseAndCallbacks {38 JSPromise* promise;39 JSFunction* resolve;40 JSFunction* reject;41 };42 static JSPromiseAndCallbacks createWithCallbacks(VM&, Structure*);43 44 37 static Structure* createStructure(VM&, JSGlobalObject*, JSValue); 45 38 -
trunk/Source/JavaScriptCore/runtime/JSPromiseDeferred.cpp
r236372 r239256 67 67 } 68 68 69 JSPromiseDeferred* JSPromiseDeferred:: create(ExecState* exec, JSGlobalObject* globalObject)69 JSPromiseDeferred* JSPromiseDeferred::tryCreate(ExecState* exec, JSGlobalObject* globalObject) 70 70 { 71 71 VM& vm = exec->vm(); -
trunk/Source/JavaScriptCore/runtime/JSPromiseDeferred.h
r236372 r239256 50 50 static DeferredData createDeferredData(ExecState*, JSGlobalObject*, JSPromiseConstructor*); 51 51 52 JS_EXPORT_PRIVATE static JSPromiseDeferred* create(ExecState*, JSGlobalObject*);52 JS_EXPORT_PRIVATE static JSPromiseDeferred* tryCreate(ExecState*, JSGlobalObject*); 53 53 JS_EXPORT_PRIVATE static JSPromiseDeferred* create(VM&, JSPromise*, JSFunction* resolve, JSFunction* reject); 54 54 -
trunk/Source/JavaScriptCore/wasm/js/WebAssemblyPrototype.cpp
r235420 r239256 116 116 auto* globalObject = exec->lexicalGlobalObject(); 117 117 118 JSPromiseDeferred* promise = JSPromiseDeferred:: create(exec, globalObject);118 JSPromiseDeferred* promise = JSPromiseDeferred::tryCreate(exec, globalObject); 119 119 RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); 120 120 … … 262 262 auto* globalObject = exec->lexicalGlobalObject(); 263 263 264 JSPromiseDeferred* promise = JSPromiseDeferred:: create(exec, globalObject);264 JSPromiseDeferred* promise = JSPromiseDeferred::tryCreate(exec, globalObject); 265 265 RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); 266 266 … … 307 307 auto catchScope = DECLARE_CATCH_SCOPE(vm); 308 308 309 JSPromiseDeferred* promise = JSPromiseDeferred:: create(exec, globalObject);309 JSPromiseDeferred* promise = JSPromiseDeferred::tryCreate(exec, globalObject); 310 310 311 311 Vector<Strong<JSCell>> dependencies; … … 331 331 auto* globalObject = exec->lexicalGlobalObject(); 332 332 333 JSPromiseDeferred* promise = JSPromiseDeferred::create(exec, globalObject); 334 333 JSPromiseDeferred* promise = JSPromiseDeferred::tryCreate(exec, globalObject); 335 334 RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); 336 335 { -
trunk/Source/WebCore/ChangeLog
r239255 r239256 1 2018-12-15 Yusuke Suzuki <yusukesuzuki@slowstart.org> 2 3 Null pointer dereference in JSC::WriteBarrierBase() 4 https://bugs.webkit.org/show_bug.cgi?id=191252 5 6 Reviewed by Keith Miller. 7 8 * bindings/js/JSCustomElementRegistryCustom.cpp: 9 (WebCore::JSCustomElementRegistry::whenDefined): 10 * bindings/js/JSDOMPromiseDeferred.cpp: 11 (WebCore::createDeferredPromise): 12 * bindings/js/JSDOMPromiseDeferred.h: 13 (WebCore::DeferredPromise::create): 14 (WebCore::callPromiseFunction): 15 * bindings/js/JSDOMWindowBase.cpp: 16 (WebCore::JSDOMWindowBase::moduleLoaderFetch): 17 (WebCore::JSDOMWindowBase::moduleLoaderImportModule): 18 * bindings/js/ScriptModuleLoader.cpp: 19 (WebCore::ScriptModuleLoader::fetch): 20 (WebCore::rejectPromise): 21 1 22 2018-12-15 Darin Adler <darin@apple.com> 2 23 -
trunk/Source/WebCore/bindings/js/JSCustomElementRegistryCustom.cpp
r233245 r239256 208 208 209 209 ASSERT(globalObject()); 210 auto promiseDeferred = JSPromiseDeferred:: create(&state, globalObject());211 ASSERT(promiseDeferred);210 auto promiseDeferred = JSPromiseDeferred::tryCreate(&state, globalObject()); 211 RELEASE_ASSERT(promiseDeferred); 212 212 JSValue promise = whenDefinedPromise(state, *globalObject(), wrapped(), *promiseDeferred); 213 213 -
trunk/Source/WebCore/bindings/js/JSDOMPromiseDeferred.cpp
r232337 r239256 192 192 Ref<DeferredPromise> createDeferredPromise(JSC::ExecState& state, JSDOMWindow& domWindow) 193 193 { 194 JSC::JSPromiseDeferred* deferred = JSC::JSPromiseDeferred:: create(&state, &domWindow);194 JSC::JSPromiseDeferred* deferred = JSC::JSPromiseDeferred::tryCreate(&state, &domWindow); 195 195 // deferred can only be null in workers. 196 ASSERT(deferred);196 RELEASE_ASSERT(deferred); 197 197 return DeferredPromise::create(domWindow, *deferred); 198 198 } -
trunk/Source/WebCore/bindings/js/JSDOMPromiseDeferred.h
r232156 r239256 45 45 static RefPtr<DeferredPromise> create(JSC::ExecState& state, JSDOMGlobalObject& globalObject, Mode mode = Mode::ClearPromiseOnResolve) 46 46 { 47 auto* promiseDeferred = JSC::JSPromiseDeferred:: create(&state, &globalObject);47 auto* promiseDeferred = JSC::JSPromiseDeferred::tryCreate(&state, &globalObject); 48 48 if (!promiseDeferred) 49 49 return nullptr; … … 271 271 272 272 auto& globalObject = callerGlobalObject(state); 273 JSC::JSPromiseDeferred* promiseDeferred = JSC::JSPromiseDeferred:: create(&state, &globalObject);273 JSC::JSPromiseDeferred* promiseDeferred = JSC::JSPromiseDeferred::tryCreate(&state, &globalObject); 274 274 275 275 // promiseDeferred can be null when terminating a Worker abruptly. … … 291 291 292 292 auto& globalObject = callerGlobalObject(state); 293 JSC::JSPromiseDeferred* promiseDeferred = JSC::JSPromiseDeferred:: create(&state, &globalObject);293 JSC::JSPromiseDeferred* promiseDeferred = JSC::JSPromiseDeferred::tryCreate(&state, &globalObject); 294 294 295 295 // promiseDeferred can be null when terminating a Worker abruptly. -
trunk/Source/WebCore/bindings/js/JSDOMWindowBase.cpp
r237266 r239256 313 313 JSC::JSInternalPromise* JSDOMWindowBase::moduleLoaderFetch(JSC::JSGlobalObject* globalObject, JSC::ExecState* exec, JSC::JSModuleLoader* moduleLoader, JSC::JSValue moduleKey, JSC::JSValue parameters, JSC::JSValue scriptFetcher) 314 314 { 315 VM& vm = exec->vm(); 316 auto scope = DECLARE_THROW_SCOPE(vm); 315 317 JSDOMWindowBase* thisObject = JSC::jsCast<JSDOMWindowBase*>(globalObject); 316 318 if (RefPtr<Document> document = thisObject->wrapped().document()) 317 return document->moduleLoader()->fetch(globalObject, exec, moduleLoader, moduleKey, parameters, scriptFetcher); 318 JSC::JSInternalPromiseDeferred* deferred = JSC::JSInternalPromiseDeferred::create(exec, globalObject); 319 return deferred->reject(exec, jsUndefined()); 319 RELEASE_AND_RETURN(scope, document->moduleLoader()->fetch(globalObject, exec, moduleLoader, moduleKey, parameters, scriptFetcher)); 320 JSC::JSInternalPromiseDeferred* deferred = JSC::JSInternalPromiseDeferred::tryCreate(exec, globalObject); 321 RETURN_IF_EXCEPTION(scope, nullptr); 322 RELEASE_AND_RETURN(scope, deferred->reject(exec, jsUndefined())); 320 323 } 321 324 … … 330 333 JSC::JSInternalPromise* JSDOMWindowBase::moduleLoaderImportModule(JSC::JSGlobalObject* globalObject, JSC::ExecState* exec, JSC::JSModuleLoader* moduleLoader, JSC::JSString* moduleName, JSC::JSValue parameters, const JSC::SourceOrigin& sourceOrigin) 331 334 { 335 VM& vm = exec->vm(); 336 auto scope = DECLARE_THROW_SCOPE(vm); 332 337 JSDOMWindowBase* thisObject = JSC::jsCast<JSDOMWindowBase*>(globalObject); 333 338 if (RefPtr<Document> document = thisObject->wrapped().document()) 334 return document->moduleLoader()->importModule(globalObject, exec, moduleLoader, moduleName, parameters, sourceOrigin); 335 JSC::JSInternalPromiseDeferred* deferred = JSC::JSInternalPromiseDeferred::create(exec, globalObject); 336 return deferred->reject(exec, jsUndefined()); 339 RELEASE_AND_RETURN(scope, document->moduleLoader()->importModule(globalObject, exec, moduleLoader, moduleName, parameters, sourceOrigin)); 340 JSC::JSInternalPromiseDeferred* deferred = JSC::JSInternalPromiseDeferred::tryCreate(exec, globalObject); 341 RETURN_IF_EXCEPTION(scope, nullptr); 342 RELEASE_AND_RETURN(scope, deferred->reject(exec, jsUndefined())); 337 343 } 338 344 -
trunk/Source/WebCore/bindings/js/ScriptModuleLoader.cpp
r233122 r239256 147 147 148 148 auto& globalObject = *JSC::jsCast<JSDOMGlobalObject*>(jsGlobalObject); 149 auto& jsPromise = *JSC::JSInternalPromiseDeferred::create(exec, &globalObject); 150 auto deferred = DeferredPromise::create(globalObject, jsPromise); 149 auto* jsPromise = JSC::JSInternalPromiseDeferred::tryCreate(exec, &globalObject); 150 RELEASE_ASSERT(jsPromise); 151 auto deferred = DeferredPromise::create(globalObject, *jsPromise); 151 152 if (moduleKeyValue.isSymbol()) { 152 153 deferred->reject(TypeError, "Symbol module key should be already fulfilled with the inlined resource."_s); 153 return jsPromise .promise();154 return jsPromise->promise(); 154 155 } 155 156 156 157 if (!moduleKeyValue.isString()) { 157 158 deferred->reject(TypeError, "Module key is not Symbol or String."_s); 158 return jsPromise .promise();159 return jsPromise->promise(); 159 160 } 160 161 … … 164 165 if (!completedURL.isValid()) { 165 166 deferred->reject(TypeError, "Module key is a valid URL."_s); 166 return jsPromise .promise();167 return jsPromise->promise(); 167 168 } 168 169 … … 177 178 m_loaders.remove(WTFMove(loader)); 178 179 rejectToPropagateNetworkError(deferred.get(), ModuleFetchFailureKind::WasErrored, "Importing a module script failed."_s); 179 return jsPromise .promise();180 } 181 182 return jsPromise .promise();180 return jsPromise->promise(); 181 } 182 183 return jsPromise->promise(); 183 184 } 184 185 … … 215 216 static JSC::JSInternalPromise* rejectPromise(JSC::ExecState& state, JSDOMGlobalObject& globalObject, ExceptionCode ec, ASCIILiteral message) 216 217 { 217 auto& jsPromise = *JSC::JSInternalPromiseDeferred::create(&state, &globalObject); 218 auto deferred = DeferredPromise::create(globalObject, jsPromise); 218 auto* jsPromise = JSC::JSInternalPromiseDeferred::tryCreate(&state, &globalObject); 219 RELEASE_ASSERT(jsPromise); 220 auto deferred = DeferredPromise::create(globalObject, *jsPromise); 219 221 deferred->reject(ec, WTFMove(message)); 220 return jsPromise .promise();222 return jsPromise->promise(); 221 223 } 222 224
Note: See TracChangeset
for help on using the changeset viewer.