device: Fix null pointer derefence if device is unset
authorHans Dedecker <dedeckeh@gmail.com>
Mon, 1 Feb 2016 09:56:30 +0000 (10:56 +0100)
committerFelix Fietkau <nbd@openwrt.org>
Mon, 1 Feb 2016 10:09:58 +0000 (11:09 +0100)
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>
device.c

index 3404feef93da5df07c8a5e2a73a23197ee40daaf..9344e1bd89abd7ab316ccc8ac8bac7c6fe5b9441 100644 (file)
--- 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: