Don't try to send MTU probes to unreachable nodes.
authorGuus Sliepen <guus@tinc-vpn.org>
Thu, 11 Jun 2009 16:36:08 +0000 (18:36 +0200)
committerGuus Sliepen <guus@tinc-vpn.org>
Thu, 11 Jun 2009 16:36:08 +0000 (18:36 +0200)
If there is an outstanding MTU probe event for a node which is not reachable
anymore, a UDP packet would be sent to that node, which caused a key request to
be sent to that node, which triggered a NULL pointer dereference. Probes and
other UDP packets to unreachable nodes are now dropped.

src/meta.c
src/net_packet.c

index a32d413..b59f15b 100644 (file)
@@ -41,6 +41,11 @@ bool send_meta(connection_t *c, const char *buffer, int length)
 
        cp();
 
 
        cp();
 
+       if(!c) {
+               logger(LOG_ERR, _("send_meta() called with NULL pointer!"));
+               abort();
+       }
+
        ifdebug(META) logger(LOG_DEBUG, _("Sending %d bytes of metadata to %s (%s)"), length,
                           c->name, c->hostname);
 
        ifdebug(META) logger(LOG_DEBUG, _("Sending %d bytes of metadata to %s (%s)"), length,
                           c->name, c->hostname);
 
index 40d9451..9f61275 100644 (file)
@@ -70,6 +70,11 @@ void send_mtu_probe(node_t *n)
        n->mtuprobes++;
        n->mtuevent = NULL;
 
        n->mtuprobes++;
        n->mtuevent = NULL;
 
+       if(!n->status.reachable) {
+               ifdebug(TRAFFIC) logger(LOG_INFO, _("Trying to send MTU probe to unreachable node %s (%s)"), n->name, n->hostname);
+               return;
+       }
+
        if(n->mtuprobes >= 10 && !n->minmtu) {
                ifdebug(TRAFFIC) logger(LOG_INFO, _("No response to MTU probes from %s (%s)"), n->name, n->hostname);
                return;
        if(n->mtuprobes >= 10 && !n->minmtu) {
                ifdebug(TRAFFIC) logger(LOG_INFO, _("No response to MTU probes from %s (%s)"), n->name, n->hostname);
                return;
@@ -328,6 +333,11 @@ static void send_udppacket(node_t *n, vpn_packet_t *origpkt)
 
        cp();
 
 
        cp();
 
+       if(!n->status.reachable) {
+               ifdebug(TRAFFIC) logger(LOG_INFO, _("Trying to send UDP packet to unreachable node %s (%s)"), n->name, n->hostname);
+               return;
+       }
+
        /* Make sure we have a valid key */
 
        if(!n->status.validkey) {
        /* Make sure we have a valid key */
 
        if(!n->status.validkey) {