Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 7 Oct 1997 12:02:46 +0300 (EEST)
From:      Ruslan Ermilov <ru@ucb.crimea.ua>
To:        FreeBSD-gnats-submit@FreeBSD.ORG
Subject:   kern/4718: SLIP driver STATIC UNIT bug (stable,current)
Message-ID:  <199710070902.MAA01982@relay.ucb.crimea.ua>
Resent-Message-ID: <199710070910.CAA11108@hub.freebsd.org>

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

>Number:         4718
>Category:       kern
>Synopsis:       SLIP driver STATIC UNIT bug (stable,current)
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    freebsd-bugs
>State:          open
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Tue Oct  7 02:10:01 PDT 1997
>Last-Modified:
>Originator:     Ruslan Ermilov
>Organization:
>Release:        FreeBSD 2.2-STABLE i386
>Environment:

	FreeBSD 2.2-STABLE or FreeBSD 3.0-CURRENT,
	SLIP.

>Description:

	Driver has a bug (see how-to-repeat). As the result,
	`slattach -S <some_fixed_unit>' can not be started and
	killed more than <number_of_slips_configured> times.

>How-To-Repeat:

	Suppose, you have 3 slip units configured in your kernel.
	We will start and kill `slattach -S 1 /dev/cuaa0'.

	First run:
		- slopen() allocates sl_softc[0];
		- sltioctl() exchanges sl_softc[0] and sl_softc[1];
		- sl_softc[1] is assigned SC_STATIC flag.
	Killing:
		- sl_softc[1] has SC_STATIC flag set.

	Second run:
		- slopen() allocates sl_softc[0];
		- sltioctl() exchanges sl_softc[0] and sl_softc[1];
		- sl_softc[0] due to this exchange gets SC_STATIC (!!! BUG !!!)
		- sl_softc[1] is assigned SC_STATIC flag.
	Killing:
		- sl_softc[0 and 1] have SC_STATIC flag set.

	Third run:
		- slopen() allocates sl_softc[2] (sl_softc[0 and 1]] can't be
		  allocates - they have SC_STATIC flag set);
		- sltioctl() exchanges sl_softc[2] and sl_softc[1];
		- sl_softc[2] due to this exchange gets SC_STATIC (!!! BUG !!!)
		- sl_softc[1] is assigned SC_STATIC flag.
	Killing:
		- sl_softc[0,1,2] all have SC_STATIC flag set.
		
	Fouth run:
		- slopen() can't allocate any of the sl_softc[0,1,2]
		  because all they have SC_STATIC flag set.
		- slopen() returns ENXIO error (device not configured).

>Fix:

	The following patch solves the problem.
	It was applied to 1.45.2.2 version of src/sys/net/if_sl.c.
	
/*********************************************************************/
*** if_sl.c.old	Tue Oct  7 10:39:00 1997
--- if_sl.c	Tue Oct  7 10:38:57 1997
***************
*** 390,395 ****
--- 390,396 ----
  					nc->sc_if = tmpnc->sc_if;
  					tmpnc->sc_if = sc->sc_if;
  					*sc = *tmpnc;
+ 					sc->sc_flags &= ~SC_STATIC;
  					free(tmpnc, M_TEMP);
  					if (sc->sc_if.if_flags & IFF_UP) {
  						if_down(&sc->sc_if);
/*********************************************************************/
>Audit-Trail:
>Unformatted:



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