Commit 32dd5470 authored by Andreas Haas's avatar Andreas Haas Committed by Commit Bot

[wasm][streaming] Avoid aborting the stream after it finished

With WebAssembly streaming compilation it is possible that FinishStream
indirectly calls AbortStream. This had the effect that while
FinishStream fulfilled the promise, AbortStream disposed the promise
by removing the compile job from the wasm engine and thereby deallocated
AsyncCompileJob and all the state that belongs to it. Without that
state, FinishStream could not finish fulfilling the promise correctly.

With this CL the streaming decoder remembers that the stream has
already been finished. When the stream has been finished, all calls to
Abort get ignored.

The regression test for this issue requires the Chrome embedding, see
https://crrev.com/c/2368359

R=clemensb@chromium.org

Bug: chromium:1117258
Change-Id: Ifc28a1ee38c228b051c4d7d85b305fe2a721fa1f
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2367858
Commit-Queue: Andreas Haas <ahaas@chromium.org>
Reviewed-by: 's avatarClemens Backes <clemensb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#69549}
parent 06feff48
......@@ -214,6 +214,7 @@ class V8_EXPORT_PRIVATE AsyncStreamingDecoder : public StreamingDecoder {
bool code_section_processed_ = false;
uint32_t module_offset_ = 0;
size_t total_size_ = 0;
bool stream_finished_ = false;
// We need wire bytes in an array for deserializing cached modules.
std::vector<uint8_t> wire_bytes_for_deserializing_;
......@@ -258,6 +259,8 @@ size_t AsyncStreamingDecoder::DecodingState::ReadBytes(
void AsyncStreamingDecoder::Finish() {
TRACE_STREAMING("Finish\n");
DCHECK(!stream_finished_);
stream_finished_ = true;
if (!ok()) return;
if (deserializing()) {
......@@ -298,6 +301,8 @@ void AsyncStreamingDecoder::Finish() {
void AsyncStreamingDecoder::Abort() {
TRACE_STREAMING("Abort\n");
if (stream_finished_) return;
stream_finished_ = true;
if (!ok()) return; // Failed already.
processor_->OnAbort();
Fail();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment