If dev->dev_addr is zero, then the memcpy() never takes place, and the
same data that was in the caller's buffer is still in the caller's
buffer on successful return. The caller can't know that the data in
its buffer isn't the right answer. So, if dev->dev_dev_addr == 0,
clear the buffer before returning success.
Thanks,
Matt
--
Matt Domsch
Sr. Software Engineer, Lead Engineer
Dell Linux Solutions linux.dell.com & www.dell.com/linux
Linux on Dell mailing lists @ http://lists.us.dell.com
===== linux-2.6/net/core/dev.c 1.169 vs edited =====
--- 1.169/net/core/dev.c 2004-10-26 11:09:33 -05:00
+++ edited/linux-2.6/net/core/dev.c 2004-10-29 16:39:33 -05:00
@@ -2375,8 +2375,11 @@
return dev_set_mtu(dev, ifr->ifr_mtu);
case SIOCGIFHWADDR:
- memcpy(ifr->ifr_hwaddr.sa_data, dev->dev_addr,
- min(sizeof ifr->ifr_hwaddr.sa_data, (size_t)
dev->addr_len));
+ if (!dev->addr_len)
+ memset(ifr->ifr_hwaddr.sa_data, 0, sizeof
ifr->ifr_hwaddr.sa_data);
+ else
+ memcpy(ifr->ifr_hwaddr.sa_data, dev->dev_addr,
+ min(sizeof ifr->ifr_hwaddr.sa_data,
(size_t) dev->addr_len));
ifr->ifr_hwaddr.sa_family = dev->type;
return 0;
|