X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=interface.c;h=b0fe9deee601eee0dc2bf8b82dba2d9bec89b52c;hp=65bc37d07154d64fbf010c7150d213fd0e65845f;hb=65cab45660dd0b234b663a39a133c64271f667b7;hpb=c9dadceeba2faa311e4a086f1c6a5eb0d5577c9f diff --git a/interface.c b/interface.c index 65bc37d..b0fe9de 100644 --- a/interface.c +++ b/interface.c @@ -319,7 +319,7 @@ interface_cb(struct device_user *dep, enum device_event ev) new_state = true; case DEV_EVENT_REMOVE: interface_set_available(iface, new_state); - if (!new_state && dep->dev->external) + if (!new_state && dep->dev && dep->dev->external) interface_set_main_dev(iface, NULL); break; case DEV_EVENT_UP: @@ -766,8 +766,10 @@ interface_set_l3_dev(struct interface *iface, struct device *dev) device_add_user(&iface->l3_dev, dev); if (dev) { - if (claimed) - device_claim(&iface->l3_dev); + if (claimed) { + if (device_claim(&iface->l3_dev) < 0) + return; + } interface_ip_set_enabled(&iface->config_ip, enabled); } } @@ -780,14 +782,17 @@ interface_set_main_dev(struct interface *iface, struct device *dev) if (iface->main_dev.dev == dev) return; + interface_set_available(iface, false); device_add_user(&iface->main_dev, dev); if (!dev) { interface_set_link_state(iface, false); return; } - if (claimed) - device_claim(&iface->l3_dev); + if (claimed) { + if (device_claim(&iface->l3_dev) < 0) + return; + } if (!iface->l3_dev.dev) interface_set_l3_dev(iface, dev); @@ -1019,7 +1024,8 @@ interface_change_config(struct interface *if_old, struct interface *if_new) } interface_write_resolv_conf(); - interface_check_state(if_old); + if (if_old->main_dev.dev) + interface_check_state(if_old); out: if_new->config = NULL;