From e308d8ea34a80327a1f5e3e7d1a34df881707377 Mon Sep 17 00:00:00 2001 From: Francois Romieu Date: Sun, 20 Apr 2008 19:32:34 +0200 Subject: [PATCH] --- yaml --- r: 93111 b: refs/heads/master c: 6131a2601f42cd7fdbac0e960713396fe68af59f h: refs/heads/master i: 93109: 82346125d7b3f7da33e1ae0c81ccd4f7c954bb3a 93107: 9a81a627421652be3018637b32e088f50d2d36e1 93103: 910bb7146fa0ee403487d5063cbcc6e2a3df8f02 v: v3 --- [refs] | 2 +- trunk/drivers/net/tehuti.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index b6ff25b09a8b..b4b118e27acb 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 5a0e2cd51145748c4fd44d0c3a06d39eb87e8725 +refs/heads/master: 6131a2601f42cd7fdbac0e960713396fe68af59f diff --git a/trunk/drivers/net/tehuti.c b/trunk/drivers/net/tehuti.c index 17585e5eed53..d2e1b219673d 100644 --- a/trunk/drivers/net/tehuti.c +++ b/trunk/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; @@ -646,6 +652,9 @@ static int bdx_ioctl_priv(struct net_device *ndev, struct ifreq *ifr, int cmd) 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 +664,11 @@ static int bdx_ioctl_priv(struct net_device *ndev, struct ifreq *ifr, int cmd) break; case BDX_OP_WRITE: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + 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;