Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Kernel v2.6.25.2 /drivers/net/tehuti.c

Filename:/drivers/net/tehuti.c
Lines Added:15
Lines Deleted:0
Also changed in: (Previous) 2.6.25-git20  2.6.25-git19  2.6.25.1  2.6.25-git18  2.6.25-git17  2.6.25-git16 
(Following) 2.6.25.3  2.6.25.4  2.6.25.5  2.6.25.6  2.6.25.7  2.6.25.8 

Location
[  2.6.25.2
  [  drivers
    [  net
       o  tehuti.c

Patch

diff --git a/drivers/net/tehuti.c b/drivers/net/tehuti.c
index 17585e5..432e837 100644
--- a/drivers/net/tehuti.c
+++ b/drivers/net/tehuti.c
@@ -625,6 +625,12 @@ static void __init bdx_firmware_endianess(void)
       s_firmLoad[i] = CPU_CHIP_SWAP32(s_firmLoad[i]);
 }
 
+static int bdx_range_check(struct bdx_priv *priv, u32 offset)
+{
+   return (offset > (u32) (BDX_REGS_SIZE / priv->nic->port_num)) ?
+      -EINVAL : 0;
+}
+
 static int bdx_ioctl_priv(struct net_device *ndev, struct ifreq *ifr, int cmd)
 {
    struct bdx_priv *priv = ndev->priv;
@@ -643,9 +649,15 @@ static int bdx_ioctl_priv(struct net_device *ndev, struct ifreq *ifr, int cmd)
       DBG("%d 0x%x 0x%x\n", data[0], data[1], data[2]);
    }
 
+   if (!capable(CAP_SYS_RAWIO))
+      return -EPERM;
+
    switch (data[0]) {
 
    case BDX_OP_READ:
+      error = bdx_range_check(priv, data[1]);
+      if (error < 0)
+         return error;
       data[2] = READ_REG(priv, data[1]);
       DBG("read_reg(0x%x)=0x%x (dec %d)\n", data[1], data[2],
           data[2]);
@@ -655,6 +667,9 @@ static int bdx_ioctl_priv(struct net_device *ndev, struct ifreq *ifr, int cmd)
       break;
 
    case BDX_OP_WRITE:
+      error = bdx_range_check(priv, data[1]);
+      if (error < 0)
+         return error;
       WRITE_REG(priv, data[1], data[2]);
       DBG("write_reg(0x%x, 0x%x)\n", data[1], data[2]);
       break;


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.