summaryrefslogtreecommitdiffhomepage
path: root/device.c
diff options
context:
space:
mode:
authorHans Dedecker <dedeckeh@gmail.com>2016-02-01 10:56:30 +0100
committerFelix Fietkau <nbd@openwrt.org>2016-02-01 11:09:58 +0100
commit3610a24b218974bdf2d2f709a8af9e4a990c47bd (patch)
tree8e7b0eacc70ed22586592e556482cd71f507cf09 /device.c
parentabbea9ebe8a8b56032e0f85b8572f0671dc094e5 (diff)
device: Fix null pointer derefence if device is unset
Fix null pointer deference in device_claim if device is unset in device_user struct. Typically this is observed when the parent device is removed from (mac)vlan device config followed by a network reload Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
Diffstat (limited to 'device.c')
-rw-r--r--device.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/device.c b/device.c
index 3404fee..9344e1b 100644
--- a/device.c
+++ b/device.c
@@ -333,6 +333,9 @@ int device_claim(struct device_user *dep)
if (dep->claimed)
return 0;
+ if (!dev)
+ return -1;
+
dep->claimed = true;
D(DEVICE, "Claim %s %s, new active count: %d\n", dev->type->name, dev->ifname, dev->active + 1);
if (++dev->active != 1)
@@ -721,12 +724,16 @@ device_apply_config(struct device *dev, const struct device_type *type,
free(dev->config);
dev->config = config;
if (change == DEV_CONFIG_RESTART && dev->present) {
+ int ret = 0;
+
device_set_present(dev, false);
if (dev->active && !dev->external) {
- dev->set_state(dev, false);
- dev->set_state(dev, true);
+ ret = dev->set_state(dev, false);
+ if (!ret)
+ ret = dev->set_state(dev, true);
}
- device_set_present(dev, true);
+ if (!ret)
+ device_set_present(dev, true);
}
break;
case DEV_CONFIG_NO_CHANGE: