From 073071c634ab27ab3c2ec16237d4e1fd018f662e Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Mon, 5 Jul 2021 13:10:04 +0100 Subject: [PATCH] LibJS: Fix Promise constructor reject function argument If calling the executor function throws an exception, the return value of `vm.call()` will be an empty value, which we then passed as an argument to the reject function, which is incorrect - what it actually needs is the exception value. This stems from a misunderstanding of the spec I had at the time of implementing this - in their case, the exception value is part of the completion record returned by Call(). This error was previously masked as we would use a fallback (`value_or(js_undefined())` for the empty value argument, but that was removed in 57f7e6e. Fixes #8447. --- Userland/Libraries/LibJS/Runtime/PromiseConstructor.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/PromiseConstructor.cpp b/Userland/Libraries/LibJS/Runtime/PromiseConstructor.cpp index 16e46f6b52..531eebc1e6 100644 --- a/Userland/Libraries/LibJS/Runtime/PromiseConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/PromiseConstructor.cpp @@ -68,11 +68,11 @@ Value PromiseConstructor::construct(FunctionObject& new_target) auto [resolve_function, reject_function] = promise->create_resolving_functions(); - auto completion_value = vm.call(executor.as_function(), js_undefined(), &resolve_function, &reject_function); - if (vm.exception()) { + (void)vm.call(executor.as_function(), js_undefined(), &resolve_function, &reject_function); + if (auto* exception = vm.exception()) { vm.clear_exception(); vm.stop_unwind(); - [[maybe_unused]] auto result = vm.call(reject_function, js_undefined(), completion_value); + (void)vm.call(reject_function, js_undefined(), exception->value()); } return promise; }