linux-3.0.x for AP-SH4A-0A Board
Revisão | 3de8ae6c0d1c0fb73243992adf87c7174028a531 (tree) |
---|---|
Hora | 2011-08-05 13:58:34 |
Autor | Ben Hutchings <bhutchings@sola...> |
Commiter | Greg Kroah-Hartman |
ethtool: Allow zero-length register dumps again
commit 67ae7cf1eeda777f79259c4c6cb17a0bd28dee71 upstream.
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>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
@@ -1227,7 +1227,7 @@ static int ethtool_get_regs(struct net_device *dev, char __user *useraddr) | ||
1227 | 1227 | regs.len = reglen; |
1228 | 1228 | |
1229 | 1229 | regbuf = vzalloc(reglen); |
1230 | - if (!regbuf) | |
1230 | + if (reglen && !regbuf) | |
1231 | 1231 | return -ENOMEM; |
1232 | 1232 | |
1233 | 1233 | ops->get_regs(dev, ®s, regbuf); |
@@ -1236,7 +1236,7 @@ static int ethtool_get_regs(struct net_device *dev, char __user *useraddr) | ||
1236 | 1236 | if (copy_to_user(useraddr, ®s, sizeof(regs))) |
1237 | 1237 | goto out; |
1238 | 1238 | useraddr += offsetof(struct ethtool_regs, data); |
1239 | - if (copy_to_user(useraddr, regbuf, regs.len)) | |
1239 | + if (regbuf && copy_to_user(useraddr, regbuf, regs.len)) | |
1240 | 1240 | goto out; |
1241 | 1241 | ret = 0; |
1242 | 1242 |