LibWeb/Fetch: Don't crash when a fetch request times out

Previously, calling fetch with a signal object provided by
`AbortSignal.timeout()` would cause a crash when the signal timed out.

We now push a `TemporaryExecutionContext` to the stack when we invoke
the signal's abort steps, as an execution context is required when
calling native functions.
This commit is contained in:
Tim Ledbetter 2024-04-14 00:00:50 +01:00 committed by Andreas Kling
commit c6f070d29e
Notes: sideshowbarker 2024-07-17 02:56:25 +09:00
3 changed files with 16 additions and 0 deletions

View file

@ -0,0 +1 @@
PASS (didn't crash)

View file

@ -0,0 +1,12 @@
<!DOCTYPE html>
<script src="include.js"></script>
<script>
asyncTest(async done => {
try {
await fetch("about:srcdoc", { signal: AbortSignal.timeout(0) });
} finally {
println("PASS (didn't crash)");
done();
}
});
</script>

View file

@ -142,6 +142,9 @@ JS::NonnullGCPtr<JS::Promise> fetch(JS::VM& vm, RequestInfo const& input, Reques
// 3. Abort controller with requestObjects signals abort reason. // 3. Abort controller with requestObjects signals abort reason.
controller->abort(relevant_realm, request_object->signal()->reason()); controller->abort(relevant_realm, request_object->signal()->reason());
// AD-HOC: An execution context is required for Promise functions.
HTML::TemporaryExecutionContext execution_context { Bindings::host_defined_environment_settings_object(relevant_realm) };
// 4. Abort the fetch() call with p, request, responseObject, and requestObjects signals abort reason. // 4. Abort the fetch() call with p, request, responseObject, and requestObjects signals abort reason.
abort_fetch(relevant_realm, *promise_capability, request, response_object, request_object->signal()->reason()); abort_fetch(relevant_realm, *promise_capability, request, response_object, request_object->signal()->reason());
}); });