diff options
| author | Roman Smrž <roman.smrz@seznam.cz> | 2021-12-20 22:46:29 +0100 | 
|---|---|---|
| committer | Roman Smrž <roman.smrz@seznam.cz> | 2021-12-20 22:46:29 +0100 | 
| commit | 1c23f04929d90acd8bccce91ca974f4ef7fc0927 (patch) | |
| tree | 59f4ddba4d2c03e5bed95d05b05a3ca21d6d297e | |
| parent | 9528dcbf1a567c4fe0a2ecab7dbc7fc6f4a2d6ff (diff) | |
Pairing: properly reset state on restarted pairing
| -rw-r--r-- | src/pairing.cpp | 18 | 
1 files changed, 15 insertions, 3 deletions
| diff --git a/src/pairing.cpp b/src/pairing.cpp index c8e2d9f..0618a19 100644 --- a/src/pairing.cpp +++ b/src/pairing.cpp @@ -15,9 +15,11 @@  using namespace erebos;  using std::lock_guard; +using std::make_shared;  using std::runtime_error;  using std::scoped_lock;  using std::thread; +using std::unique_lock;  PairingServiceBase::~PairingServiceBase()  { @@ -69,10 +71,14 @@ void PairingServiceBase::handle(Context & ctx)  	lock_guard lock(stateLock);  	auto & state = peerStates.try_emplace(ctx.peer(), new State()).first->second; -	scoped_lock lock2(state->lock); +	unique_lock lock_state(state->lock);  	if (auto request = rec->item("request").asBinary()) { -		if (state->phase != StatePhase::NoPairing) +		if (state->phase >= StatePhase::PairingDone) { +			auto nstate = make_shared<State>(); +			lock_state = unique_lock(nstate->lock); +			state = move(nstate); +		} else if (state->phase != StatePhase::NoPairing)  			return;  		if (requestInitHook) @@ -158,9 +164,15 @@ void PairingServiceBase::requestPairing(UUID serviceId, const Peer & peer)  	if (!pid)  		throw runtime_error("Pairing request for peer without known identity"); -	lock_guard lock(stateLock); +	unique_lock lock(stateLock);  	auto & state = peerStates.try_emplace(peer, new State()).first->second; +	if (state->phase != StatePhase::NoPairing) { +		auto nstate = make_shared<State>(); +		lock = unique_lock(nstate->lock); +		state = move(nstate); +	} +  	state->phase = StatePhase::OurRequest;  	state->nonce.resize(32);  	RAND_bytes(state->nonce.data(), state->nonce.size()); |