ACPI: dock: fix opps after dock driver fails to initialize
The driver tests the dock_station pointer for nonnull to check whether it has initialized properly. But in some cases dock_station will be non-null after being freed when driver init fails. Fix by zeroing the pointer after freeing. Signed-off-by: Chuck Ebbert <cebbert@redhat.com> Signed-off-by: Kristen Carlson Accardi <kristen.c.accardi@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
parent
38ff4ffc03
commit
22fe4c2114
@ -715,6 +715,7 @@ static int dock_add(acpi_handle handle)
|
|||||||
if (ret) {
|
if (ret) {
|
||||||
printk(KERN_ERR PREFIX "Error %d registering dock device\n", ret);
|
printk(KERN_ERR PREFIX "Error %d registering dock device\n", ret);
|
||||||
kfree(dock_station);
|
kfree(dock_station);
|
||||||
|
dock_station = NULL;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
ret = device_create_file(&dock_device.dev, &dev_attr_docked);
|
ret = device_create_file(&dock_device.dev, &dev_attr_docked);
|
||||||
@ -722,6 +723,7 @@ static int dock_add(acpi_handle handle)
|
|||||||
printk("Error %d adding sysfs file\n", ret);
|
printk("Error %d adding sysfs file\n", ret);
|
||||||
platform_device_unregister(&dock_device);
|
platform_device_unregister(&dock_device);
|
||||||
kfree(dock_station);
|
kfree(dock_station);
|
||||||
|
dock_station = NULL;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
ret = device_create_file(&dock_device.dev, &dev_attr_undock);
|
ret = device_create_file(&dock_device.dev, &dev_attr_undock);
|
||||||
@ -730,6 +732,7 @@ static int dock_add(acpi_handle handle)
|
|||||||
device_remove_file(&dock_device.dev, &dev_attr_docked);
|
device_remove_file(&dock_device.dev, &dev_attr_docked);
|
||||||
platform_device_unregister(&dock_device);
|
platform_device_unregister(&dock_device);
|
||||||
kfree(dock_station);
|
kfree(dock_station);
|
||||||
|
dock_station = NULL;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
ret = device_create_file(&dock_device.dev, &dev_attr_uid);
|
ret = device_create_file(&dock_device.dev, &dev_attr_uid);
|
||||||
@ -739,6 +742,7 @@ static int dock_add(acpi_handle handle)
|
|||||||
device_remove_file(&dock_device.dev, &dev_attr_undock);
|
device_remove_file(&dock_device.dev, &dev_attr_undock);
|
||||||
platform_device_unregister(&dock_device);
|
platform_device_unregister(&dock_device);
|
||||||
kfree(dock_station);
|
kfree(dock_station);
|
||||||
|
dock_station = NULL;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -751,6 +755,7 @@ static int dock_add(acpi_handle handle)
|
|||||||
dd = alloc_dock_dependent_device(handle);
|
dd = alloc_dock_dependent_device(handle);
|
||||||
if (!dd) {
|
if (!dd) {
|
||||||
kfree(dock_station);
|
kfree(dock_station);
|
||||||
|
dock_station = NULL;
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto dock_add_err_unregister;
|
goto dock_add_err_unregister;
|
||||||
}
|
}
|
||||||
@ -779,6 +784,7 @@ dock_add_err_unregister:
|
|||||||
device_remove_file(&dock_device.dev, &dev_attr_uid);
|
device_remove_file(&dock_device.dev, &dev_attr_uid);
|
||||||
platform_device_unregister(&dock_device);
|
platform_device_unregister(&dock_device);
|
||||||
kfree(dock_station);
|
kfree(dock_station);
|
||||||
|
dock_station = NULL;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -813,6 +819,7 @@ static int dock_remove(void)
|
|||||||
|
|
||||||
/* free dock station memory */
|
/* free dock station memory */
|
||||||
kfree(dock_station);
|
kfree(dock_station);
|
||||||
|
dock_station = NULL;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user