Francesco Ruggeri <frugg...@arista.com> writes:
> macvtap_device_event(NETDEV_UNREGISTER) should check vlan->minor to > determine if it is being invoked in the context of a macvtap_newlink > that failed, for example in this code sequence: > > macvtap_newlink > macvlan_common_newlink > register_netdevice > call_netdevice_notifiers(NETDEV_REGISTER, dev) > macvtap_device_event(NETDEV_REGISTER) > <fail here, vlan->minor = 0> > rollback_registered(dev); > rollback_registered_many > call_netdevice_notifiers(NETDEV_UNREGISTER, dev); > macvtap_device_event(NETDEV_UNREGISTER) > <nothing to clean up here> > Acked-by: "Eric W. Biederman" <ebied...@xmission.com> > Signed-off-by: Francesco Ruggeri <frugg...@arista.com> > --- > drivers/net/macvtap.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c > index 95394ed..74cb15a 100644 > --- a/drivers/net/macvtap.c > +++ b/drivers/net/macvtap.c > @@ -1303,6 +1303,9 @@ static int macvtap_device_event(struct notifier_block > *unused, > } > break; > case NETDEV_UNREGISTER: > + /* vlan->minor == 0 if NETDEV_REGISTER above failed */ > + if (vlan->minor == 0) > + break; > devt = MKDEV(MAJOR(macvtap_major), vlan->minor); > device_destroy(macvtap_class, devt); > macvtap_free_minor(vlan);