Skip to contentSkip to conversation

drivers/acpi/scan.c: inconsequent NULL handling

DISCUSSION Adrian Bunk 2 participants 2 messages Jan 6, 2006 ACPI

lore
Share & tools
lore
#0 lore raw

The Coverity checker found the following:

<-- snip -->

static int
acpi_bus_match (
struct acpi_device *device,
struct acpi_driver *driver)

{
        if (driver && driver->ops.match)
                return driver->ops.match(device, driver);
        return acpi_match_ids(device, driver->ids);
}

<-- snip -->

Either driver can be NULL, in which case the driver->ids is a possible NULL pointer reference, or it can't, in which case the check whether it's NULL is superfluous.

cu
Adrian

Signature · 4 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
#1 lore raw
Quoted 10 lines · Adrian Bunk

static int
acpi_bus_match (
struct acpi_device *device,
struct acpi_driver *driver)

{
        if (driver && driver->ops.match)
                return driver->ops.match(device, driver);
        return acpi_match_ids(device, driver->ids);
}
Quoted 3 lines

Either driver can be NULL, in which case the driver->ids is a possible NULL pointer reference, or it can't, in which case the check whether it's NULL is superfluous.

Follow the mon^Wcall tree.

drivers/acpi/scan.c:478: * acpi_bus_match drivers/acpi/scan.c:484:acpi_bus_match(struct acpi_device *device, struct acpi_driver *driver)
drivers/acpi/scan.c:564: if (!acpi_bus_match(dev, drv)) {
drivers/acpi/scan.c:682: if (!acpi_bus_match(device, driver)) {

1. acpi_bus_match()

Second arg is passed without changes.

	acpi_driver_attach()
		acpi_bus_register_driver()

	  ===>	if (!driver) <===
			return_VALUE(-EINVAL);

		spin_lock(&acpi_device_lock);
		list_add_tail(&driver->node, &acpi_bus_drivers);
		spin_unlock(&acpi_device_lock);
		count = acpi_driver_attach(driver);

2. acpi_bus_match()

	acpi_bus_find_driver()

		atomic_inc(&driver->references);
			    ^^^^^^^^
                spin_unlock(&acpi_device_lock);
		if (!acpi_bus_match(device, driver)) {

Looks like it can't.