FAILED: patch "[PATCH] hwmon: (w83791d) Fix NULL pointer dereference by removing" failed to apply to 4.9-stable tree
[email protected]
maintainerThe patch below does not apply to the 4.9-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 943c15ac1b84d378da26bba41c83c67e16499ac4 Mon Sep 17 00:00:00 2001
From: Nadezda Lutovinova <[email protected]>
Date: Tue, 21 Sep 2021 18:51:51 +0300
Subject: [PATCH] hwmon: (w83791d) Fix NULL pointer dereference by removing
unnecessary structure field
If driver read val value sufficient for
(val & 0x08) && (!(val & 0x80)) && ((val & 0x7) == ((val >> 4) & 0x7)) from device then Null pointer dereference occurs.
(It is possible if tmp = 0b0xyz1xyz, where same literals mean same numbers) Also lm75[] does not serve a purpose anymore after switching to devm_i2c_new_dummy_device() in w83791d_detect_subclients().
The patch fixes possible NULL pointer dereference by removing lm75[].
Found by Linux Driver Verification project (linuxtesting.org).
drivers/hwmon/w83791d.c +11 -18
@@ -273,9 +273,6 @@ struct w83791d_data {char valid;/* !=0 if following fields are valid */ unsigned long last_updated;/* In jiffies */ -/* array of 2 pointers to subclients */ -struct i2c_client *lm75[2 ]; -/* volts */ u8 in[NUMBER_OF_VIN ];/* Register value */ u8 in_max[NUMBER_OF_VIN ];/* Register value */
@@ -1257,7 +1254,6 @@ static const struct attribute_group w83791d_group_fanpwm45 = {static int w83791d_detect_subclients (struct i2c_client *client) {struct i2c_adapter *adapter = client->adapter; -struct w83791d_data *data =i2c_get_clientdata (client);int address = client->addr;int i, id;u8 val;
@@ -1280,22 +1276,19 @@ static int w83791d_detect_subclients(struct i2c_client *client) } val =w83791d_read (client,W83791D_REG_I2C_SUBADDR ); -if (!(val &0x08 )) - data->lm75[0 ] =devm_i2c_new_dummy_device (&client->dev, adapter, -0x48 + (val &0x7 )); -if (!(val &0x80 )) { -if (!IS_ERR (data->lm75[0 ]) && - ((val &0x7 ) == ((val >>4 ) &0x7 ))) { -dev_err (&client->dev, -"duplicate addresses 0x%x, " -"use force_subclient\n" , - data->lm75[0 ]->addr); -return -ENODEV ; - } - data->lm75[1 ] =devm_i2c_new_dummy_device (&client->dev, adapter, -0x48 + ((val >>4 ) &0x7 )); + +if (!(val &0x88 ) && (val &0x7 ) == ((val >>4 ) &0x7 )) { +dev_err (&client->dev, +"duplicate addresses 0x%x, use force_subclient\n" ,0x48 + (val &0x7 )); +return -ENODEV ; } +if (!(val &0x08 )) +devm_i2c_new_dummy_device (&client->dev, adapter,0x48 + (val &0x7 )); + +if (!(val &0x80 )) +devm_i2c_new_dummy_device (&client->dev, adapter,0x48 + ((val >>4 ) &0x7 )); +return 0 ; }