| From stable-bounces@linux.kernel.org Wed Aug 9 02:33:59 2006 |
| Date: Wed, 09 Aug 2006 02:33:28 -0700 (PDT) |
| Message-Id: <20060809.023328.08324505.davem@davemloft.net> |
| To: stable@kernel.org |
| From: David Miller <davem@davemloft.net> |
| Subject: Fix IFLA_ADDRESS handling |
| |
| From: David Miller <davem@davemloft.net> |
| |
| [RTNETLINK]: Fix IFLA_ADDRESS handling. |
| |
| The ->set_mac_address handlers expect a pointer to a |
| sockaddr which contains the MAC address, whereas |
| IFLA_ADDRESS provides just the MAC address itself. |
| |
| So whip up a sockaddr to wrap around the netlink |
| attribute for the ->set_mac_address call. |
| |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| net/core/rtnetlink.c | 15 ++++++++++++++- |
| 1 file changed, 14 insertions(+), 1 deletion(-) |
| |
| --- linux-2.6.17.8.orig/net/core/rtnetlink.c |
| +++ linux-2.6.17.8/net/core/rtnetlink.c |
| @@ -395,6 +395,9 @@ static int do_setlink(struct sk_buff *sk |
| } |
| |
| if (ida[IFLA_ADDRESS - 1]) { |
| + struct sockaddr *sa; |
| + int len; |
| + |
| if (!dev->set_mac_address) { |
| err = -EOPNOTSUPP; |
| goto out; |
| @@ -406,7 +409,17 @@ static int do_setlink(struct sk_buff *sk |
| if (ida[IFLA_ADDRESS - 1]->rta_len != RTA_LENGTH(dev->addr_len)) |
| goto out; |
| |
| - err = dev->set_mac_address(dev, RTA_DATA(ida[IFLA_ADDRESS - 1])); |
| + len = sizeof(sa_family_t) + dev->addr_len; |
| + sa = kmalloc(len, GFP_KERNEL); |
| + if (!sa) { |
| + err = -ENOMEM; |
| + goto out; |
| + } |
| + sa->sa_family = dev->type; |
| + memcpy(sa->sa_data, RTA_DATA(ida[IFLA_ADDRESS - 1]), |
| + dev->addr_len); |
| + err = dev->set_mac_address(dev, sa); |
| + kfree(sa); |
| if (err) |
| goto out; |
| send_addr_notify = 1; |