diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2009-08-08 03:26:25 -0400 |
|---|---|---|
| committer | Len Brown <len.brown@intel.com> | 2009-08-29 22:58:19 -0400 |
| commit | 4b4fe3b62e8d88068083218d3e42c45223b51d29 (patch) | |
| tree | 6d08c8117fc004da8bae7312a3715f1c11ef3ced | |
| parent | 4e231fa4cbd3ff53fcb7d76eccd6fd86a152a95f (diff) | |
ACPI: video - fix potential crash when unloading
thermal_cooling_device_register() returns error encoded in a pointer
when it fails in which case we need to explictly set device->cdev
to NULL so we don't try to unregister it when unloading.
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Acked-by: Zhang Rui <rui.zhang@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
| -rw-r--r-- | drivers/acpi/video.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index 2020907921cc..aab385188599 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
| @@ -997,8 +997,18 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device) | |||
| 997 | 997 | ||
| 998 | device->cdev = thermal_cooling_device_register("LCD", | 998 | device->cdev = thermal_cooling_device_register("LCD", |
| 999 | device->dev, &video_cooling_ops); | 999 | device->dev, &video_cooling_ops); |
| 1000 | if (IS_ERR(device->cdev)) | 1000 | if (IS_ERR(device->cdev)) { |
| 1001 | /* | ||
| 1002 | * Set cdev to NULL so we don't crash trying to | ||
| 1003 | * free it. | ||
| 1004 | * Also, why the hell we are returning early and | ||
| 1005 | * not attempt to register video output if cooling | ||
| 1006 | * device registration failed? | ||
| 1007 | * -- dtor | ||
| 1008 | */ | ||
| 1009 | device->cdev = NULL; | ||
| 1001 | return; | 1010 | return; |
| 1011 | } | ||
| 1002 | 1012 | ||
| 1003 | dev_info(&device->dev->dev, "registered as cooling_device%d\n", | 1013 | dev_info(&device->dev->dev, "registered as cooling_device%d\n", |
| 1004 | device->cdev->id); | 1014 | device->cdev->id); |
