diff --git a/src/security/tls_session.cpp b/src/security/tls_session.cpp
index cf3fa7043d058977c35373b6681a4f368d1c5d82..423eca605ab5da37a6d35777d134d0ac9296eb55 100644
--- a/src/security/tls_session.cpp
+++ b/src/security/tls_session.cpp
@@ -962,16 +962,17 @@ TlsSession::flushRxQueue()
     // Loop on offset-ordered received packet until a discontinuity in sequence number
     while (item != std::end(reorderBuffer_) and item->first <= next_offset) {
         auto pkt_offset = item->first;
-        auto& pkt = item->second;
+        auto pkt = std::move(item->second);
+
+        // Remove item before unlocking to not trash the item' relationship
+        next_offset = pkt_offset + 1;
+        item = reorderBuffer_.erase(item);
 
         if (callbacks_.onRxData) {
             lk.unlock();
             callbacks_.onRxData(std::move(pkt));
             lk.lock();
         }
-
-        next_offset = pkt_offset + 1;
-        item = reorderBuffer_.erase(item);
     }
 
     gapOffset_ = std::max(gapOffset_, next_offset);