Message ID | 1311270840.28569.34.camel@localhost |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
From: Ben Hutchings <bhutchings@solarflare.com> Date: Thu, 21 Jul 2011 19:54:00 +0200 > Some drivers (ab)use the ethtool_ops::get_regs operation to expose > only a hardware revision ID. Commit > a77f5db361ed9953b5b749353ea2c7fed2bf8d93 ('ethtool: Allocate register > dump buffer with vmalloc()') had the side-effect of breaking these, as > vmalloc() returns a null pointer for size=0 whereas kmalloc() did not. > > For backward-compatibility, allow zero-length dumps again. > > Reported-by: Kalle Valo <kvalo@qca.qualcomm.com> > Signed-off-by: Ben Hutchings <bhutchings@solarflare.com> > Cc: stable@kernel.org [2.6.37+] Applied to net-next-2.6, I left the CC: stable tag in there so -stable will pick it up once it hits Linus's tree during the merge window. Thanks. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/core/ethtool.c b/net/core/ethtool.c index fd14116..4fb7704 100644 --- a/net/core/ethtool.c +++ b/net/core/ethtool.c @@ -1227,7 +1227,7 @@ static int ethtool_get_regs(struct net_device *dev, char __user *useraddr) regs.len = reglen; regbuf = vzalloc(reglen); - if (!regbuf) + if (reglen && !regbuf) return -ENOMEM; ops->get_regs(dev, ®s, regbuf); @@ -1236,7 +1236,7 @@ static int ethtool_get_regs(struct net_device *dev, char __user *useraddr) if (copy_to_user(useraddr, ®s, sizeof(regs))) goto out; useraddr += offsetof(struct ethtool_regs, data); - if (copy_to_user(useraddr, regbuf, regs.len)) + if (regbuf && copy_to_user(useraddr, regbuf, regs.len)) goto out; ret = 0;
Some drivers (ab)use the ethtool_ops::get_regs operation to expose only a hardware revision ID. Commit a77f5db361ed9953b5b749353ea2c7fed2bf8d93 ('ethtool: Allocate register dump buffer with vmalloc()') had the side-effect of breaking these, as vmalloc() returns a null pointer for size=0 whereas kmalloc() did not. For backward-compatibility, allow zero-length dumps again. Reported-by: Kalle Valo <kvalo@qca.qualcomm.com> Signed-off-by: Ben Hutchings <bhutchings@solarflare.com> Cc: stable@kernel.org [2.6.37+] --- This is compile-tested only. I'm on vacation, damnit. Ben. net/core/ethtool.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)