Skip to contentSkip to conversation

drivers/acpi/video.c: null pointer dereference

DISCUSSION Adrian Bunk 2 participants 2 messages Mar 24, 2005 – Mar 31, 2005 ACPI

lore
Share & tools
lore
#0 lore raw

The Coverity checker found the following null pointer dereference in drivers/acpi/video.c:

<-- snip -->

...
static int
acpi_video_switch_output(
...
{
...

        struct acpi_video_device *dev=NULL;
...
        list_for_each_safe(node, next, &video->video_device_list) {
                struct acpi_video_device * dev = container_of(node, struct acpi_video_device, entry);
...
        }
...
        switch (event) {
        case ACPI_VIDEO_NOTIFY_CYCLE:
        case ACPI_VIDEO_NOTIFY_NEXT_OUTPUT:
                acpi_video_device_set_state(dev, 0);
                acpi_video_device_set_state(dev_next, 0x80000001);
                break;
        case ACPI_VIDEO_NOTIFY_PREV_OUTPUT:
                acpi_video_device_set_state(dev, 0);
                acpi_video_device_set_state(dev_prev, 0x80000001);

...

<-- snip -->

Two different variables of the same name within 40 lines of code are a good indication that something's wrong...

The outer "dev" variable is never assigned any value different from NULL.

acpi_video_device_set_state dereferences this variable.

cu
Adrian

Signature · 12 lines
       "Is there not promise of rain?" Ling Tan asked suddenly out
        of the darkness. There had been need of rain for many days.
       "Only a promise," Lao Er said.
                                       Pearl S. Buck - Dragon Seed



-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
#1 lore raw
Quoted 37 lines · Adrian Bunk

The Coverity checker found the following null pointer dereference in drivers/acpi/video.c:

<-- snip -->

...
static int
acpi_video_switch_output(
...
{
...

        struct acpi_video_device *dev=NULL;

...
list_for_each_safe(node, next, &video->video_device_list) {
struct acpi_video_device * dev = container_of(node,
struct acpi_video_device, entry);
...

        }
...
        switch (event) {
        case ACPI_VIDEO_NOTIFY_CYCLE:
        case ACPI_VIDEO_NOTIFY_NEXT_OUTPUT:
                acpi_video_device_set_state(dev, 0);
                acpi_video_device_set_state(dev_next, 0x80000001);
                break;
        case ACPI_VIDEO_NOTIFY_PREV_OUTPUT:
                acpi_video_device_set_state(dev, 0);
                acpi_video_device_set_state(dev_prev, 0x80000001);

...

<-- snip -->

Two different variables of the same name within 40 lines of code are a good indication that something's wrong...

Quoted 8 lines

The outer "dev" variable is never assigned any value different from NULL.

acpi_video_device_set_state dereferences this variable.

cu
Adrian

Looks like we should do this:

===== drivers/acpi/video.c 1.8 vs edited =====

drivers/acpi/video.c +1 -1
@@ -1585,7 +1585,7 @@
 	ACPI_FUNCTION_TRACE("acpi_video_switch_output");
 
 	list_for_each_safe(node, next, &video->video_device_list) {
-		struct acpi_video_device * dev = container_of(node, struct acpi_video_device, entry);
+		dev = container_of(node, struct acpi_video_device, entry);
 		status = acpi_video_device_get_state(dev, &state);
 		if (state & 0x2){
 			dev_next = container_of(node->next, struct acpi_video_device, entry);