From 244adb371f587345c701c3a6fc5414d6c7d41587 Mon Sep 17 00:00:00 2001 From: davidot Date: Mon, 28 Feb 2022 23:43:07 +0100 Subject: [PATCH] LibJS: Spin the event loop until await has completed Before this the event loop was spun until the state of the promise was not pending, however it is possible that a promise has already been fulfilled/rejected when awaiting it. This could then lead to a crash below as it would not pump the event loop in such cases. Although this change is in LibJS, it really only impacts any usage of LibJS within a EventLoop environment such as LibWeb. Instead of checking the state of the promise we know check that success has a value which can only happen if either the fulfilled or rejected closure set up by await are called. --- Userland/Libraries/LibJS/Runtime/Completion.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Userland/Libraries/LibJS/Runtime/Completion.cpp b/Userland/Libraries/LibJS/Runtime/Completion.cpp index 70ad51fe71..c6548eaf09 100644 --- a/Userland/Libraries/LibJS/Runtime/Completion.cpp +++ b/Userland/Libraries/LibJS/Runtime/Completion.cpp @@ -98,7 +98,7 @@ ThrowCompletionOr await(GlobalObject& global_object, Value value) // running all queued promise jobs. // Note: This is not used by LibJS itself, and is performed for the embedder (i.e. LibWeb). if (Core::EventLoop::has_been_instantiated()) - Core::EventLoop::current().spin_until([&] { return promise->state() != Promise::State::Pending; }); + Core::EventLoop::current().spin_until([&] { return success.has_value(); }); // 8. Remove asyncContext from the execution context stack and restore the execution context that is at the top of the execution context stack as the running execution context. // NOTE: Since we don't push any EC, this step is not performed.