From c8eb704a92aea507571761444aa2f936940f1258 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com>
Date: Tue, 19 Apr 2022 14:51:24 -0400
Subject: [PATCH] dhtrunner: prevent integer underflow in UDP rx callback

---
 src/dhtrunner.cpp | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/src/dhtrunner.cpp b/src/dhtrunner.cpp
index 5b790c80..62b290af 100644
--- a/src/dhtrunner.cpp
+++ b/src/dhtrunner.cpp
@@ -163,14 +163,15 @@ DhtRunner::run(const Config& config, Context&& context)
             net::PacketList ret;
             {
                 std::lock_guard<std::mutex> lck(sock_mtx);
-                auto maxSize = net::RX_QUEUE_MAX_SIZE - pkts.size();
-                while (rcv.size() > maxSize) {
-                    if (logger_)
-                        logger_->e("Dropping packet: queue is full!");
+                rcv.splice(rcv.end(), std::move(pkts));
+                size_t dropped = 0;
+                while (rcv.size() > net::RX_QUEUE_MAX_SIZE) {
                     rcv.pop_front();
+                    dropped++;
+                }
+                if (dropped and logger_) {
+                    logger_->w("[runner %p] dropped %zu packets: queue is full!", this, dropped);
                 }
-
-                rcv.splice(rcv.end(), std::move(pkts));
                 ret = std::move(rcv_free);
             }
             cv.notify_all();
-- 
GitLab