lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Date:	Thu, 07 Aug 2008 02:24:41 -0400
From:	Jeff Garzik <jgarzik@...ox.com>
To:	Wang Chen <wangchen@...fujitsu.com>
CC:	NETDEV <netdev@...r.kernel.org>
Subject: Re: RESEND [PATCH 1/2] net-driver: Drivers don't set IFF_* flag

Wang Chen wrote:
> Some hardware set promisc when they are requested to set IFF_ALLMULTI flag.
> It's ok, but if drivers set IFF_PROMISC flag when they set promisc,
> it will broken upper layer handle for promisc and allmulti.
> In addition, drivers can use their own hardware programming to make it.
> So do not allow drivers to set IFF_* flags.
> 
> This is a general driver fix, so I didn't split it to pieces and send
> to specific driver maintainers.
> 
> Signed-off-by: Wang Chen <wangchen@...fujitsu.com>
> ---
> diff --git a/drivers/net/3c523.c b/drivers/net/3c523.c
> index dc6e474..e2ce41d 100644
> --- a/drivers/net/3c523.c
> +++ b/drivers/net/3c523.c
> @@ -640,10 +640,8 @@ static int init586(struct net_device *dev)
>  	cfg_cmd->time_low = 0x00;
>  	cfg_cmd->time_high = 0xf2;
>  	cfg_cmd->promisc = 0;
> -	if (dev->flags & (IFF_ALLMULTI | IFF_PROMISC)) {
> +	if (dev->flags & (IFF_ALLMULTI | IFF_PROMISC))
>  		cfg_cmd->promisc = 1;
> -		dev->flags |= IFF_PROMISC;
> -	}
>  	cfg_cmd->carr_coll = 0x00;
>  
>  	p->scb->cbl_offset = make16(cfg_cmd);
> diff --git a/drivers/net/3c527.c b/drivers/net/3c527.c
> index 6aca0c6..abc84f7 100644
> --- a/drivers/net/3c527.c
> +++ b/drivers/net/3c527.c
> @@ -1521,14 +1521,11 @@ static void do_mc32_set_multicast_list(struct net_device *dev, int retry)
>  	struct mc32_local *lp = netdev_priv(dev);
>  	u16 filt = (1<<2); /* Save Bad Packets, for stats purposes */
>  
> -	if (dev->flags&IFF_PROMISC)
> +	if ((dev->flags&IFF_PROMISC) ||
> +	    (dev->flags&IFF_ALLMULTI) ||
> +	    dev->mc_count > 10)
>  		/* Enable promiscuous mode */
>  		filt |= 1;
> -	else if((dev->flags&IFF_ALLMULTI) || dev->mc_count > 10)
> -	{
> -		dev->flags|=IFF_PROMISC;
> -		filt |= 1;
> -	}
>  	else if(dev->mc_count)
>  	{
>  		unsigned char block[62];
> diff --git a/drivers/net/atp.c b/drivers/net/atp.c
> index 3d44333..c10cd80 100644
> --- a/drivers/net/atp.c
> +++ b/drivers/net/atp.c
> @@ -854,14 +854,9 @@ static void set_rx_mode_8002(struct net_device *dev)
>  	struct net_local *lp = netdev_priv(dev);
>  	long ioaddr = dev->base_addr;
>  
> -	if ( dev->mc_count > 0 || (dev->flags & (IFF_ALLMULTI|IFF_PROMISC))) {
> -		/* We must make the kernel realise we had to move
> -		 *	into promisc mode or we start all out war on
> -		 *	the cable. - AC
> -		 */
> -		dev->flags|=IFF_PROMISC;
> +	if (dev->mc_count > 0 || (dev->flags & (IFF_ALLMULTI|IFF_PROMISC)))
>  		lp->addr_mode = CMR2h_PROMISC;
> -	} else
> +	else
>  		lp->addr_mode = CMR2h_Normal;
>  	write_reg_high(ioaddr, CMR2, lp->addr_mode);
>  }
> diff --git a/drivers/net/de620.c b/drivers/net/de620.c
> index 3f5190c..d454e14 100644
> --- a/drivers/net/de620.c
> +++ b/drivers/net/de620.c
> @@ -488,13 +488,6 @@ static void de620_set_multicast_list(struct net_device *dev)
>  {
>  	if (dev->mc_count || dev->flags&(IFF_ALLMULTI|IFF_PROMISC))
>  	{ /* Enable promiscuous mode */
> -		/*
> -		 *	We must make the kernel realise we had to move
> -		 *	into promisc mode or we start all out war on
> -		 *	the cable. - AC
> -		 */
> -		dev->flags|=IFF_PROMISC;
> -
>  		de620_set_register(dev, W_TCR, (TCR_DEF & ~RXPBM) | RXALL);
>  	}
>  	else
> diff --git a/drivers/net/eepro.c b/drivers/net/eepro.c
> index 56f5049..1f11350 100644
> --- a/drivers/net/eepro.c
> +++ b/drivers/net/eepro.c
> @@ -1283,14 +1283,6 @@ set_multicast_list(struct net_device *dev)
>  
>  	if (dev->flags&(IFF_ALLMULTI|IFF_PROMISC) || dev->mc_count > 63)
>  	{
> -		/*
> -		 *	We must make the kernel realise we had to move
> -		 *	into promisc mode or we start all out war on
> -		 *	the cable. If it was a promisc request the
> -		 *	flag is already set. If not we assert it.
> -		 */
> -		dev->flags|=IFF_PROMISC;
> -
>  		eepro_sw2bank2(ioaddr); /* be CAREFUL, BANK 2 now */
>  		mode = inb(ioaddr + REG2);
>  		outb(mode | PRMSC_Mode, ioaddr + REG2);
> diff --git a/drivers/net/eth16i.c b/drivers/net/eth16i.c
> index e3dd8b1..bee8b3f 100644
> --- a/drivers/net/eth16i.c
> +++ b/drivers/net/eth16i.c
> @@ -1356,7 +1356,6 @@ static void eth16i_multicast(struct net_device *dev)
>  
>  	if(dev->mc_count || dev->flags&(IFF_ALLMULTI|IFF_PROMISC))
>  	{
> -		dev->flags|=IFF_PROMISC;	/* Must do this */
>  		outb(3, ioaddr + RECEIVE_MODE_REG);
>  	} else {
>  		outb(2, ioaddr + RECEIVE_MODE_REG);
> diff --git a/drivers/net/lp486e.c b/drivers/net/lp486e.c
> index 591a7e4..83fa9d8 100644
> --- a/drivers/net/lp486e.c
> +++ b/drivers/net/lp486e.c
> @@ -1272,8 +1272,6 @@ static void set_multicast_list(struct net_device *dev) {
>  			return;
>  		}
>  		if (dev->mc_count == 0 && !(dev->flags & (IFF_PROMISC | IFF_ALLMULTI))) {
> -			if (dev->flags & IFF_ALLMULTI)
> -				dev->flags |= IFF_PROMISC;
>  			lp->i596_config[8] &= ~0x01;
>  		} else {
>  			lp->i596_config[8] |= 0x01;
> diff --git a/drivers/net/ni5010.c b/drivers/net/ni5010.c
> index a20005c..8e0ca9f 100644
> --- a/drivers/net/ni5010.c
> +++ b/drivers/net/ni5010.c
> @@ -648,7 +648,6 @@ static void ni5010_set_multicast_list(struct net_device *dev)
>  	PRINTK2((KERN_DEBUG "%s: entering set_multicast_list\n", dev->name));
>  
>  	if (dev->flags&IFF_PROMISC || dev->flags&IFF_ALLMULTI || dev->mc_list) {
> -		dev->flags |= IFF_PROMISC;
>  		outb(RMD_PROMISC, EDLC_RMODE); /* Enable promiscuous mode */
>  		PRINTK((KERN_DEBUG "%s: Entering promiscuous mode\n", dev->name));
>  	} else {
> diff --git a/drivers/net/ni52.c b/drivers/net/ni52.c
> index a316dcc..b9a882d 100644
> --- a/drivers/net/ni52.c
> +++ b/drivers/net/ni52.c
> @@ -621,7 +621,7 @@ static int init586(struct net_device *dev)
>  		if (num_addrs > len) {
>  			printk(KERN_ERR "%s: switching to promisc. mode\n",
>  				dev->name);
> -			dev->flags |= IFF_PROMISC;
> +			writeb(0x01, &cfg_cmd->promisc);
>  		}
>  	}
>  	if (dev->flags & IFF_PROMISC)
> diff --git a/drivers/net/sun3_82586.c b/drivers/net/sun3_82586.c
> index 9b2a7f7..e531302 100644
> --- a/drivers/net/sun3_82586.c
> +++ b/drivers/net/sun3_82586.c
> @@ -425,14 +425,11 @@ static int init586(struct net_device *dev)
>  		int len = ((char *) p->iscp - (char *) ptr - 8) / 6;
>  		if(num_addrs > len)	{
>  			printk("%s: switching to promisc. mode\n",dev->name);
> -			dev->flags|=IFF_PROMISC;
> +			cfg_cmd->promisc = 1;
>  		}
>  	}
>  	if(dev->flags&IFF_PROMISC)
> -	{
> -			 cfg_cmd->promisc=1;
> -			 dev->flags|=IFF_PROMISC;
> -	}
> +		cfg_cmd->promisc = 1;
>  	cfg_cmd->carr_coll	= 0x00;
>  
>  	p->scb->cbl_offset	= make16(cfg_cmd);
> diff --git a/drivers/net/wireless/orinoco.c b/drivers/net/wireless/orinoco.c
> index b047306..1ebcafe 100644
> --- a/drivers/net/wireless/orinoco.c
> +++ b/drivers/net/wireless/orinoco.c
> @@ -1998,13 +1998,6 @@ __orinoco_set_multicast_list(struct net_device *dev)
>  		else
>  			priv->mc_count = mc_count;
>  	}
> -
> -	/* Since we can set the promiscuous flag when it wasn't asked
> -	   for, make sure the net_device knows about it. */
> -	if (priv->promiscuous)
> -		dev->flags |= IFF_PROMISC;
> -	else
> -		dev->flags &= ~IFF_PROMISC;
>  }
>  
>  /* This must be called from user context, without locks held - use
> diff --git a/drivers/net/wireless/wavelan.c b/drivers/net/wireless/wavelan.c
> index 49ae970..136220b 100644
> --- a/drivers/net/wireless/wavelan.c
> +++ b/drivers/net/wireless/wavelan.c
> @@ -1409,9 +1409,6 @@ static void wavelan_set_multicast_list(struct net_device * dev)
>  			lp->mc_count = 0;
>  
>  			wv_82586_reconfig(dev);
> -
> -			/* Tell the kernel that we are doing a really bad job. */
> -			dev->flags |= IFF_PROMISC;
>  		}
>  	} else
>  		/* Are there multicast addresses to send? */
> diff --git a/drivers/net/wireless/wavelan_cs.c b/drivers/net/wireless/wavelan_cs.c
> index b584c0e..00a3559 100644
> --- a/drivers/net/wireless/wavelan_cs.c
> +++ b/drivers/net/wireless/wavelan_cs.c
> @@ -1412,9 +1412,6 @@ wavelan_set_multicast_list(struct net_device *	dev)
>  	  lp->mc_count = 0;
>  
>  	  wv_82593_reconfig(dev);
> -
> -	  /* Tell the kernel that we are doing a really bad job... */
> -	  dev->flags |= IFF_PROMISC;
>  	}
>      }
>    else
> @@ -1433,9 +1430,6 @@ wavelan_set_multicast_list(struct net_device *	dev)
>  	    lp->mc_count = 0;
>  
>  	    wv_82593_reconfig(dev);
> -
> -	    /* Tell the kernel that we are doing a really bad job... */
> -	    dev->flags |= IFF_ALLMULTI;

applied


--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists