On Wed, May 14, 2008 at 06:36:36PM +0200, Raphael Mazelier wrote:
> In a previous post, I noticed that Quagga was broken in 4.3.
> After spending some hour to debug, I find were the stack overflow was.
> It's not clear if it was an openbsd bug (strange route in the kernel
> interface),
> but it's clear for me that quagga don't make enought test before making
> memcpy (still not a good idea).
>
Could you try the following diff instead? This should fix the real cause
of the crashes.
--
:wq Claudio
Index: Makefile
===================================================================
RCS file: /cvs/ports/net/quagga/Makefile,v
retrieving revision 1.10
diff -u -p -r1.10 Makefile
--- Makefile 15 Sep 2007 22:36:58 -0000 1.10
+++ Makefile 10 Oct 2007 08:20:29 -0000
@@ -3,6 +3,7 @@
COMMENT= multi-threaded routing daemon
DISTNAME= quagga-0.99.9
+PKGNAME= ${DISTNAME}p0
SHARED_LIBS= ospf 0.0 \
zebra 0.0
CATEGORIES= net
Index: patches/patch-zebra_kernel_socket_c
===================================================================
RCS file: /cvs/ports/net/quagga/patches/patch-zebra_kernel_socket_c,v
retrieving revision 1.3
diff -u -p -r1.3 patch-zebra_kernel_socket_c
--- patches/patch-zebra_kernel_socket_c 12 Sep 2007 20:31:18 -0000 1.3
+++ patches/patch-zebra_kernel_socket_c 9 Oct 2007 21:55:04 -0000
@@ -1,6 +1,6 @@
$OpenBSD: patch-zebra_kernel_socket_c,v 1.3 2007/09/12 20:31:18 rui Exp $
---- zebra/kernel_socket.c.orig Wed Aug 22 17:22:57 2007
-+++ zebra/kernel_socket.c Tue Sep 11 16:52:21 2007
+--- zebra/kernel_socket.c.orig Wed Aug 22 18:22:57 2007
++++ zebra/kernel_socket.c Tue Oct 9 23:54:58 2007
@@ -136,7 +136,7 @@ struct message rtm_type_str[] =
{RTM_REDIRECT, "RTM_REDIRECT"},
{RTM_MISS, "RTM_MISS"},
@@ -10,3 +10,14 @@ $OpenBSD: patch-zebra_kernel_socket_c,v
{RTM_OLDADD, "RTM_OLDADD"},
#endif /* RTM_OLDADD */
#ifdef RTM_OLDDEL
+@@ -705,9 +705,7 @@ rtm_read_mesg (struct rt_msghdr *rtm,
+
+ /* rt_msghdr version check. */
+ if (rtm->rtm_version != RTM_VERSION)
+- zlog (NULL, LOG_WARNING,
+- "Routing message version different %d should be %d."
+- "This may cause problem\n", rtm->rtm_version, RTM_VERSION);
++ return 0;
+
+ /* Be sure structure is cleared */
+ memset (dest, 0, sizeof (union sockunion));