From c7c9c8c8c15659c567921b86ff175fdfc2c5cef1 Mon Sep 17 00:00:00 2001 From: Christoph Herzog Date: Thu, 2 Mar 2023 09:59:01 +0100 Subject: [PATCH] fix(wasi): WsaiThreadRunGuard: Don't overwrite finished state Do not overwrite the finished state if the task already has a result. Prevents mistakenly propagating errors from the WasiThreadRunGuard drop implementation. --- lib/wasi/src/os/task/task_join_handle.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/wasi/src/os/task/task_join_handle.rs b/lib/wasi/src/os/task/task_join_handle.rs index be56cadb9e8..62b534caf05 100644 --- a/lib/wasi/src/os/task/task_join_handle.rs +++ b/lib/wasi/src/os/task/task_join_handle.rs @@ -38,6 +38,14 @@ impl TaskStatus { _ => None, } } + + /// Returns `true` if the task status is [`Finished`]. + /// + /// [`Finished`]: TaskStatus::Finished + #[must_use] + pub fn is_finished(&self) -> bool { + matches!(self, Self::Finished(..)) + } } #[derive(thiserror::Error, Debug)] @@ -88,6 +96,11 @@ impl OwnedTaskStatus { /// Marks the task as finished. pub(super) fn set_finished(&self, res: Result>) { + // Don't overwrite a previous finished state. + if self.status().is_finished() { + return; + } + let inner = match res { Ok(code) => Ok(code), Err(err) => { @@ -98,7 +111,6 @@ impl OwnedTaskStatus { } } }; - self.watch.send(TaskStatus::Finished(inner)).ok(); }