babeld: avoid segfault (bug 706).

This commit is contained in:
Matthieu Boutier 2012-01-18 00:52:06 +01:00 committed by Paul Jakma
parent 4eedea5512
commit 0ee8a1f1d6
2 changed files with 14 additions and 1 deletions

View File

@ -486,6 +486,13 @@ interface_recalculate(struct interface *ifp)
int mtu, rc; int mtu, rc;
struct ipv6_mreq mreq; 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); mtu = MIN(ifp->mtu, ifp->mtu6);
/* We need to be able to fit at least two messages into a packet, /* 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; struct ipv6_mreq mreq;
babel_interface_nfo *babel_ifp = babel_get_if_nfo(ifp); 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); flush_interface_routes(ifp, 0);
babel_ifp->buffered = 0; babel_ifp->buffered = 0;
babel_ifp->bufsize = 0; babel_ifp->bufsize = 0;

View 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_SPLIT_HORIZON (1 << 2)
#define BABEL_IF_LQ (1 << 3) #define BABEL_IF_LQ (1 << 3)
#define BABEL_IF_IS_ENABLE (1 << 4) #define BABEL_IF_IS_ENABLE (1 << 4)
#define BABEL_IF_IS_UP (1 << 5)
static inline int static inline int
if_up(struct interface *ifp) if_up(struct interface *ifp)
{ {
return (if_is_up(ifp) && return (if_is_operative(ifp) &&
ifp->connected != NULL && 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)); (babel_get_if_nfo(ifp)->flags & BABEL_IF_IS_ENABLE));
} }