diff options
author | Hans Dedecker <dedeckeh@gmail.com> | 2016-02-01 10:56:30 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2016-02-01 11:09:58 +0100 |
commit | 3610a24b218974bdf2d2f709a8af9e4a990c47bd (patch) | |
tree | 8e7b0eacc70ed22586592e556482cd71f507cf09 /device.c | |
parent | abbea9ebe8a8b56032e0f85b8572f0671dc094e5 (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.c | 13 |
1 files changed, 10 insertions, 3 deletions
@@ -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: |