]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/2.6.29.5/vlan-macvlan-fix-null-pointer-dereferences-in-ethtool-handlers.patch
Drop watchdog patch
[thirdparty/kernel/stable-queue.git] / releases / 2.6.29.5 / vlan-macvlan-fix-null-pointer-dereferences-in-ethtool-handlers.patch
CommitLineData
15569d91
GKH
1From dafbd702bc6cb655ce4969ec24a317b6ff5ac129 Mon Sep 17 00:00:00 2001
2From: Patrick McHardy <kaber@trash.net>
3Date: Fri, 17 Apr 2009 15:59:23 -0700
4Subject: vlan/macvlan: fix NULL pointer dereferences in ethtool handlers
5
6From: Patrick McHardy <kaber@trash.net>
7
8[ Upstream commit 7816a0a862d851d0b05710e7d94bfe390f3180e2 ]
9
10Check whether the underlying device provides a set of ethtool ops before
11checking for individual handlers to avoid NULL pointer dereferences.
12
13Reported-by: Art van Breemen <ard@telegraafnet.nl>
14Signed-off-by: Patrick McHardy <kaber@trash.net>
15Signed-off-by: David S. Miller <davem@davemloft.net>
16Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
17---
18 drivers/net/macvlan.c | 9 ++++++---
19 net/8021q/vlan_dev.c | 3 ++-
20 2 files changed, 8 insertions(+), 4 deletions(-)
21
22--- a/drivers/net/macvlan.c
23+++ b/drivers/net/macvlan.c
24@@ -329,7 +329,8 @@ static u32 macvlan_ethtool_get_rx_csum(s
25 const struct macvlan_dev *vlan = netdev_priv(dev);
26 struct net_device *lowerdev = vlan->lowerdev;
27
28- if (lowerdev->ethtool_ops->get_rx_csum == NULL)
29+ if (lowerdev->ethtool_ops == NULL ||
30+ lowerdev->ethtool_ops->get_rx_csum == NULL)
31 return 0;
32 return lowerdev->ethtool_ops->get_rx_csum(lowerdev);
33 }
34@@ -340,7 +341,8 @@ static int macvlan_ethtool_get_settings(
35 const struct macvlan_dev *vlan = netdev_priv(dev);
36 struct net_device *lowerdev = vlan->lowerdev;
37
38- if (!lowerdev->ethtool_ops->get_settings)
39+ if (!lowerdev->ethtool_ops ||
40+ !lowerdev->ethtool_ops->get_settings)
41 return -EOPNOTSUPP;
42
43 return lowerdev->ethtool_ops->get_settings(lowerdev, cmd);
44@@ -351,7 +353,8 @@ static u32 macvlan_ethtool_get_flags(str
45 const struct macvlan_dev *vlan = netdev_priv(dev);
46 struct net_device *lowerdev = vlan->lowerdev;
47
48- if (!lowerdev->ethtool_ops->get_flags)
49+ if (!lowerdev->ethtool_ops ||
50+ !lowerdev->ethtool_ops->get_flags)
51 return 0;
52 return lowerdev->ethtool_ops->get_flags(lowerdev);
53 }
54--- a/net/8021q/vlan_dev.c
55+++ b/net/8021q/vlan_dev.c
56@@ -668,7 +668,8 @@ static int vlan_ethtool_get_settings(str
57 const struct vlan_dev_info *vlan = vlan_dev_info(dev);
58 struct net_device *real_dev = vlan->real_dev;
59
60- if (!real_dev->ethtool_ops->get_settings)
61+ if (!real_dev->ethtool_ops ||
62+ !real_dev->ethtool_ops->get_settings)
63 return -EOPNOTSUPP;
64
65 return real_dev->ethtool_ops->get_settings(real_dev, cmd);