8bbdfd257273852464ce91cfaed99bdb105aed8c
[openwrt/svn-archive/archive.git] / net / batman-advanced / patches / 0004-batman-adv-Don-t-use-net_dev-after-dev_put.patch
1 From 91235b4ca86709f2974fc954c2ff81fd8e5ac926 Mon Sep 17 00:00:00 2001
2 From: Sven Eckelmann <sven.eckelmann@gmx.de>
3 Date: Fri, 20 Aug 2010 19:16:11 +0000
4 Subject: [PATCH 09/10] batman-adv: Don't use net_dev after dev_put
5
6 dev_put allows a device to be freed when all its references are dropped.
7 After that we are not allowed to access that information anymore. Access
8 to the data structure of a net_device must be surrounded a dev_hold
9 and ended using dev_put.
10
11 batman-adv adds a device to its own management structure in
12 hardif_add_interface and will release it in hardif_remove_interface.
13 Thus it must hold a reference all the time between those functions to
14 prevent any access to the already released net_device structure.
15
16 Reported-by: Tim Glaremin <Tim.Glaremin@web.de>
17 Signed-off-by: Sven Eckelmann <sven.eckelmann@gmx.de>
18 Cc: stable <stable@kernel.org>
19 ---
20 hard-interface.c | 11 ++++++-----
21 1 files changed, 6 insertions(+), 5 deletions(-)
22
23 diff --git a/hard-interface.c b/hard-interface.c
24 index 1670ec8..ce6819a 100644
25 --- a/hard-interface.c
26 +++ b/hard-interface.c
27 @@ -196,8 +196,6 @@ static void hardif_activate_interface(struct net_device *net_dev,
28 if (batman_if->if_status != IF_INACTIVE)
29 return;
30
31 - dev_hold(batman_if->net_dev);
32 -
33 update_mac_addresses(batman_if);
34 batman_if->if_status = IF_TO_BE_ACTIVATED;
35
36 @@ -224,8 +222,6 @@ static void hardif_deactivate_interface(struct net_device *net_dev,
37 (batman_if->if_status != IF_TO_BE_ACTIVATED))
38 return;
39
40 - dev_put(batman_if->net_dev);
41 -
42 batman_if->if_status = IF_INACTIVE;
43
44 bat_info(net_dev, "Interface deactivated: %s\n", batman_if->dev);
45 @@ -322,12 +318,14 @@ static struct batman_if *hardif_add_interface(struct net_device *net_dev)
46 if (ret != 1)
47 goto out;
48
49 + dev_hold(net_dev);
50 +
51 batman_if = kmalloc(sizeof(struct batman_if), GFP_ATOMIC);
52 if (!batman_if) {
53 printk(KERN_ERR "batman-adv:"
54 "Can't add interface (%s): out of memory\n",
55 net_dev->name);
56 - goto out;
57 + goto release_dev;
58 }
59
60 batman_if->dev = kstrdup(net_dev->name, GFP_ATOMIC);
61 @@ -348,6 +346,8 @@ free_dev:
62 kfree(batman_if->dev);
63 free_if:
64 kfree(batman_if);
65 +release_dev:
66 + dev_put(net_dev);
67 out:
68 return NULL;
69 }
70 @@ -376,6 +376,7 @@ static void hardif_remove_interface(struct batman_if *batman_if)
71 batman_if->if_status = IF_TO_BE_REMOVED;
72 list_del_rcu(&batman_if->list);
73 sysfs_del_hardif(&batman_if->hardif_obj);
74 + dev_put(batman_if->net_dev);
75 call_rcu(&batman_if->rcu, hardif_free_interface);
76 }
77
78 --
79 1.7.1
80