NetBSD Problem Report #38976

From www@NetBSD.org  Wed Jun 18 02:49:10 2008
Return-Path: <www@NetBSD.org>
Received: from mail.netbsd.org (mail.netbsd.org [204.152.190.11])
	by narn.NetBSD.org (Postfix) with ESMTP id 38FC763B8E3
	for <gnats-bugs@gnats.netbsd.org>; Wed, 18 Jun 2008 02:49:10 +0000 (UTC)
Message-Id: <20080618024909.DA43C63B842@narn.NetBSD.org>
Date: Wed, 18 Jun 2008 02:49:09 +0000 (UTC)
From: g.mcgarry@ieee.org
Reply-To: g.mcgarry@ieee.org
To: gnats-bugs@NetBSD.org
Subject: src/sys/net/if_ethersubr.c rev 1.163 fubar
X-Send-Pr-Version: www-1.0

>Number:         38976
>Category:       kern
>Synopsis:       src/sys/net/if_ethersubr.c rev 1.163 fubar
>Confidential:   no
>Severity:       critical
>Priority:       high
>Responsible:    kern-bug-people
>State:          closed
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Wed Jun 18 02:50:00 +0000 2008
>Closed-Date:    Fri Sep 05 22:11:29 +0000 2008
>Last-Modified:  Fri Sep 05 22:11:29 +0000 2008
>Originator:     Gregory McGarry
>Release:        -current
>Organization:
>Environment:
>Description:
Revision 1.163 to src/sys/net/if_ethersubr.c is fubar; there is code without a case label for SIOCSIFFLAGS.

Wed Mar 12 19:22:24 2008 CET (3 months ago) by dyoung

Make some cosmetic changes:

        Use fewer 'error = ...; break;' statements and more 'return
        ...;'

        Make the SIOCSIFFLAGS case more clear by using a switch
        statement instead of an if-else if-else chain.

        Shorten a staircase, and remove two unnecessary curly
        braces.

Here's is the change:

--- src/sys/net/if_ethersubr.c	2008/02/20 17:05:53	1.162
+++ src/sys/net/if_ethersubr.c	2008/03/12 18:22:24	1.163
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ethersubr.c,v 1.161 2008/02/07 01:22:00 dyoung Exp $	*/
+/*	$NetBSD: if_ethersubr.c,v 1.162 2008/02/20 17:05:53 matt Exp $	*/

 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -61,7 +61,7 @@
  */

 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.161 2008/02/07 01:22:00 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.162 2008/02/20 17:05:53 matt Exp $");

 #include "opt_inet.h"
 #include "opt_atalk.h"
@@ -1444,7 +1444,7 @@ ether_ioctl(struct ifnet *ifp, u_long cm
 	struct ethercom *ec = (void *) ifp;
 	struct ifreq *ifr = (struct ifreq *)data;
 	struct ifaddr *ifa = (struct ifaddr *)data;
-	int error = 0;
+	int error;

 	switch (cmd) {
 	case SIOCSIFADDR:
@@ -1455,36 +1455,33 @@ ether_ioctl(struct ifnet *ifp, u_long cm
 			const struct sockaddr_dl *sdl = satocsdl(ifa->ifa_addr);

 			if (sdl->sdl_type != IFT_ETHER ||
-			    sdl->sdl_alen != ifp->if_addrlen) {
-				error = EINVAL;
-				break;
-			}
+			    sdl->sdl_alen != ifp->if_addrlen)
+				return EINVAL;

 			if_set_sadl(ifp, CLLADDR(sdl), ifp->if_addrlen);

 			/* Set new address. */
-			error = (*ifp->if_init)(ifp);
-			break;
+			return (*ifp->if_init)(ifp);
 		    }
 #ifdef INET
 		case AF_INET:
 			if ((ifp->if_flags & IFF_RUNNING) == 0 &&
 			    (error = (*ifp->if_init)(ifp)) != 0)
-				break;
+				return error;
 			arp_ifinit(ifp, ifa);
 			break;
 #endif /* INET */
 		default:
 			if ((ifp->if_flags & IFF_RUNNING) == 0)
-				error = (*ifp->if_init)(ifp);
+				return (*ifp->if_init)(ifp);
 			break;
 		}
-		break;
+		return 0;

 	case SIOCGIFADDR:
 		memcpy(((struct sockaddr *)&ifr->ifr_data)->sa_data,
 		    CLLADDR(ifp->if_sadl), ETHER_ADDR_LEN);
