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 <peeters.g...@gmail.com> Signed-off-by: Hans Dedecker <dedec...@gmail.com> --- interface.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/interface.c b/interface.c index 0b9893c..1a31f4a 100644 --- a/interface.c +++ b/interface.c @@ -581,7 +581,6 @@ static void interface_claim_device(struct interface *iface) { struct interface *parent; - struct device *dev = NULL; if (iface->parent_iface.iface) interface_remove_user(&iface->parent_iface); @@ -592,15 +591,19 @@ interface_claim_device(struct interface *iface) interface_add_user(&iface->parent_iface, parent); } else if (iface->ifname && !(iface->proto_handler->flags & PROTO_FLAG_NODEV)) { + struct device *dev = NULL; + dev = device_get(iface->ifname, true); - interface_set_device_config(iface, dev); - } else { - dev = iface->ext_dev.dev; + if (dev) { + device_lock(); + interface_set_device_config(iface, dev); + interface_set_main_dev(iface, dev); + device_unlock(); + } + } else if (iface->ext_dev.dev) { + interface_set_main_dev(iface, iface->ext_dev.dev); } - if (dev) - interface_set_main_dev(iface, dev); - if (iface->proto_handler->flags & PROTO_FLAG_INIT_AVAILABLE) interface_set_available(iface, true); } -- 1.9.1 _______________________________________________ Lede-dev mailing list Lede-dev@lists.infradead.org http://lists.infradead.org/mailman/listinfo/lede-dev