mirror of
https://github.com/torvalds/linux.git
synced 2024-11-29 23:51:37 +00:00
wan/farsync: copy_from_user() to iomem is wrong
kmalloc intermediate buffer(), do copy_from_user() + memcpy_toio() Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
ed773b4ab1
commit
5ffa6d7f61
@ -2024,6 +2024,7 @@ fst_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
||||
struct fstioc_write wrthdr;
|
||||
struct fstioc_info info;
|
||||
unsigned long flags;
|
||||
void *buf;
|
||||
|
||||
dbg(DBG_IOCTL, "ioctl: %x, %p\n", cmd, ifr->ifr_data);
|
||||
|
||||
@ -2065,16 +2066,22 @@ fst_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
/* Now copy the data to the card.
|
||||
* This will probably break on some architectures.
|
||||
* I'll fix it when I have something to test on.
|
||||
*/
|
||||
if (copy_from_user(card->mem + wrthdr.offset,
|
||||
/* Now copy the data to the card. */
|
||||
|
||||
buf = kmalloc(wrthdr.size, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
if (copy_from_user(buf,
|
||||
ifr->ifr_data + sizeof (struct fstioc_write),
|
||||
wrthdr.size)) {
|
||||
kfree(buf);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
memcpy_toio(card->mem + wrthdr.offset, buf, wrthdr.size);
|
||||
kfree(buf);
|
||||
|
||||
/* Writes to the memory of a card in the reset state constitute
|
||||
* a download
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user