Fix a race in Promise::setTry
authorAndrii Grynenko <andrii@fb.com>
Mon, 16 May 2016 21:06:54 +0000 (14:06 -0700)
committerFacebook Github Bot 6 <facebook-github-bot-6-bot@fb.com>
Mon, 16 May 2016 21:08:46 +0000 (14:08 -0700)
Summary:
This fixes a race which can only be exposed if Promise is owned by the same thread which was calling await and Promise is fulfilled from a different thread. What could happen then was:
1. Thread 2 fulfills the promise and thus saves the value and posts Baton.
2. Thread 1 wakes up, await returns and then Thread 1 destroys the Promise.
3. Promise destructor checks value_, which is still not null, so it tries to fulfil it with exception.

Reviewed By: spalamarchuk

Differential Revision: D3306969

fbshipit-source-id: adf799cfd7b75b0201fa675a9e44ac7c7c42ac95

folly/experimental/fibers/Promise-inl.h

index 95565d72ab4f03dbd23767ffbf078eb74c9e606e..108a2ac45325cf92690895bcc142b543f58b2fb1 100644 (file)
@@ -61,9 +61,10 @@ void Promise<T>::setTry(folly::Try<T>&& t) {
   throwIfFulfilled();
 
   *value_ = std::move(t);
+  value_ = nullptr;
+
   baton_->post();
 
-  value_ = nullptr;
   baton_ = nullptr;
 }