diff --git a/src/ringdht/sips_transport_ice.cpp b/src/ringdht/sips_transport_ice.cpp
index c30f553d788cba43e2c093a9c7292820e21be740..5146e3ab331be91ccf2c7e2a9c4e96290b060046 100644
--- a/src/ringdht/sips_transport_ice.cpp
+++ b/src/ringdht/sips_transport_ice.cpp
@@ -319,19 +319,19 @@ SipsIceTransport::handleEvents()
         auto& pck = *it;
         pj_pool_reset(rdata_.tp_info.pool);
         pj_gettimeofday(&rdata_.pkt_info.timestamp);
-        rdata_.pkt_info.len = pck.size();
-        std::copy_n(pck.data(), pck.size(), rdata_.pkt_info.packet);
+        rdata_.pkt_info.len = std::min(pck.size(), (size_t) PJSIP_MAX_PKT_LEN);
+        std::copy_n(pck.data(), rdata_.pkt_info.len, rdata_.pkt_info.packet);
         auto eaten = pjsip_tpmgr_receive_packet(trData_.base.tpmgr, &rdata_);
 
         // Uncomplet parsing? (may be a partial sip packet received)
-        if (eaten != rdata_.pkt_info.len) {
+        if (eaten != (pj_ssize_t)pck.size()) {
             auto npck_it = std::next(it);
             if (npck_it != rx.end()) {
                 // drop current packet, merge reminder with next one
                 auto& npck = *npck_it;
                 npck.insert(npck.begin(), pck.begin()+eaten, pck.end());
             } else {
-                // erase eaten part, keep reminder
+                // erase eaten part, keep remainder
                 pck.erase(pck.begin(), pck.begin()+eaten);
                 {
                     std::lock_guard<std::mutex> l(rxMtx_);
@@ -369,12 +369,7 @@ void
 SipsIceTransport::onRxData(std::vector<uint8_t>&& buf)
 {
     std::lock_guard<std::mutex> l(rxMtx_);
-    if (rxPending_.empty())
-        rxPending_.emplace_back(std::move(buf));
-    else {
-        auto& last = rxPending_.back();
-        last.insert(std::end(last), std::begin(buf), std::end(buf));
-    }
+    rxPending_.emplace_back(std::move(buf));
 }
 
 /* Update local & remote certificates info. This function should be