staging: unisys: stop device registration before visorbus registration
In cases where visorbus is compiled directly into the kernel, if visorbus registration fails for any reason, it is still possible for other drivers to call visorbus_register_visor_driver(), which could cause an oops. Prevent this by saving the result of the call to create_bus() in a static variable, and return an error code when the bus hasn't been registered successfully. Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
418627ddc6
commit
6155a3cf11
|
@ -37,6 +37,8 @@ static int visorbus_debugref;
|
|||
#define POLLJIFFIES_TESTWORK 100
|
||||
#define POLLJIFFIES_NORMALCHANNEL 10
|
||||
|
||||
static int busreg_rc = -ENODEV; /* stores the result from bus registration */
|
||||
|
||||
static int visorbus_uevent(struct device *xdev, struct kobj_uevent_env *env);
|
||||
static int visorbus_match(struct device *xdev, struct device_driver *xdrv);
|
||||
static void fix_vbus_dev_info(struct visor_device *visordev);
|
||||
|
@ -863,6 +865,9 @@ int visorbus_register_visor_driver(struct visor_driver *drv)
|
|||
{
|
||||
int rc = 0;
|
||||
|
||||
if (busreg_rc < 0)
|
||||
return -ENODEV; /*can't register on a nonexistent bus*/
|
||||
|
||||
drv->driver.name = drv->name;
|
||||
drv->driver.bus = &visorbus_type;
|
||||
drv->driver.probe = visordriver_probe_device;
|
||||
|
@ -1262,10 +1267,8 @@ remove_bus_instance(struct visor_device *dev)
|
|||
static int
|
||||
create_bus_type(void)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
rc = bus_register(&visorbus_type);
|
||||
return rc;
|
||||
busreg_rc = bus_register(&visorbus_type);
|
||||
return busreg_rc;
|
||||
}
|
||||
|
||||
/** Remove the one-and-only one instance of the visor bus type (visorbus_type).
|
||||
|
|
Loading…
Reference in New Issue