diff --git a/src/network_engine.cpp b/src/network_engine.cpp index c0ebbb32de753264ca7adeb3f568d4d614e8e049..c80e4fd92746ee09575b9b44ee3f09b1a2e6aa2c 100644 --- a/src/network_engine.cpp +++ b/src/network_engine.cpp @@ -289,7 +289,7 @@ NetworkEngine::processMessage(const uint8_t *buf, size_t buflen, const sockaddr* return; } - if (msg.id == myid) { + if (msg.id == myid || msg.id == zeroes) { DHT_LOG.DEBUG("Received message from self."); return; } @@ -319,14 +319,22 @@ NetworkEngine::processMessage(const uint8_t *buf, size_t buflen, const sockaddr* } auto req = reqp->second; - auto node = req->node;//cache.getNode(msg.id, from, fromlen, now, 2); - node->received(now, req); - if (node->id == zeroes) { - // reply to a message sent when we didn't know the node ID. + auto node = req->node; + if (node->id != msg.id) { + bool unknown_node = node->id == zeroes; node = cache.getNode(msg.id, from, fromlen, now, 2); - req->node = node; + if (unknown_node) { + // received reply to a message sent when we didn't know the node ID. + req->node = node; + } else { + // received reply from unexpected node + node->received(now, req); + onNewNode(node, 2); + return; + } } else node->update(from, fromlen); + node->received(now, req); onNewNode(node, 2); onReportedAddr(msg.id, (sockaddr*)&msg.addr.first, msg.addr.second); diff --git a/src/node_cache.cpp b/src/node_cache.cpp index 34aeb18f063c222518d0a7ae12918573cde0a4d2..24372d670701896c74bab45afd757e17d0b7afab 100644 --- a/src/node_cache.cpp +++ b/src/node_cache.cpp @@ -28,6 +28,8 @@ NodeCache::getNode(const InfoHash& id, sa_family_t family) { std::shared_ptr<Node> NodeCache::getNode(const InfoHash& id, const sockaddr* sa, socklen_t sa_len, time_point now, int confirm) { + if (id == zeroes) + return std::make_shared<Node>(id, sa, sa_len); return (sa->sa_family == AF_INET ? cache_4 : cache_6).getNode(id, sa, sa_len, now, confirm); }