Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 30 Jun 2000 09:39:14 -0400 (EDT)
From:      dgilbert@velocet.ca
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   kern/19603: Damn!  who do I hit for this :).
Message-ID:  <200006301339.JAA79483@office.tor.velocet.net>

next in thread | raw e-mail | index | archive | help

>Number:         19603
>Category:       kern
>Synopsis:       20 ethernet interfaces not compatible with option BRIDGE
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Jun 30 06:40:01 PDT 2000
>Closed-Date:
>Last-Modified:
>Originator:     David Gilbert
>Release:        FreeBSD 4.0-STABLE i386
>Organization:
Velocet Communications
>Environment:

Freebsd-4.0-STABLE as of recently, but this appears to affect all
branches of the stable and CURRENT tree.

>Description:

With 20 dc interfaces in my machine and "option BRIDGE" in the kernel,
I was crashing whenever I typed ifconfig -a... and about once a day
otherwise.  This was stack smashing for some reason

>How-To-Repeat:

option BRIDGE in a kernel and 20 interfaces (it would appear any
type of ethernet interface will do) in the kernel.

(I'm guessing that bridging doesn't work with vlans?  sigh.
 would be nice).

>Fix:

I'm not 100% happy with this fix.  The bdg_stats structure is used in:

SYSCTL_STRUCT(_net_link_ether, PF_BDG, bdgstats,
        CTLFLAG_RD, &bdg_stats , bdg_stats, "bridge statistics");

and I'm not sure how to handle that.  The most eggregarious error, 
however, is that BDG_MAX_PORTS was defined and the status structure
was still defined with a constant 16 entries (not only that, but
absolutely no bounds checking was done, *ever*).

It would seem smart that this should be dynamic.  I thought about
that... and I just completely don't know what SYSCTL_STRUCT does ...

But even if I did, it would only be half the job to allocate things
here --- you really need to think about what happens when devices
come or leave (leaving is fine, I suppose).  Besides cardbus, we
have hotswap PCI to worry about :).

--- bridge.h.orig	Fri Jun 30 09:24:59 2000
+++ bridge.h	Fri Jun 30 09:25:13 2000
@@ -92,7 +92,7 @@
 } ;
 
 struct bdg_stats {
-    struct bdg_port_stat s[16];
+    struct bdg_port_stat s[BDG_MAX_PORTS];
 } ;
 
 
--- bridge.c.orig	Fri Jun 30 09:24:37 2000
+++ bridge.c	Fri Jun 30 09:25:13 2000
@@ -440,6 +440,9 @@
     eth_addr = bdg_addresses ;
 
     printf("BRIDGE 990810, have %d interfaces\n", if_index);
+    if(if_index > BDG_MAX_PORTS)
+        panic("bdginit: too many ports, raise BDG_MAX_PORTS");
+    
     for (i = 0 , ifp = ifnet.tqh_first ; i < if_index ;
 		i++, ifp = ifp->if_link.tqe_next)
 	if (ifp->if_type == IFT_ETHER) { /* ethernet ? */


>Release-Note:
>Audit-Trail:
>Unformatted:


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200006301339.JAA79483>