]> git.puffer.fish Git - mirror/frr.git/commitdiff
babeld: avoid segfault (bug 706).
authorMatthieu Boutier <boutier@pps.jussieu.fr>
Tue, 17 Jan 2012 23:52:06 +0000 (00:52 +0100)
committerPaul Jakma <paul@quagga.net>
Sun, 25 Mar 2012 16:06:52 +0000 (17:06 +0100)
babeld/babel_interface.c
babeld/babel_interface.h

index b80bf94e121239ec113ec4ff34bac383ead52b51..edfa2b40deb34f0e0de3627eca047e9fd425ea7b 100644 (file)
@@ -486,6 +486,13 @@ interface_recalculate(struct interface *ifp)
     int mtu, rc;
     struct ipv6_mreq mreq;
 
+    if (!if_is_operative(ifp) || !CHECK_FLAG(ifp->flags, IFF_RUNNING)) {
+        interface_reset(ifp);
+        return -1;
+    }
+
+    babel_ifp->flags |= BABEL_IF_IS_UP;
+
     mtu = MIN(ifp->mtu, ifp->mtu6);
 
     /* We need to be able to fit at least two messages into a packet,
@@ -577,6 +584,9 @@ interface_reset(struct interface *ifp)
     struct ipv6_mreq mreq;
     babel_interface_nfo *babel_ifp = babel_get_if_nfo(ifp);
 
+    debugf(BABEL_DEBUG_IF, "interface reset: %s", ifp->name);
+    babel_ifp->flags &= ~BABEL_IF_IS_UP;
+
     flush_interface_routes(ifp, 0);
     babel_ifp->buffered = 0;
     babel_ifp->bufsize = 0;
index 7a6efb937eaeb1193afbb7034d919b690b4029ae..d9fb9a4a2025d1156552b18d40ea98666779bc7e 100644 (file)
@@ -90,12 +90,15 @@ static inline babel_interface_nfo* babel_get_if_nfo(struct interface *ifp)
 #define BABEL_IF_SPLIT_HORIZON (1 << 2)
 #define BABEL_IF_LQ            (1 << 3)
 #define BABEL_IF_IS_ENABLE     (1 << 4)
+#define BABEL_IF_IS_UP         (1 << 5)
 
 static inline int
 if_up(struct interface *ifp)
 {
-    return (if_is_up(ifp) &&
+    return (if_is_operative(ifp) &&
             ifp->connected != NULL &&
+            babel_get_if_nfo(ifp) != NULL &&
+            (babel_get_if_nfo(ifp)->flags & BABEL_IF_IS_UP) &&
             (babel_get_if_nfo(ifp)->flags & BABEL_IF_IS_ENABLE));
 }