2010-02-11 09:57:09

by Darren Jenkins

[permalink] [raw]
Subject: [PATCH] drivers/acpi/processor_thermal.c

There are a few places where a pointer is dereferenced with acpi_driver_data()
before a NULL test. This re-orders the code to fix these issues.

Coverity CID: 2752 2751 2750

Signed-off-by: Darren Jenkins <[email protected]>
---
drivers/acpi/processor_thermal.c | 28 ++++++++++++++++++++--------
1 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/drivers/acpi/processor_thermal.c b/drivers/acpi/processor_thermal.c
index 6deafb4..ec33554 100644
--- a/drivers/acpi/processor_thermal.c
+++ b/drivers/acpi/processor_thermal.c
@@ -379,9 +379,14 @@ processor_get_max_state(struct thermal_cooling_device *cdev,
unsigned long *state)
{
struct acpi_device *device = cdev->devdata;
- struct acpi_processor *pr = acpi_driver_data(device);
+ struct acpi_processor *pr;

- if (!device || !pr)
+ if (!device)
+ return -EINVAL;
+
+ pr = acpi_driver_data(device);
+
+ if (!pr)
return -EINVAL;

*state = acpi_processor_max_state(pr);
@@ -393,9 +398,14 @@ processor_get_cur_state(struct thermal_cooling_device *cdev,
unsigned long *cur_state)
{
struct acpi_device *device = cdev->devdata;
- struct acpi_processor *pr = acpi_driver_data(device);
+ struct acpi_processor *pr;
+
+ if (!device)
+ return -EINVAL;

- if (!device || !pr)
+ pr = acpi_driver_data(device);
+
+ if (!pr)
return -EINVAL;

*cur_state = cpufreq_get_cur_state(pr->id);
@@ -409,18 +419,20 @@ processor_set_cur_state(struct thermal_cooling_device *cdev,
unsigned long state)
{
struct acpi_device *device = cdev->devdata;
- struct acpi_processor *pr = acpi_driver_data(device);
+ struct acpi_processor *pr;
int result = 0;
int max_pstate;

- if (!device || !pr)
+ if (!device)
return -EINVAL;

- max_pstate = cpufreq_get_max_state(pr->id);
+ pr = acpi_driver_data(device);

- if (state > acpi_processor_max_state(pr))
+ if (!pr || state > acpi_processor_max_state(pr))
return -EINVAL;

+ max_pstate = cpufreq_get_max_state(pr->id);
+
if (state <= max_pstate) {
if (pr->flags.throttling && pr->throttling.state)
result = acpi_processor_set_throttling(pr, 0, false);
--
1.6.3.3




2010-02-11 10:24:55

by Thomas Renninger

[permalink] [raw]
Subject: Re: [PATCH] drivers/acpi/processor_thermal.c

Eh,

what is this for?:
static inline void *acpi_driver_data(struct acpi_device *d)
{
return d->driver_data;
}

On Thursday 11 February 2010 10:56:51 Darren Jenkins wrote:
> There are a few places where a pointer is dereferenced with acpi_driver_data()
> before a NULL test. This re-orders the code to fix these issues.
>
> Coverity CID: 2752 2751 2750
>
> Signed-off-by: Darren Jenkins <[email protected]>
> ---
> drivers/acpi/processor_thermal.c | 28 ++++++++++++++++++++--------
> 1 files changed, 20 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/acpi/processor_thermal.c b/drivers/acpi/processor_thermal.c
> index 6deafb4..ec33554 100644
> --- a/drivers/acpi/processor_thermal.c
> +++ b/drivers/acpi/processor_thermal.c
> @@ -379,9 +379,14 @@ processor_get_max_state(struct thermal_cooling_device *cdev,
> unsigned long *state)
> {
> struct acpi_device *device = cdev->devdata;
> - struct acpi_processor *pr = acpi_driver_data(device);
> + struct acpi_processor *pr;
>
> - if (!device || !pr)
> + if (!device)
> + return -EINVAL;
> +
> + pr = acpi_driver_data(device);
Better use (here and at other places):
device->driver_data
instead of
acpi_driver_data(device)

if you touch this anyway.
Then such bugs like the one you address here, don't happen
anymore in the future.
If you have some more time you might want to revert all the
other instances and revert the acpi_driver_data declaration
in include/acpi/acpi_bus.h

Thanks,

Thomas

2010-02-11 10:52:32

by Julia Lawall

[permalink] [raw]
Subject: Re: [PATCH] drivers/acpi/processor_thermal.c

On Thu, 11 Feb 2010, Thomas Renninger wrote:

> Eh,
>
> what is this for?:
> static inline void *acpi_driver_data(struct acpi_device *d)
> {
> return d->driver_data;
> }
>
> On Thursday 11 February 2010 10:56:51 Darren Jenkins wrote:
> > There are a few places where a pointer is dereferenced with acpi_driver_data()
> > before a NULL test. This re-orders the code to fix these issues.
> >
> > Coverity CID: 2752 2751 2750
> >
> > Signed-off-by: Darren Jenkins <[email protected]>
> > ---
> > drivers/acpi/processor_thermal.c | 28 ++++++++++++++++++++--------
> > 1 files changed, 20 insertions(+), 8 deletions(-)
> >
> > diff --git a/drivers/acpi/processor_thermal.c b/drivers/acpi/processor_thermal.c
> > index 6deafb4..ec33554 100644
> > --- a/drivers/acpi/processor_thermal.c
> > +++ b/drivers/acpi/processor_thermal.c
> > @@ -379,9 +379,14 @@ processor_get_max_state(struct thermal_cooling_device *cdev,
> > unsigned long *state)
> > {
> > struct acpi_device *device = cdev->devdata;
> > - struct acpi_processor *pr = acpi_driver_data(device);
> > + struct acpi_processor *pr;
> >
> > - if (!device || !pr)
> > + if (!device)
> > + return -EINVAL;
> > +
> > + pr = acpi_driver_data(device);
> Better use (here and at other places):
> device->driver_data
> instead of
> acpi_driver_data(device)
>
> if you touch this anyway.
> Then such bugs like the one you address here, don't happen
> anymore in the future.
> If you have some more time you might want to revert all the
> other instances and revert the acpi_driver_data declaration
> in include/acpi/acpi_bus.h


A potential patch that gets rid of the uses is below. I don't have time
to look at this in more detail at the moment, but perhaps someone else
would like to do so. The semantic patch (http://coccinelle.lip6.fr)
involved is:

@@
struct acpi_device *d;
@@

- acpi_driver_data(d)
+ d->driver_data

julia

---------------
diff -u -p a/arch/x86/kernel/cpu/cpufreq/longhaul.c b/arch/x86/kernel/cpu/cpufreq/longhaul.c
--- a/arch/x86/kernel/cpu/cpufreq/longhaul.c 2009-12-03 14:09:47.000000000 +0100
+++ b/arch/x86/kernel/cpu/cpufreq/longhaul.c 2010-02-11 12:48:46.000000000 +0100
@@ -699,7 +699,7 @@ static acpi_status longhaul_walk_callbac
if (acpi_bus_get_device(obj_handle, &d))
return 0;

- *return_value = acpi_driver_data(d);
+ *return_value = d->driver_data;
return 1;
}

diff -u -p a/drivers/acpi/ac.c b/drivers/acpi/ac.c
--- a/drivers/acpi/ac.c 2009-10-17 10:35:58.000000000 +0200
+++ b/drivers/acpi/ac.c 2010-02-11 12:48:47.000000000 +0100
@@ -201,7 +201,7 @@ static int acpi_ac_add_fs(struct acpi_de
/* 'state' [R] */
entry = proc_create_data(ACPI_AC_FILE_STATE,
S_IRUGO, acpi_device_dir(device),
- &acpi_ac_fops, acpi_driver_data(device));
+ &acpi_ac_fops, device->driver_data);
if (!entry)
return -ENODEV;
return 0;
@@ -227,7 +227,7 @@ static int acpi_ac_remove_fs(struct acpi

static void acpi_ac_notify(struct acpi_device *device, u32 event)
{
- struct acpi_ac *ac = acpi_driver_data(device);
+ struct acpi_ac *ac = device->driver_data;


if (!ac)
@@ -309,9 +309,9 @@ static int acpi_ac_resume(struct acpi_de
{
struct acpi_ac *ac;
unsigned old_state;
- if (!device || !acpi_driver_data(device))
+ if (!device || !device->driver_data)
return -EINVAL;
- ac = acpi_driver_data(device);
+ ac = device->driver_data;
old_state = ac->state;
if (acpi_ac_get_state(ac))
return 0;
@@ -327,10 +327,10 @@ static int acpi_ac_remove(struct acpi_de
struct acpi_ac *ac = NULL;


- if (!device || !acpi_driver_data(device))
+ if (!device || !device->driver_data)
return -EINVAL;

- ac = acpi_driver_data(device);
+ ac = device->driver_data;

#ifdef CONFIG_ACPI_SYSFS_POWER
if (ac->charger.dev)
diff -u -p a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c
--- a/drivers/acpi/acpi_memhotplug.c 2009-12-03 14:09:47.000000000 +0100
+++ b/drivers/acpi/acpi_memhotplug.c 2010-02-11 12:48:47.000000000 +0100
@@ -184,7 +184,7 @@ acpi_memory_get_device(acpi_handle handl
}

end:
- *mem_device = acpi_driver_data(device);
+ *mem_device = device->driver_data;
if (!(*mem_device)) {
printk(KERN_ERR "\n driver data not found");
return -ENODEV;
@@ -370,7 +370,7 @@ static void acpi_memory_device_notify(ac
printk(KERN_ERR PREFIX "Device doesn't exist\n");
break;
}
- mem_device = acpi_driver_data(device);
+ mem_device = device->driver_data;
if (!mem_device) {
printk(KERN_ERR PREFIX "Driver Data is NULL\n");
break;
@@ -453,10 +453,10 @@ static int acpi_memory_device_remove(str
struct acpi_memory_device *mem_device = NULL;


- if (!device || !acpi_driver_data(device))
+ if (!device || !device->driver_data)
return -EINVAL;

- mem_device = acpi_driver_data(device);
+ mem_device = device->driver_data;
kfree(mem_device);

return 0;
diff -u -p a/drivers/acpi/battery.c b/drivers/acpi/battery.c
--- a/drivers/acpi/battery.c 2010-01-29 18:29:07.000000000 +0100
+++ b/drivers/acpi/battery.c 2010-02-11 12:48:46.000000000 +0100
@@ -838,7 +838,7 @@ static int acpi_battery_add_fs(struct ac
acpi_battery_file[i].mode,
acpi_device_dir(device),
&acpi_battery_file[i].ops,
- acpi_driver_data(device));
+ device->driver_data);
if (!entry)
return -ENODEV;
}
@@ -866,7 +866,7 @@ static void acpi_battery_remove_fs(struc

static void acpi_battery_notify(struct acpi_device *device, u32 event)
{
- struct acpi_battery *battery = acpi_driver_data(device);
+ struct acpi_battery *battery = device->driver_data;

if (!battery)
return;
@@ -922,9 +922,9 @@ static int acpi_battery_remove(struct ac
{
struct acpi_battery *battery = NULL;

- if (!device || !acpi_driver_data(device))
+ if (!device || !device->driver_data)
return -EINVAL;
- battery = acpi_driver_data(device);
+ battery = device->driver_data;
#ifdef CONFIG_ACPI_PROCFS_POWER
acpi_battery_remove_fs(device);
#endif
@@ -942,7 +942,7 @@ static int acpi_battery_resume(struct ac
struct acpi_battery *battery;
if (!device)
return -EINVAL;
- battery = acpi_driver_data(device);
+ battery = device->driver_data;
battery->update_time = 0;
acpi_battery_update(battery);
return 0;
diff -u -p a/drivers/acpi/button.c b/drivers/acpi/button.c
--- a/drivers/acpi/button.c 2010-01-20 13:04:05.000000000 +0100
+++ b/drivers/acpi/button.c 2010-02-11 12:48:46.000000000 +0100
@@ -162,7 +162,7 @@ static struct proc_dir_entry *acpi_lid_d

static int acpi_button_add_fs(struct acpi_device *device)
{
- struct acpi_button *button = acpi_driver_data(device);
+ struct acpi_button *button = device->driver_data;
struct proc_dir_entry *entry = NULL;

switch (button->type) {
@@ -214,7 +214,7 @@ static int acpi_button_add_fs(struct acp

static int acpi_button_remove_fs(struct acpi_device *device)
{
- struct acpi_button *button = acpi_driver_data(device);
+ struct acpi_button *button = device->driver_data;

if (acpi_device_dir(device)) {
if (button->type == ACPI_BUTTON_TYPE_LID)
@@ -265,7 +265,7 @@ EXPORT_SYMBOL(acpi_lid_open);

static int acpi_lid_send_state(struct acpi_device *device)
{
- struct acpi_button *button = acpi_driver_data(device);
+ struct acpi_button *button = device->driver_data;
unsigned long long state;
acpi_status status;
int ret;
@@ -294,7 +294,7 @@ static int acpi_lid_send_state(struct ac

static void acpi_button_notify(struct acpi_device *device, u32 event)
{
- struct acpi_button *button = acpi_driver_data(device);
+ struct acpi_button *button = device->driver_data;
struct input_dev *input;

switch (event) {
@@ -326,7 +326,7 @@ static void acpi_button_notify(struct ac

static int acpi_button_resume(struct acpi_device *device)
{
- struct acpi_button *button = acpi_driver_data(device);
+ struct acpi_button *button = device->driver_data;

if (button->type == ACPI_BUTTON_TYPE_LID)
return acpi_lid_send_state(device);
@@ -444,7 +444,7 @@ static int acpi_button_add(struct acpi_d

static int acpi_button_remove(struct acpi_device *device, int type)
{
- struct acpi_button *button = acpi_driver_data(device);
+ struct acpi_button *button = device->driver_data;

if (device->wakeup.flags.valid) {
acpi_unref_runtime_gpe(device->wakeup.gpe_device,
diff -u -p a/drivers/acpi/container.c b/drivers/acpi/container.c
--- a/drivers/acpi/container.c 2009-12-03 14:09:47.000000000 +0100
+++ b/drivers/acpi/container.c 2010-02-11 12:48:46.000000000 +0100
@@ -122,7 +122,7 @@ static int acpi_container_remove(struct
acpi_status status = AE_OK;
struct acpi_container *pc = NULL;

- pc = acpi_driver_data(device);
+ pc = device->driver_data;
kfree(pc);
return status;
}
diff -u -p a/drivers/acpi/ec.c b/drivers/acpi/ec.c
--- a/drivers/acpi/ec.c 2010-01-29 18:29:07.000000000 +0100
+++ b/drivers/acpi/ec.c 2010-02-11 12:48:48.000000000 +0100
@@ -693,7 +693,7 @@ static int acpi_ec_add_fs(struct acpi_de

entry = proc_create_data(ACPI_EC_FILE_INFO, S_IRUGO,
acpi_device_dir(device),
- &acpi_ec_info_ops, acpi_driver_data(device));
+ &acpi_ec_info_ops, device->driver_data);
if (!entry)
return -ENODEV;
return 0;
@@ -880,7 +880,7 @@ static int acpi_ec_remove(struct acpi_de
if (!device)
return -EINVAL;

- ec = acpi_driver_data(device);
+ ec = device->driver_data;
ec_remove_handlers(ec);
mutex_lock(&ec->lock);
list_for_each_entry_safe(handler, tmp, &ec->list, node) {
@@ -1058,7 +1058,7 @@ error:

static int acpi_ec_suspend(struct acpi_device *device, pm_message_t state)
{
- struct acpi_ec *ec = acpi_driver_data(device);
+ struct acpi_ec *ec = device->driver_data;
/* Stop using GPE */
acpi_disable_gpe(NULL, ec->gpe);
return 0;
@@ -1066,7 +1066,7 @@ static int acpi_ec_suspend(struct acpi_d

static int acpi_ec_resume(struct acpi_device *device)
{
- struct acpi_ec *ec = acpi_driver_data(device);
+ struct acpi_ec *ec = device->driver_data;
/* Enable use of GPE back */
acpi_enable_gpe(NULL, ec->gpe);
return 0;
diff -u -p a/drivers/acpi/fan.c b/drivers/acpi/fan.c
--- a/drivers/acpi/fan.c 2009-12-17 08:30:13.000000000 +0100
+++ b/drivers/acpi/fan.c 2010-02-11 12:48:47.000000000 +0100
@@ -298,7 +298,7 @@ static int acpi_fan_add(struct acpi_devi

static int acpi_fan_remove(struct acpi_device *device, int type)
{
- struct thermal_cooling_device *cdev = acpi_driver_data(device);
+ struct thermal_cooling_device *cdev = device->driver_data;

if (!device || !cdev)
return -EINVAL;
diff -u -p a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c
--- a/drivers/acpi/pci_link.c 2010-01-20 13:04:05.000000000 +0100
+++ b/drivers/acpi/pci_link.c 2010-02-11 12:48:46.000000000 +0100
@@ -599,7 +599,7 @@ int acpi_pci_link_allocate_irq(acpi_hand
return -1;
}

- link = acpi_driver_data(device);
+ link = device->driver_data;
if (!link) {
printk(KERN_ERR PREFIX "Invalid link context\n");
return -1;
@@ -653,7 +653,7 @@ int acpi_pci_link_free_irq(acpi_handle h
return -1;
}

- link = acpi_driver_data(device);
+ link = device->driver_data;
if (!link) {
printk(KERN_ERR PREFIX "Invalid link context\n");
return -1;
@@ -771,7 +771,7 @@ static int acpi_pci_link_remove(struct a
{
struct acpi_pci_link *link;

- link = acpi_driver_data(device);
+ link = device->driver_data;

mutex_lock(&acpi_link_lock);
list_del(&link->list);
diff -u -p a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c
--- a/drivers/acpi/pci_root.c 2010-01-20 13:04:05.000000000 +0100
+++ b/drivers/acpi/pci_root.c 2010-02-11 12:48:46.000000000 +0100
@@ -544,7 +544,7 @@ end:

static int acpi_pci_root_start(struct acpi_device *device)
{
- struct acpi_pci_root *root = acpi_driver_data(device);
+ struct acpi_pci_root *root = device->driver_data;

pci_bus_add_devices(root->bus);
return 0;
@@ -552,7 +552,7 @@ static int acpi_pci_root_start(struct ac

static int acpi_pci_root_remove(struct acpi_device *device, int type)
{
- struct acpi_pci_root *root = acpi_driver_data(device);
+ struct acpi_pci_root *root = device->driver_data;

device_set_run_wake(root->bus->bridge, false);
pci_acpi_remove_pm_notifier(device);
diff -u -p a/drivers/acpi/power.c b/drivers/acpi/power.c
--- a/drivers/acpi/power.c 2010-01-20 13:04:05.000000000 +0100
+++ b/drivers/acpi/power.c 2010-02-11 12:48:46.000000000 +0100
@@ -127,7 +127,7 @@ acpi_power_get_context(acpi_handle handl
return result;
}

- *resource = acpi_driver_data(device);
+ *resource = device->driver_data;
if (!*resource)
return -ENODEV;

@@ -618,7 +618,7 @@ static int acpi_power_add_fs(struct acpi
/* 'status' [R] */
entry = proc_create_data(ACPI_POWER_FILE_STATUS,
S_IRUGO, acpi_device_dir(device),
- &acpi_power_fops, acpi_driver_data(device));
+ &acpi_power_fops, device->driver_data);
if (!entry)
return -EIO;
return 0;
@@ -710,10 +710,10 @@ static int acpi_power_remove(struct acpi
struct list_head *node, *next;


- if (!device || !acpi_driver_data(device))
+ if (!device || !device->driver_data)
return -EINVAL;

- resource = acpi_driver_data(device);
+ resource = device->driver_data;

acpi_power_remove_fs(device);

@@ -736,10 +736,10 @@ static int acpi_power_resume(struct acpi
struct acpi_power_resource *resource = NULL;
struct acpi_power_reference *ref;

- if (!device || !acpi_driver_data(device))
+ if (!device || !device->driver_data)
return -EINVAL;

- resource = acpi_driver_data(device);
+ resource = device->driver_data;

result = acpi_power_get_state(device->handle, &state);
if (result)
diff -u -p a/drivers/acpi/power_meter.c b/drivers/acpi/power_meter.c
--- a/drivers/acpi/power_meter.c 2010-01-29 18:29:07.000000000 +0100
+++ b/drivers/acpi/power_meter.c 2010-02-11 12:48:46.000000000 +0100
@@ -841,10 +841,10 @@ static void acpi_power_meter_notify(stru
struct acpi_power_meter_resource *resource;
int res;

- if (!device || !acpi_driver_data(device))
+ if (!device || !device->driver_data)
return;

- resource = acpi_driver_data(device);
+ resource = device->driver_data;

mutex_lock(&resource->lock);
switch (event) {
@@ -934,10 +934,10 @@ static int acpi_power_meter_remove(struc
{
struct acpi_power_meter_resource *resource;

- if (!device || !acpi_driver_data(device))
+ if (!device || !device->driver_data)
return -EINVAL;

- resource = acpi_driver_data(device);
+ resource = device->driver_data;
hwmon_device_unregister(resource->hwmon_dev);

free_capabilities(resource);
@@ -951,10 +951,10 @@ static int acpi_power_meter_resume(struc
{
struct acpi_power_meter_resource *resource;

- if (!device || !acpi_driver_data(device))
+ if (!device || !device->driver_data)
return -EINVAL;

- resource = acpi_driver_data(device);
+ resource = device->driver_data;
free_capabilities(resource);
read_capabilities(resource);

diff -u -p a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c
--- a/drivers/acpi/processor_core.c 2010-01-12 18:05:01.000000000 +0100
+++ b/drivers/acpi/processor_core.c 2010-02-11 12:48:47.000000000 +0100
@@ -309,7 +309,7 @@ static int __cpuinit acpi_processor_add_
entry = proc_create_data(ACPI_PROCESSOR_FILE_INFO,
S_IRUGO, acpi_device_dir(device),
&acpi_processor_info_fops,
- acpi_driver_data(device));
+ device->driver_data);
if (!entry)
return -EIO;

@@ -318,7 +318,7 @@ static int __cpuinit acpi_processor_add_
S_IFREG | S_IRUGO | S_IWUSR,
acpi_device_dir(device),
&acpi_processor_throttling_fops,
- acpi_driver_data(device));
+ device->driver_data);
if (!entry)
return -EIO;

@@ -327,7 +327,7 @@ static int __cpuinit acpi_processor_add_
S_IFREG | S_IRUGO | S_IWUSR,
acpi_device_dir(device),
&acpi_processor_limit_fops,
- acpi_driver_data(device));
+ device->driver_data);
if (!entry)
return -EIO;
return 0;
@@ -528,7 +528,7 @@ static int acpi_processor_get_info(struc
int cpu_index, device_declaration = 0;
static int cpu0_initialized;

- pr = acpi_driver_data(device);
+ pr = device->driver_data;
if (!pr)
return -EINVAL;

@@ -653,7 +653,7 @@ static DEFINE_PER_CPU(void *, processor_

static void acpi_processor_notify(struct acpi_device *device, u32 event)
{
- struct acpi_processor *pr = acpi_driver_data(device);
+ struct acpi_processor *pr = device->driver_data;
int saved;

if (!pr)
@@ -822,10 +822,10 @@ static int acpi_processor_remove(struct
struct acpi_processor *pr = NULL;


- if (!device || !acpi_driver_data(device))
+ if (!device || !device->driver_data)
return -EINVAL;

- pr = acpi_driver_data(device);
+ pr = device->driver_data;

if (pr->id >= nr_cpu_ids)
goto free;
@@ -944,7 +944,7 @@ static void __ref acpi_processor_hotplug
"Device don't exist, dropping EJECT\n");
break;
}
- pr = acpi_driver_data(device);
+ pr = device->driver_data;
if (!pr) {
printk(KERN_ERR PREFIX
"Driver data is NULL, dropping EJECT\n");
diff -u -p a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
--- a/drivers/acpi/processor_idle.c 2010-01-29 18:29:07.000000000 +0100
+++ b/drivers/acpi/processor_idle.c 2010-02-11 12:48:46.000000000 +0100
@@ -1212,7 +1212,7 @@ int __cpuinit acpi_processor_power_init(
entry = proc_create_data(ACPI_PROCESSOR_FILE_POWER,
S_IRUGO, acpi_device_dir(device),
&acpi_processor_power_fops,
- acpi_driver_data(device));
+ device->driver_data);
if (!entry)
return -EIO;
#endif
diff -u -p a/drivers/acpi/processor_thermal.c b/drivers/acpi/processor_thermal.c
--- a/drivers/acpi/processor_thermal.c 2010-01-20 13:04:05.000000000 +0100
+++ b/drivers/acpi/processor_thermal.c 2010-02-11 12:48:47.000000000 +0100
@@ -256,7 +256,7 @@ int acpi_processor_set_thermal_limit(acp
if (result)
return result;

- pr = acpi_driver_data(device);
+ pr = device->driver_data;
if (!pr)
return -ENODEV;

@@ -379,7 +379,7 @@ processor_get_max_state(struct thermal_c
unsigned long *state)
{
struct acpi_device *device = cdev->devdata;
- struct acpi_processor *pr = acpi_driver_data(device);
+ struct acpi_processor *pr = device->driver_data;

if (!device || !pr)
return -EINVAL;
@@ -393,7 +393,7 @@ processor_get_cur_state(struct thermal_c
unsigned long *cur_state)
{
struct acpi_device *device = cdev->devdata;
- struct acpi_processor *pr = acpi_driver_data(device);
+ struct acpi_processor *pr = device->driver_data;

if (!device || !pr)
return -EINVAL;
@@ -409,7 +409,7 @@ processor_set_cur_state(struct thermal_c
unsigned long state)
{
struct acpi_device *device = cdev->devdata;
- struct acpi_processor *pr = acpi_driver_data(device);
+ struct acpi_processor *pr = device->driver_data;
int result = 0;
int max_pstate;

diff -u -p a/drivers/acpi/sbs.c b/drivers/acpi/sbs.c
--- a/drivers/acpi/sbs.c 2010-01-20 13:04:05.000000000 +0100
+++ b/drivers/acpi/sbs.c 2010-02-11 12:48:46.000000000 +0100
@@ -973,7 +973,7 @@ static int acpi_sbs_remove(struct acpi_d

if (!device)
return -EINVAL;
- sbs = acpi_driver_data(device);
+ sbs = device->driver_data;
if (!sbs)
return -EINVAL;
mutex_lock(&sbs->lock);
diff -u -p a/drivers/acpi/sbshc.c b/drivers/acpi/sbshc.c
--- a/drivers/acpi/sbshc.c 2010-01-03 21:18:12.000000000 +0100
+++ b/drivers/acpi/sbshc.c 2010-02-11 12:48:46.000000000 +0100
@@ -301,7 +301,7 @@ static int acpi_smbus_hc_remove(struct a
if (!device)
return -EINVAL;

- hc = acpi_driver_data(device);
+ hc = device->driver_data;
acpi_ec_remove_query_handler(hc->ec, hc->query_bit);
kfree(hc);
device->driver_data = NULL;
diff -u -p a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c
--- a/drivers/acpi/thermal.c 2009-12-03 14:09:47.000000000 +0100
+++ b/drivers/acpi/thermal.c 2010-02-11 12:48:47.000000000 +0100
@@ -1215,7 +1215,7 @@ static int acpi_thermal_add_fs(struct ac
entry = proc_create_data(ACPI_THERMAL_FILE_STATE,
S_IRUGO, acpi_device_dir(device),
&acpi_thermal_state_fops,
- acpi_driver_data(device));
+ device->driver_data);
if (!entry)
return -ENODEV;

@@ -1223,7 +1223,7 @@ static int acpi_thermal_add_fs(struct ac
entry = proc_create_data(ACPI_THERMAL_FILE_TEMPERATURE,
S_IRUGO, acpi_device_dir(device),
&acpi_thermal_temp_fops,
- acpi_driver_data(device));
+ device->driver_data);
if (!entry)
return -ENODEV;

@@ -1232,7 +1232,7 @@ static int acpi_thermal_add_fs(struct ac
S_IRUGO,
acpi_device_dir(device),
&acpi_thermal_trip_fops,
- acpi_driver_data(device));
+ device->driver_data);
if (!entry)
return -ENODEV;

@@ -1241,7 +1241,7 @@ static int acpi_thermal_add_fs(struct ac
S_IFREG | S_IRUGO | S_IWUSR,
acpi_device_dir(device),
&acpi_thermal_cooling_fops,
- acpi_driver_data(device));
+ device->driver_data);
if (!entry)
return -ENODEV;

@@ -1250,7 +1250,7 @@ static int acpi_thermal_add_fs(struct ac
S_IFREG | S_IRUGO | S_IWUSR,
acpi_device_dir(device),
&acpi_thermal_polling_fops,
- acpi_driver_data(device));
+ device->driver_data);
if (!entry)
return -ENODEV;
return 0;
@@ -1283,7 +1283,7 @@ static int acpi_thermal_remove_fs(struct

static void acpi_thermal_notify(struct acpi_device *device, u32 event)
{
- struct acpi_thermal *tz = acpi_driver_data(device);
+ struct acpi_thermal *tz = device->driver_data;


if (!tz)
@@ -1417,10 +1417,10 @@ static int acpi_thermal_remove(struct ac
{
struct acpi_thermal *tz = NULL;

- if (!device || !acpi_driver_data(device))
+ if (!device || !device->driver_data)
return -EINVAL;

- tz = acpi_driver_data(device);
+ tz = device->driver_data;

acpi_thermal_remove_fs(device);
acpi_thermal_unregister_thermal_zone(tz);
@@ -1435,10 +1435,10 @@ static int acpi_thermal_resume(struct ac
int i, j, power_state, result;


- if (!device || !acpi_driver_data(device))
+ if (!device || !device->driver_data)
return -EINVAL;

- tz = acpi_driver_data(device);
+ tz = device->driver_data;

for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
if (!(&tz->trips.active[i]))
diff -u -p a/drivers/acpi/video.c b/drivers/acpi/video.c
--- a/drivers/acpi/video.c 2010-01-29 18:29:07.000000000 +0100
+++ b/drivers/acpi/video.c 2010-02-11 12:48:47.000000000 +0100
@@ -400,7 +400,7 @@ static int video_get_max_state(struct th
long *state)
{
struct acpi_device *device = cooling_dev->devdata;
- struct acpi_video_device *video = acpi_driver_data(device);
+ struct acpi_video_device *video = device->driver_data;

*state = video->brightness->count - 3;
return 0;
@@ -410,7 +410,7 @@ static int video_get_cur_state(struct th
long *state)
{
struct acpi_device *device = cooling_dev->devdata;
- struct acpi_video_device *video = acpi_driver_data(device);
+ struct acpi_video_device *video = device->driver_data;
unsigned long long level;
int offset;

@@ -429,7 +429,7 @@ static int
video_set_cur_state(struct thermal_cooling_device *cooling_dev, unsigned long state)
{
struct acpi_device *device = cooling_dev->devdata;
- struct acpi_video_device *video = acpi_driver_data(device);
+ struct acpi_video_device *video = device->driver_data;
int level;

if ( state >= video->brightness->count - 2)
@@ -1358,7 +1358,7 @@ static int acpi_video_device_add_fs(stru
struct proc_dir_entry *entry, *device_dir;
struct acpi_video_device *vid_dev;

- vid_dev = acpi_driver_data(device);
+ vid_dev = device->driver_data;
if (!vid_dev)
return -ENODEV;

@@ -1369,7 +1369,7 @@ static int acpi_video_device_add_fs(stru

/* 'info' [R] */
entry = proc_create_data("info", S_IRUGO, device_dir,
- &acpi_video_device_info_fops, acpi_driver_data(device));
+ &acpi_video_device_info_fops, device->driver_data);
if (!entry)
goto err_remove_dir;

@@ -1377,7 +1377,7 @@ static int acpi_video_device_add_fs(stru
entry = proc_create_data("state", S_IFREG | S_IRUGO | S_IWUSR,
device_dir,
&acpi_video_device_state_fops,
- acpi_driver_data(device));
+ device->driver_data);
if (!entry)
goto err_remove_info;

@@ -1385,14 +1385,14 @@ static int acpi_video_device_add_fs(stru
entry = proc_create_data("brightness", S_IFREG | S_IRUGO | S_IWUSR,
device_dir,
&acpi_video_device_brightness_fops,
- acpi_driver_data(device));
+ device->driver_data);
if (!entry)
goto err_remove_state;

/* 'EDID' [R] */
entry = proc_create_data("EDID", S_IRUGO, device_dir,
&acpi_video_device_EDID_fops,
- acpi_driver_data(device));
+ device->driver_data);
if (!entry)
goto err_remove_brightness;

@@ -1416,7 +1416,7 @@ static int acpi_video_device_remove_fs(s
struct acpi_video_device *vid_dev;
struct proc_dir_entry *device_dir;

- vid_dev = acpi_driver_data(device);
+ vid_dev = device->driver_data;
if (!vid_dev || !vid_dev->video || !vid_dev->video->dir)
return -ENODEV;

@@ -1632,7 +1632,7 @@ acpi_video_bus_write_DOS(struct file *fi

static int acpi_video_bus_add_fs(struct acpi_device *device)
{
- struct acpi_video_bus *video = acpi_driver_data(device);
+ struct acpi_video_bus *video = device->driver_data;
struct proc_dir_entry *device_dir;
struct proc_dir_entry *entry;

@@ -1643,21 +1643,21 @@ static int acpi_video_bus_add_fs(struct
/* 'info' [R] */
entry = proc_create_data("info", S_IRUGO, device_dir,
&acpi_video_bus_info_fops,
- acpi_driver_data(device));
+ device->driver_data);
if (!entry)
goto err_remove_dir;

/* 'ROM' [R] */
entry = proc_create_data("ROM", S_IRUGO, device_dir,
&acpi_video_bus_ROM_fops,
- acpi_driver_data(device));
+ device->driver_data);
if (!entry)
goto err_remove_info;

/* 'POST_info' [R] */
entry = proc_create_data("POST_info", S_IRUGO, device_dir,
&acpi_video_bus_POST_info_fops,
- acpi_driver_data(device));
+ device->driver_data);
if (!entry)
goto err_remove_rom;

@@ -1665,7 +1665,7 @@ static int acpi_video_bus_add_fs(struct
entry = proc_create_data("POST", S_IFREG | S_IRUGO | S_IWUSR,
device_dir,
&acpi_video_bus_POST_fops,
- acpi_driver_data(device));
+ device->driver_data);
if (!entry)
goto err_remove_post_info;

@@ -1673,7 +1673,7 @@ static int acpi_video_bus_add_fs(struct
entry = proc_create_data("DOS", S_IFREG | S_IRUGO | S_IWUSR,
device_dir,
&acpi_video_bus_DOS_fops,
- acpi_driver_data(device));
+ device->driver_data);
if (!entry)
goto err_remove_post;

@@ -2111,7 +2111,7 @@ static int acpi_video_bus_stop_devices(s

static void acpi_video_bus_notify(struct acpi_device *device, u32 event)
{
- struct acpi_video_bus *video = acpi_driver_data(device);
+ struct acpi_video_bus *video = device->driver_data;
struct input_dev *input;
int keycode;

@@ -2233,10 +2233,10 @@ static int acpi_video_resume(struct acpi
struct acpi_video_device *video_device;
int i;

- if (!device || !acpi_driver_data(device))
+ if (!device || !device->driver_data)
return -EINVAL;

- video = acpi_driver_data(device);
+ video = device->driver_data;

for (i = 0; i < video->attached_count; i++) {
video_device = video->attached_array[i].bind_info;
@@ -2381,10 +2381,10 @@ static int acpi_video_bus_remove(struct
struct acpi_video_bus *video = NULL;


- if (!device || !acpi_driver_data(device))
+ if (!device || !device->driver_data)
return -EINVAL;

- video = acpi_driver_data(device);
+ video = device->driver_data;

acpi_video_bus_stop_devices(video);
acpi_video_bus_put_devices(video);
diff -u -p a/drivers/i2c/busses/i2c-scmi.c b/drivers/i2c/busses/i2c-scmi.c
--- a/drivers/i2c/busses/i2c-scmi.c 2009-12-03 14:09:47.000000000 +0100
+++ b/drivers/i2c/busses/i2c-scmi.c 2010-02-11 12:48:47.000000000 +0100
@@ -409,7 +409,7 @@ err:

static int acpi_smbus_cmi_remove(struct acpi_device *device, int type)
{
- struct acpi_smbus_cmi *smbus_cmi = acpi_driver_data(device);
+ struct acpi_smbus_cmi *smbus_cmi = device->driver_data;

i2c_del_adapter(&smbus_cmi->adapter);
kfree(smbus_cmi);
diff -u -p a/drivers/platform/x86/asus_acpi.c b/drivers/platform/x86/asus_acpi.c
--- a/drivers/platform/x86/asus_acpi.c 2009-12-29 11:37:46.000000000 +0100
+++ b/drivers/platform/x86/asus_acpi.c 2010-02-11 12:48:46.000000000 +0100
@@ -1063,7 +1063,7 @@ asus_proc_add(char *name, const struct f
struct proc_dir_entry *proc;

proc = proc_create_data(name, mode, acpi_device_dir(device),
- proc_fops, acpi_driver_data(device));
+ proc_fops, device->driver_data);
if (!proc) {
printk(KERN_WARNING " Unable to create %s fs entry\n", name);
return -1;
diff -u -p a/drivers/platform/x86/eeepc-laptop.c b/drivers/platform/x86/eeepc-laptop.c
--- a/drivers/platform/x86/eeepc-laptop.c 2010-01-20 13:04:06.000000000 +0100
+++ b/drivers/platform/x86/eeepc-laptop.c 2010-02-11 12:48:46.000000000 +0100
@@ -1193,7 +1193,7 @@ static void eeepc_input_exit(struct eeep
*/
static void eeepc_acpi_notify(struct acpi_device *device, u32 event)
{
- struct eeepc_laptop *eeepc = acpi_driver_data(device);
+ struct eeepc_laptop *eeepc = device->driver_data;
u16 count;

if (event > ACPI_MAX_SYS_NOTIFY)
@@ -1433,7 +1433,7 @@ fail_platform:

static int eeepc_acpi_remove(struct acpi_device *device, int type)
{
- struct eeepc_laptop *eeepc = acpi_driver_data(device);
+ struct eeepc_laptop *eeepc = device->driver_data;

eeepc_backlight_exit(eeepc);
eeepc_rfkill_exit(eeepc);
diff -u -p a/drivers/platform/x86/fujitsu-laptop.c b/drivers/platform/x86/fujitsu-laptop.c
--- a/drivers/platform/x86/fujitsu-laptop.c 2009-12-24 11:27:00.000000000 +0100
+++ b/drivers/platform/x86/fujitsu-laptop.c 2010-02-11 12:48:46.000000000 +0100
@@ -732,7 +732,7 @@ err_stop:

static int acpi_fujitsu_remove(struct acpi_device *device, int type)
{
- struct fujitsu_t *fujitsu = acpi_driver_data(device);
+ struct fujitsu_t *fujitsu = device->driver_data;
struct input_dev *input = fujitsu->input;

input_unregister_device(input);
@@ -939,7 +939,7 @@ err_stop:

static int acpi_fujitsu_hotkey_remove(struct acpi_device *device, int type)
{
- struct fujitsu_hotkey_t *fujitsu_hotkey = acpi_driver_data(device);
+ struct fujitsu_hotkey_t *fujitsu_hotkey = device->driver_data;
struct input_dev *input = fujitsu_hotkey->input;

#if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE)
diff -u -p a/drivers/platform/x86/intel_menlow.c b/drivers/platform/x86/intel_menlow.c
--- a/drivers/platform/x86/intel_menlow.c 2009-12-03 14:09:48.000000000 +0100
+++ b/drivers/platform/x86/intel_menlow.c 2010-02-11 12:48:46.000000000 +0100
@@ -198,7 +198,7 @@ static int intel_menlow_memory_add(struc

static int intel_menlow_memory_remove(struct acpi_device *device, int type)
{
- struct thermal_cooling_device *cdev = acpi_driver_data(device);
+ struct thermal_cooling_device *cdev = device->driver_data;

if (!device || !cdev)
return -EINVAL;
diff -u -p a/drivers/platform/x86/panasonic-laptop.c b/drivers/platform/x86/panasonic-laptop.c
--- a/drivers/platform/x86/panasonic-laptop.c 2009-04-13 16:04:30.000000000 +0200
+++ b/drivers/platform/x86/panasonic-laptop.c 2010-02-11 12:48:46.000000000 +0100
@@ -364,7 +364,7 @@ static ssize_t show_numbatt(struct devic
char *buf)
{
struct acpi_device *acpi = to_acpi_device(dev);
- struct pcc_acpi *pcc = acpi_driver_data(acpi);
+ struct pcc_acpi *pcc = acpi->driver_data;

if (!acpi_pcc_retrieve_biosdata(pcc, pcc->sinf))
return -EIO;
@@ -376,7 +376,7 @@ static ssize_t show_lcdtype(struct devic
char *buf)
{
struct acpi_device *acpi = to_acpi_device(dev);
- struct pcc_acpi *pcc = acpi_driver_data(acpi);
+ struct pcc_acpi *pcc = acpi->driver_data;

if (!acpi_pcc_retrieve_biosdata(pcc, pcc->sinf))
return -EIO;
@@ -388,7 +388,7 @@ static ssize_t show_mute(struct device *
char *buf)
{
struct acpi_device *acpi = to_acpi_device(dev);
- struct pcc_acpi *pcc = acpi_driver_data(acpi);
+ struct pcc_acpi *pcc = acpi->driver_data;

if (!acpi_pcc_retrieve_biosdata(pcc, pcc->sinf))
return -EIO;
@@ -400,7 +400,7 @@ static ssize_t show_sticky(struct device
char *buf)
{
struct acpi_device *acpi = to_acpi_device(dev);
- struct pcc_acpi *pcc = acpi_driver_data(acpi);
+ struct pcc_acpi *pcc = acpi->driver_data;

if (!acpi_pcc_retrieve_biosdata(pcc, pcc->sinf))
return -EIO;
@@ -412,7 +412,7 @@ static ssize_t set_sticky(struct device
const char *buf, size_t count)
{
struct acpi_device *acpi = to_acpi_device(dev);
- struct pcc_acpi *pcc = acpi_driver_data(acpi);
+ struct pcc_acpi *pcc = acpi->driver_data;
int val;

if (count && sscanf(buf, "%i", &val) == 1 &&
@@ -531,7 +531,7 @@ static void acpi_pcc_generate_keyinput(s

static void acpi_pcc_hotkey_notify(struct acpi_device *device, u32 event)
{
- struct pcc_acpi *pcc = acpi_driver_data(device);
+ struct pcc_acpi *pcc = device->driver_data;

switch (event) {
case HKEY_NOTIFY:
@@ -585,7 +585,7 @@ static int acpi_pcc_init_input(struct pc

static int acpi_pcc_hotkey_resume(struct acpi_device *device)
{
- struct pcc_acpi *pcc = acpi_driver_data(device);
+ struct pcc_acpi *pcc = device->driver_data;
acpi_status status = AE_OK;

if (device == NULL || pcc == NULL)
@@ -701,7 +701,7 @@ static int __init acpi_pcc_init(void)

static int acpi_pcc_hotkey_remove(struct acpi_device *device, int type)
{
- struct pcc_acpi *pcc = acpi_driver_data(device);
+ struct pcc_acpi *pcc = device->driver_data;

if (!device || !pcc)
return -EINVAL;
diff -u -p a/drivers/platform/x86/topstar-laptop.c b/drivers/platform/x86/topstar-laptop.c
--- a/drivers/platform/x86/topstar-laptop.c 2009-09-23 13:12:24.000000000 +0200
+++ b/drivers/platform/x86/topstar-laptop.c 2010-02-11 12:48:47.000000000 +0100
@@ -73,7 +73,7 @@ static void acpi_topstar_notify(struct a
struct tps_key_entry *key;
static bool dup_evnt[2];
bool *dup;
- struct topstar_hkey *hkey = acpi_driver_data(device);
+ struct topstar_hkey *hkey = device->driver_data;

/* 0x83 and 0x84 key events comes duplicated... */
if (event == 0x83 || event == 0x84) {
@@ -212,7 +212,7 @@ add_err:

static int acpi_topstar_remove(struct acpi_device *device, int type)
{
- struct topstar_hkey *tps_hkey = acpi_driver_data(device);
+ struct topstar_hkey *tps_hkey = device->driver_data;

acpi_topstar_fncx_switch(device, false);

2010-02-11 11:04:55

by Thomas Renninger

[permalink] [raw]
Subject: Re: [PATCH] drivers/acpi/processor_thermal.c

On Thursday 11 February 2010 11:52:20 Julia Lawall wrote:
> On Thu, 11 Feb 2010, Thomas Renninger wrote:
>
> > Eh,
> >
> > what is this for?:
> > static inline void *acpi_driver_data(struct acpi_device *d)
> > {
> > return d->driver_data;
> > }
...
>
> A potential patch that gets rid of the uses is below. I don't have time
> to look at this in more detail at the moment, but perhaps someone else
> would like to do so. The semantic patch (http://coccinelle.lip6.fr)
> involved is:
>
> @@
> struct acpi_device *d;
> @@
>
> - acpi_driver_data(d)
> + d->driver_data
Len, do you mind adding this to your test branch, please.
I can grep over it afterwards (somewhen...) and void out
acpi_driver_data(..)
declaration in acpi_bus.h.

I expect also Darren has to rebase his fixes on top of this
one then.

Thanks,

Thomas

2010-02-11 13:04:06

by Darren Jenkins

[permalink] [raw]
Subject: Re: [PATCH] drivers/acpi/processor_thermal.c


On Thu, Feb 11, 2010 at 10:04 PM, Thomas Renninger <[email protected]>
wrote:
> I expect also Darren has to rebase his fixes on top of this
> one then.

In case Len decides to go this way, here are the two patches rebased on top of this change
and combined into one patch.

[PATCH] drivers/acpi/ fix use before NULL checking

Fix some use before NULL checks by re-ordering of code in drivers/acpi

Coverity CID: 2752 2751 2750 2758


Signed-off-by: Darren Jenkins <[email protected]>
---
drivers/acpi/fan.c | 9 +++++++--
drivers/acpi/processor_thermal.c | 28 ++++++++++++++++++++--------
2 files changed, 27 insertions(+), 10 deletions(-)

diff --git a/drivers/acpi/fan.c b/drivers/acpi/fan.c
index 1290c25..278cebd 100644
--- a/drivers/acpi/fan.c
+++ b/drivers/acpi/fan.c
@@ -298,9 +298,14 @@ static int acpi_fan_add(struct acpi_device *device)

static int acpi_fan_remove(struct acpi_device *device, int type)
{
- struct thermal_cooling_device *cdev = device->driver_data;
+ struct thermal_cooling_device *cdev;
+
+ if (!device)
+ return -EINVAL;
+
+ cdev = device->driver_data;

- if (!device || !cdev)
+ if (!cdev)
return -EINVAL;

acpi_fan_remove_fs(device);
diff --git a/drivers/acpi/processor_thermal.c b/drivers/acpi/processor_thermal.c
index cd18c98..3c9f8ac 100644
--- a/drivers/acpi/processor_thermal.c
+++ b/drivers/acpi/processor_thermal.c
@@ -379,9 +379,14 @@ processor_get_max_state(struct thermal_cooling_device *cdev,
unsigned long *state)
{
struct acpi_device *device = cdev->devdata;
- struct acpi_processor *pr = device->driver_data;
+ struct acpi_processor *pr;

- if (!device || !pr)
+ if (!device)
+ return -EINVAL;
+
+ pr = device->driver_data;
+
+ if (!pr)
return -EINVAL;

*state = acpi_processor_max_state(pr);
@@ -393,9 +398,14 @@ processor_get_cur_state(struct thermal_cooling_device *cdev,
unsigned long *cur_state)
{
struct acpi_device *device = cdev->devdata;
- struct acpi_processor *pr = device->driver_data;
+ struct acpi_processor *pr;
+
+ if (!device)
+ return -EINVAL;

- if (!device || !pr)
+ pr = device->driver_data;
+
+ if (!pr)
return -EINVAL;

*cur_state = cpufreq_get_cur_state(pr->id);
@@ -409,18 +419,20 @@ processor_set_cur_state(struct thermal_cooling_device *cdev,
unsigned long state)
{
struct acpi_device *device = cdev->devdata;
- struct acpi_processor *pr = device->driver_data;
+ struct acpi_processor *pr;
int result = 0;
int max_pstate;

- if (!device || !pr)
+ if (!device)
return -EINVAL;

- max_pstate = cpufreq_get_max_state(pr->id);
+ pr = device->driver_data;

- if (state > acpi_processor_max_state(pr))
+ if (!pr || state > acpi_processor_max_state(pr))
return -EINVAL;

+ max_pstate = cpufreq_get_max_state(pr->id);
+
if (state <= max_pstate) {
if (pr->flags.throttling && pr->throttling.state)
result = acpi_processor_set_throttling(pr, 0, false);
--
1.6.3.3