Browse Source

LibThreading: Only run on_error callback when action wasn't canceled

This mirrors the same UAF protection for event loops used by the
on_complete callback.
kleines Filmröllchen 2 years ago
parent
commit
04b44a827a
1 changed files with 3 additions and 1 deletions
  1. 3 1
      Userland/Libraries/LibThreading/BackgroundAction.h

+ 3 - 1
Userland/Libraries/LibThreading/BackgroundAction.h

@@ -100,13 +100,15 @@ private:
                     error = result.release_error();
                     error = result.release_error();
 
 
                 m_promise->cancel(Error::from_errno(ECANCELED));
                 m_promise->cancel(Error::from_errno(ECANCELED));
-                if (m_on_error) {
+                if (!m_canceled && m_on_error) {
                     callback_scheduled = true;
                     callback_scheduled = true;
                     origin_event_loop->deferred_invoke([this, error = move(error)]() mutable {
                     origin_event_loop->deferred_invoke([this, error = move(error)]() mutable {
                         m_on_error(move(error));
                         m_on_error(move(error));
                         remove_from_parent();
                         remove_from_parent();
                     });
                     });
                     origin_event_loop->wake();
                     origin_event_loop->wake();
+                } else if (m_on_error) {
+                    m_on_error(move(error));
                 }
                 }
             }
             }