[LEDE-DEV] [PATCH 4/5 netifd] Prevent premature device free in interface_claim_device

Felix Fietkau nbd at nbd.name
Thu Aug 11 10:39:37 PDT 2016


On 2016-08-11 15:53, Hans Dedecker wrote:
> 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.gino at gmail.com>
> Signed-off-by: Hans Dedecker <dedeckeh at 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);
> -
I don't consider the 'cleanup' part an improvement over the old code, so
I made a different change that simply adds the device_lock/unlock calls
around the whole block.
Applied the rest of the patches in this series.

- Felix



More information about the Lede-dev mailing list