summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@opensourcerouting.org>2014-07-01 16:14:05 +0200
committerDavid Lamparter <equinox@opensourcerouting.org>2014-08-18 18:16:28 +0200
commit90444ca35e3037ed43ec695428f0ef6d82f9a320 (patch)
tree441582b4f1ee1118f6b9b696fed65a2c38064503
parentad2f92b6b07883f6a2a26499eab1776933185960 (diff)
downloadquagga-90444ca35e3037ed43ec695428f0ef6d82f9a320.tar.bz2
quagga-90444ca35e3037ed43ec695428f0ef6d82f9a320.tar.xz
lib: unset ZEBRA_IFA_PEER if no dst addr present (BZ#801)
On OpenBSD, carp interfaces claim to be PtP interfaces with a 0.0.0.0/0 peer address. We process those in zebra and try to send them to clients, at which point they get encoded as all-0. The client code, however, decodes that to a NULL pointer instead of 0.0.0.0. This later turns into a SEGV when CONNECTED_PREFIX sees that ZEBRA_IFA_PEER is set and tries to access the peer prefix. This is a band-aid fix for stable/0.99.23, a long-term solution needs some conceptual improvements on the entire thing. (The usefulness of a PtP-to-0.0.0.0/0 is a separate question; at this point dropping the peer prefix seems the least intrusive solution.) Reported-by: Laurent Lavaud <laurent.lavaud@ladtech.fr> Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
-rw-r--r--lib/zclient.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/lib/zclient.c b/lib/zclient.c
index 20188f6a..3b5477e9 100644
--- a/lib/zclient.c
+++ b/lib/zclient.c
@@ -805,6 +805,16 @@ zebra_interface_address_read (int type, struct stream *s)
ifc->flags = ifc_flags;
if (ifc->destination)
ifc->destination->prefixlen = ifc->address->prefixlen;
+ else if (CHECK_FLAG(ifc->flags, ZEBRA_IFA_PEER))
+ {
+ /* carp interfaces on OpenBSD with 0.0.0.0/0 as "peer" */
+ char buf[BUFSIZ];
+ prefix2str (ifc->address, buf, sizeof(buf));
+ zlog_warn("warning: interface %s address %s "
+ "with peer flag set, but no peer address!",
+ ifp->name, buf);
+ UNSET_FLAG(ifc->flags, ZEBRA_IFA_PEER);
+ }
}
}
else