-		break;
+		return 0;

 	case SIOCSIFMTU:
 	    {
@@ -1496,60 +1493,53 @@ ether_ioctl(struct ifnet *ifp, u_long cm
 			maxmtu = ETHERMTU;

 		if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > maxmtu)
-			error = EINVAL;
-		else if ((error = ifioctl_common(ifp, cmd, data)) == ENETRESET){
+			return EINVAL;
+		else if ((error = ifioctl_common(ifp, cmd, data)) != ENETRESET)
+			return error;
+		else if (ifp->if_flags & IFF_UP) {
 			/* Make sure the device notices the MTU change. */
-			if (ifp->if_flags & IFF_UP)
-				error = (*ifp->if_init)(ifp);
-			else
-				error = 0;
-		}
-		break;
+			return (*ifp->if_init)(ifp);
+		} else
+			return 0;
 	    }

 	case SIOCSIFFLAGS:
-		if ((ifp->if_flags & (IFF_UP|IFF_RUNNING)) == IFF_RUNNING) {
+		switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
 			/*
 			 * If interface is marked down and it is running,
 			 * then stop and disable it.
 			 */
 			(*ifp->if_stop)(ifp, 1);
-		} else if ((ifp->if_flags & (IFF_UP|IFF_RUNNING)) == IFF_UP) {
+			break;
+		case IFF_UP:
 			/*
 			 * If interface is marked up and it is stopped, then
 			 * start it.
 			 */
-			error = (*ifp->if_init)(ifp);
-		} else if ((ifp->if_flags & IFF_UP) != 0) {
+			return (*ifp->if_init)(ifp);
+		case IFF_UP|IFF_RUNNING:
 			/*
 			 * Reset the interface to pick up changes in any other
 			 * flags that affect the hardware state.
 			 */
-			error = (*ifp->if_init)(ifp);
+			return (*ifp->if_init)(ifp);
+		case 0:
+			break;
 		}
-		break;
-
+		return 0;
 	case SIOCADDMULTI:
-		error = ether_addmulti(ifreq_getaddr(cmd, ifr), ec);
-		break;
-
+		return ether_addmulti(ifreq_getaddr(cmd, ifr), ec);
 	case SIOCDELMULTI:
-		error = ether_delmulti(ifreq_getaddr(cmd, ifr), ec);
-		break;
+		return ether_delmulti(ifreq_getaddr(cmd, ifr), ec);
 	case SIOCSIFMEDIA:
 	case SIOCGIFMEDIA:
 		if (ec->ec_mii == NULL)
-			error = ENOTTY;
-		else
-			error = ifmedia_ioctl(ifp, ifr, &ec->ec_mii->mii_media,
-			    cmd);
-		break;
+			return ENOTTY;
+		return ifmedia_ioctl(ifp, ifr, &ec->ec_mii->mii_media, cmd);
 	case SIOCSIFCAP:
 		return ifioctl_common(ifp, cmd, data);
 	default:
-		error = ENOTTY;
-		break;
+		return ENOTTY;
 	}
-
-	return (error);
+	return 0;
 }

>How-To-Repeat:

>Fix:
Revert patch, since it contributes no functional change.


>Release-Note:

>Audit-Trail:
From: Gregory McGarry <gmcgarry@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/38976 CVS commit: src/sys/net
Date: Wed, 23 Jul 2008 05:41:47 +0000 (UTC)

 Module Name:	src
 Committed By:	gmcgarry
 Date:		Wed Jul 23 05:41:47 UTC 2008

 Modified Files:
 	src/sys/net: if_ethersubr.c

 Log Message:
 Back out rev 1.163 which broke the logic for SIOCSIFFLAGS.  PR#38976.


 To generate a diff of this commit:
 cvs rdiff -r1.167 -r1.168 src/sys/net/if_ethersubr.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

State-Changed-From-To: open->closed
State-Changed-By: gmcgarry@NetBSD.org
State-Changed-When: Fri, 05 Sep 2008 22:11:29 +0000
State-Changed-Why:
patch applied.


>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.39 2013/11/01 18:47:49 spz Exp $
$NetBSD: gnats_config.sh,v 1.8 2006/05/07 09:23:38 tsutsui Exp $
Copyright © 1994-2007 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.