Commit 87e5b407 authored by Andrii Grynenko's avatar Andrii Grynenko Committed by Facebook Github Bot 6

Fix a race in Promise::setTry

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
parent 9b311838
......@@ -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;
}
......
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