From: Felix Fietkau Date: Thu, 11 Aug 2016 17:36:09 +0000 (+0200) Subject: Prevent premature device free in interface_claim_device X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=commitdiff_plain;h=c8a5f1ae361ab61192be6085c29d977eb73a05f5;hp=cec1ce296eede81dc62628fce33b8cc216727b17 Prevent premature device free in interface_claim_device interface_set_device_config can trigger a device free (for example if the device is here only present in a bridge), which renders dev invalid and leads to segfault. Add a lock to prevent this and clean-up the code for readability. Signed-off-by: Gino Peeters Signed-off-by: Hans Dedecker Signed-off-by: Felix Fietkau --- diff --git a/interface.c b/interface.c index 0b9893c..71e2ecc 100644 --- a/interface.c +++ b/interface.c @@ -586,6 +586,8 @@ interface_claim_device(struct interface *iface) if (iface->parent_iface.iface) interface_remove_user(&iface->parent_iface); + device_lock(); + if (iface->parent_ifname) { parent = vlist_find(&interfaces, iface->parent_ifname, parent, node); iface->parent_iface.cb = interface_alias_cb; @@ -601,6 +603,8 @@ interface_claim_device(struct interface *iface) if (dev) interface_set_main_dev(iface, dev); + device_unlock(); + if (iface->proto_handler->flags & PROTO_FLAG_INIT_AVAILABLE) interface_set_available(iface, true); }