driver-core: do not register a driver with bus_type not registered
If the bus_type is not registerd, driver_register to that bus will cause oops. I found this bug when test built-in usb serial drivers (ie. aircable driver) with 'nousb' cmdline params. In this patch: 1. set the bus->p=NULL when bus_register failed and unregisterd. 2. if bus->p is NULL, driver_register BUG_ON will be triggered. Signed-off-by: Dave Young <hidave.darkstar@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
e5779a583d
commit
f48f3febb2
|
@ -932,6 +932,7 @@ bus_uevent_fail:
|
||||||
kset_unregister(&bus->p->subsys);
|
kset_unregister(&bus->p->subsys);
|
||||||
kfree(bus->p);
|
kfree(bus->p);
|
||||||
out:
|
out:
|
||||||
|
bus->p = NULL;
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(bus_register);
|
EXPORT_SYMBOL_GPL(bus_register);
|
||||||
|
@ -953,6 +954,7 @@ void bus_unregister(struct bus_type *bus)
|
||||||
bus_remove_file(bus, &bus_attr_uevent);
|
bus_remove_file(bus, &bus_attr_uevent);
|
||||||
kset_unregister(&bus->p->subsys);
|
kset_unregister(&bus->p->subsys);
|
||||||
kfree(bus->p);
|
kfree(bus->p);
|
||||||
|
bus->p = NULL;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(bus_unregister);
|
EXPORT_SYMBOL_GPL(bus_unregister);
|
||||||
|
|
||||||
|
|
|
@ -216,6 +216,8 @@ int driver_register(struct device_driver *drv)
|
||||||
int ret;
|
int ret;
|
||||||
struct device_driver *other;
|
struct device_driver *other;
|
||||||
|
|
||||||
|
BUG_ON(!drv->bus->p);
|
||||||
|
|
||||||
if ((drv->bus->probe && drv->probe) ||
|
if ((drv->bus->probe && drv->probe) ||
|
||||||
(drv->bus->remove && drv->remove) ||
|
(drv->bus->remove && drv->remove) ||
|
||||||
(drv->bus->shutdown && drv->shutdown))
|
(drv->bus->shutdown && drv->shutdown))
|
||||||
|
|
Loading…
Reference in New Issue