ACPI video: Harden video bus adding.
authorIgor Murzov <intergalactic.anonymous@gmail.com>
Fri, 30 Mar 2012 17:32:08 +0000 (21:32 +0400)
committerLen Brown <len.brown@intel.com>
Fri, 30 Mar 2012 19:44:05 +0000 (15:44 -0400)
It is always better to check return values, so add some new checks and
correct existing ones.

v2: Be consistent and don't mix errors from -E* and AE_* namespaces.

Signed-off-by: Igor Murzov <e-mail@date.by>
Signed-off-by: Len Brown <len.brown@intel.com>
drivers/acpi/video.c

index eaef02afc7cfce7004e3d74e25b733ee4d54cb97..462486b9f9b2885e9972f5a5a709af87aafa2d86 100644 (file)
@@ -548,27 +548,27 @@ acpi_video_device_EDID(struct acpi_video_device *device,
  *             1.      The system BIOS should NOT automatically control the brightness 
  *                     level of the LCD when the power changes from AC to DC.
  * Return Value:
- *             -1      wrong arg.
+ *             -EINVAL wrong arg.
  */
 
 static int
 acpi_video_bus_DOS(struct acpi_video_bus *video, int bios_flag, int lcd_flag)
 {
-       u64 status = 0;
+       acpi_status status;
        union acpi_object arg0 = { ACPI_TYPE_INTEGER };
        struct acpi_object_list args = { 1, &arg0 };
 
 
-       if (bios_flag < 0 || bios_flag > 3 || lcd_flag < 0 || lcd_flag > 1) {
-               status = -1;
-               goto Failed;
-       }
+       if (bios_flag < 0 || bios_flag > 3 || lcd_flag < 0 || lcd_flag > 1)
+               return -EINVAL;
        arg0.integer.value = (lcd_flag << 2) | bios_flag;
        video->dos_setting = arg0.integer.value;
-       acpi_evaluate_object(video->device->handle, "_DOS", &args, NULL);
+       status = acpi_evaluate_object(video->device->handle, "_DOS",
+               &args, NULL);
+       if (ACPI_FAILURE(status))
+               return -EIO;
 
-      Failed:
-       return status;
+       return 0;
 }
 
 /*
@@ -1343,15 +1343,17 @@ static int
 acpi_video_bus_get_devices(struct acpi_video_bus *video,
                           struct acpi_device *device)
 {
-       int status = 0;
+       int status;
        struct acpi_device *dev;
 
-       acpi_video_device_enumerate(video);
+       status = acpi_video_device_enumerate(video);
+       if (status)
+               return status;
 
        list_for_each_entry(dev, &device->children, node) {
 
                status = acpi_video_bus_get_one_device(dev, video);
-               if (ACPI_FAILURE(status)) {
+               if (status) {
                        printk(KERN_WARNING PREFIX
                                        "Can't attach device\n");
                        continue;
@@ -1653,8 +1655,12 @@ static int acpi_video_bus_add(struct acpi_device *device)
        mutex_init(&video->device_list_lock);
        INIT_LIST_HEAD(&video->video_device_list);
 
-       acpi_video_bus_get_devices(video, device);
-       acpi_video_bus_start_devices(video);
+       error = acpi_video_bus_get_devices(video, device);
+       if (error)
+               goto err_free_video;
+       error = acpi_video_bus_start_devices(video);
+       if (error)
+               goto err_put_video;
 
        video->input = input = input_allocate_device();
        if (!input) {
@@ -1692,14 +1698,19 @@ static int acpi_video_bus_add(struct acpi_device *device)
 
        video->pm_nb.notifier_call = acpi_video_resume;
        video->pm_nb.priority = 0;
-       register_pm_notifier(&video->pm_nb);
+       error = register_pm_notifier(&video->pm_nb);
+       if (error)
+               goto err_unregister_input_dev;
 
        return 0;
 
+ err_unregister_input_dev:
+       input_unregister_device(input);
  err_free_input_dev:
        input_free_device(input);
  err_stop_video:
        acpi_video_bus_stop_devices(video);
+ err_put_video:
        acpi_video_bus_put_devices(video);
        kfree(video->attached_array);
  err_free_video: