fix use-after-free when an interface event is pending while the interface is being...
[project/netifd.git] / device.c
index 46177a2..0560a70 100644 (file)
--- a/device.c
+++ b/device.c
@@ -112,7 +112,6 @@ static void simple_device_free(struct device *dev)
 {
        if (dev->parent.dev)
                device_remove_user(&dev->parent);
-       device_cleanup(dev);
        free(dev);
 }
 
@@ -162,8 +161,6 @@ static void alias_device_free(struct device *dev)
 {
        struct alias_device *alias;
 
-       device_cleanup(dev);
-
        alias = container_of(dev, struct alias_device, dev);
        avl_delete(&aliases, &alias->avl);
        free(alias);
@@ -469,6 +466,9 @@ void device_add_user(struct device_user *dep, struct device *dev)
        if (dep->dev)
                device_remove_user(dep);
 
+       if (!dev)
+               return;
+
        dep->dev = dev;
        list_add_tail(&dep->list, &dev->users);
        if (dep->cb && dev->present) {
@@ -483,6 +483,7 @@ device_free(struct device *dev)
 {
        __devlock++;
        free(dev->config);
+       device_cleanup(dev);
        dev->type->free(dev);
        __devlock--;
 }