Skip to content

Commit 1405a07

Browse files
committed
Merge tag 'hwmon-for-v7.1-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging
Pull hwmon fixes from Guenter Roeck: - asus_atk0110, acpi_power_meter: Add missing NULL pointer checks - lm90: Fix locking and UAF issues - sy7636a: Fix sysfs attribute name in documentation * tag 'hwmon-for-v7.1-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging: hwmon: (lm90) Add lock protection to lm90_alert hwmon: (lm90) Stop work before releasing hwmon device docs: hwmon: sy7636a: fix temperature sysfs attribute name hwmon: (asus_atk0110) Check ACPI_COMPANION() against NULL hwmon: (acpi_power_meter) Check ACPI_COMPANION() against NULL
2 parents fe6f8e9 + 873e919 commit 1405a07

4 files changed

Lines changed: 34 additions & 7 deletions

File tree

Documentation/hwmon/sy7636a-hwmon.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,5 @@ The following sensors are supported
2222
sysfs-Interface
2323
---------------
2424

25-
temp0_input
25+
temp1_input
2626
- Temperature of external NTC (milli-degree C)

drivers/hwmon/acpi_power_meter.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -884,10 +884,14 @@ static void acpi_power_meter_notify(acpi_handle handle, u32 event, void *data)
884884

885885
static int acpi_power_meter_probe(struct platform_device *pdev)
886886
{
887-
struct acpi_device *device = ACPI_COMPANION(&pdev->dev);
888887
struct acpi_power_meter_resource *resource;
888+
struct acpi_device *device;
889889
int res;
890890

891+
device = ACPI_COMPANION(&pdev->dev);
892+
if (!device)
893+
return -ENODEV;
894+
891895
resource = kzalloc_obj(*resource);
892896
if (!resource)
893897
return -ENOMEM;

drivers/hwmon/asus_atk0110.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1273,15 +1273,20 @@ static int atk_probe(struct platform_device *pdev)
12731273
struct acpi_buffer buf;
12741274
union acpi_object *obj;
12751275
struct atk_data *data;
1276+
acpi_handle handle;
12761277

12771278
dev_dbg(&pdev->dev, "adding...\n");
12781279

1280+
handle = ACPI_HANDLE(&pdev->dev);
1281+
if (!handle)
1282+
return -ENODEV;
1283+
12791284
data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
12801285
if (!data)
12811286
return -ENOMEM;
12821287

12831288
data->dev = &pdev->dev;
1284-
data->atk_handle = ACPI_HANDLE(&pdev->dev);
1289+
data->atk_handle = handle;
12851290
INIT_LIST_HEAD(&data->sensor_list);
12861291
data->disable_ec = false;
12871292

drivers/hwmon/lm90.c

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,7 @@ struct lm90_data {
736736
struct hwmon_chip_info chip;
737737
struct delayed_work alert_work;
738738
struct work_struct report_work;
739+
bool shutdown; /* true if shutting down */
739740
bool valid; /* true if register values are valid */
740741
bool alarms_valid; /* true if status register values are valid */
741742
unsigned long last_updated; /* in jiffies */
@@ -1154,6 +1155,9 @@ static void lm90_report_alarms(struct work_struct *work)
11541155

11551156
static int lm90_update_alarms_locked(struct lm90_data *data, bool force)
11561157
{
1158+
if (data->shutdown)
1159+
return 0;
1160+
11571161
if (force || !data->alarms_valid ||
11581162
time_after(jiffies, data->alarms_updated + msecs_to_jiffies(data->update_interval))) {
11591163
struct i2c_client *client = data->client;
@@ -2584,15 +2588,23 @@ static void lm90_restore_conf(void *_data)
25842588
struct lm90_data *data = _data;
25852589
struct i2c_client *client = data->client;
25862590

2587-
cancel_delayed_work_sync(&data->alert_work);
2588-
cancel_work_sync(&data->report_work);
2589-
25902591
/* Restore initial configuration */
25912592
if (data->flags & LM90_HAVE_CONVRATE)
25922593
lm90_write_convrate(data, data->convrate_orig);
25932594
lm90_write_reg(client, LM90_REG_CONFIG1, data->config_orig);
25942595
}
25952596

2597+
static void lm90_stop_work(void *_data)
2598+
{
2599+
struct lm90_data *data = _data;
2600+
2601+
hwmon_lock(data->hwmon_dev);
2602+
data->shutdown = true;
2603+
hwmon_unlock(data->hwmon_dev);
2604+
cancel_delayed_work_sync(&data->alert_work);
2605+
cancel_work_sync(&data->report_work);
2606+
}
2607+
25962608
static int lm90_init_client(struct i2c_client *client, struct lm90_data *data)
25972609
{
25982610
struct device_node *np = client->dev.of_node;
@@ -2902,6 +2914,10 @@ static int lm90_probe(struct i2c_client *client)
29022914

29032915
data->hwmon_dev = hwmon_dev;
29042916

2917+
err = devm_add_action_or_reset(&client->dev, lm90_stop_work, data);
2918+
if (err)
2919+
return err;
2920+
29052921
if (client->irq) {
29062922
dev_dbg(dev, "IRQ: %d\n", client->irq);
29072923
err = devm_request_threaded_irq(dev, client->irq,
@@ -2930,7 +2946,8 @@ static void lm90_alert(struct i2c_client *client, enum i2c_alert_protocol type,
29302946
*/
29312947
struct lm90_data *data = i2c_get_clientdata(client);
29322948

2933-
if ((data->flags & LM90_HAVE_BROKEN_ALERT) &&
2949+
hwmon_lock(data->hwmon_dev);
2950+
if (!data->shutdown && (data->flags & LM90_HAVE_BROKEN_ALERT) &&
29342951
(data->current_alarms & data->alert_alarms)) {
29352952
if (!(data->config & 0x80)) {
29362953
dev_dbg(&client->dev, "Disabling ALERT#\n");
@@ -2939,6 +2956,7 @@ static void lm90_alert(struct i2c_client *client, enum i2c_alert_protocol type,
29392956
schedule_delayed_work(&data->alert_work,
29402957
max_t(int, HZ, msecs_to_jiffies(data->update_interval)));
29412958
}
2959+
hwmon_unlock(data->hwmon_dev);
29422960
} else {
29432961
dev_dbg(&client->dev, "Everything OK\n");
29442962
}

0 commit comments

Comments
 (0)