iprule: fix segfault (FS#1875)
[project/netifd.git] / interface.c
index 6be10e279b4dc8e16b2d98fa328efbc8ca408ac4..b508b10457551dc78b7bcc11bd54e0d5a35f84b4 100644 (file)
@@ -284,7 +284,7 @@ mark_interface_down(struct interface *iface)
        system_flush_routes();
 }
 
-void
+static void
 __interface_set_down(struct interface *iface, bool force)
 {
        enum interface_state state = iface->state;
@@ -1047,34 +1047,38 @@ out:
        return ret;
 }
 
-int
+void
 interface_set_up(struct interface *iface)
 {
        int ret;
+       const char *error = NULL;
 
        iface->autostart = true;
 
        if (iface->state != IFS_DOWN)
-               return 0;
+               return;
 
        interface_clear_errors(iface);
-       if (!iface->available) {
-               interface_add_error(iface, "interface", "NO_DEVICE", NULL, 0);
-               return -1;
-       }
-
-       if (iface->main_dev.dev) {
-               ret = device_claim(&iface->main_dev);
-               if (!ret)
-                       interface_check_state(iface);
-       }
-       else
-               ret = __interface_set_up(iface);
+       if (iface->available) {
+               if (iface->main_dev.dev) {
+                       ret = device_claim(&iface->main_dev);
+                       if (!ret)
+                               interface_check_state(iface);
+                       else
+                               error = "DEVICE_CLAIM_FAILED";
+               } else {
+                       ret = __interface_set_up(iface);
+                       if (ret)
+                               error = "SETUP_FAILED";
+               }
+       } else
+               error = "NO_DEVICE";
 
-       return ret;
+       if (error)
+               interface_add_error(iface, "interface", error, NULL, 0);
 }
 
-int
+void
 interface_set_down(struct interface *iface)
 {
        if (!iface) {
@@ -1084,8 +1088,6 @@ interface_set_down(struct interface *iface)
                iface->autostart = false;
                __interface_set_down(iface, false);
        }
-
-       return 0;
 }
 
 int