From bd8558804f8004745be647fc929785be8bb7f9a7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Blin?=
 <sebastien.blin@savoirfairelinux.com>
Date: Tue, 13 Aug 2019 09:43:51 -0400
Subject: [PATCH] p2p: answer to correct file transfer

If multiple transfers occurs at the same time, responses can come
with another order. So, we must check the id to get the correct
response.

Change-Id: Ica5d2f78fee6cfd385accc8cce6fff462dd4c4f8
---
 src/jamidht/p2p.cpp | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/jamidht/p2p.cpp b/src/jamidht/p2p.cpp
index c46656bb5e..c264a5a573 100644
--- a/src/jamidht/p2p.cpp
+++ b/src/jamidht/p2p.cpp
@@ -341,6 +341,10 @@ public:
         return responseReceived_;
     }
 
+    bool waitId(uint64_t id) {
+        return waitId_ == id;
+    }
+
     void addListener(const ListenerFunction& cb) {
         if (!connected_) {
             std::lock_guard<std::mutex> lk {listenersMutex_};
@@ -391,6 +395,7 @@ private:
         // Prepare connection request as a DHT message
         PeerConnectionMsg request;
         request.id = ValueIdDist()(parent_.account.rand); /* Random id for the message unicity */
+        waitId_ = request.id;
         request.addresses = {icemsg.str()};
         request.addresses.insert(request.addresses.end(), publicAddresses_.begin(), publicAddresses_.end());
 
@@ -512,6 +517,7 @@ private:
     std::atomic_bool responseReceived_ {false};
     std::condition_variable responseCV_{};
     PeerConnectionMsg response_;
+    uint64_t waitId_ {0};
     std::shared_ptr<dht::crypto::Certificate> peerCertificate_;
     std::shared_ptr<AbstractSocketEndpoint> peer_ep_;
     std::unique_ptr<PeerConnection> connection_;
@@ -857,9 +863,10 @@ DhtPeerConnector::Impl::onResponseMsg(PeerConnectionMsg&& response)
     JAMI_DBG() << account << "[CNX] rx DHT reply from " << response.from;
     std::lock_guard<std::mutex> lock(clientsMutex_);
     for (auto& client: clients_) {
-        // NOTE We can receives multiple files from one peer. So fill unanswered clients.
+        // NOTE We can receives multiple files from one peer. So fill unanswered clients with linked id.
         if (client.first.first == response.from
-            && client.second && !client.second->hasAlreadyAResponse()) {
+            && client.second && !client.second->hasAlreadyAResponse()
+            && client.second->waitId(response.id)) {
             client.second->onDhtResponse(std::move(response));
             break;
         }
-- 
GitLab