diff mbox series

[01/13] Input: adp5589-keys: fix NULL pointer dereference

Message ID 20241001-b4-dev-adp5589-fw-conversion-v1-1-fca0149dfc47@analog.com (mailing list archive)
State New
Headers show
Series Input: adp5589: refactor and platform_data removal | expand

Commit Message

Nuno Sa Oct. 1, 2024, 1:41 p.m. UTC
We register a devm action to call adp5589_clear_config() and then pass
the i2c client as argument so that we can call i2c_get_clientdata() in
order to get our device object. However, i2c_set_clientdata() is only
being set at the end of the probe function which means that we'll get a
NULL pointer dereference in case the probe function fails early.

Fixes: 30df385e35a4 ("Input: adp5589-keys - use devm_add_action_or_reset() for register clear")
Signed-off-by: Nuno Sa <nuno.sa@analog.com>
---
 drivers/input/keyboard/adp5589-keys.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

Comments

Dmitry Torokhov Oct. 1, 2024, 2:49 p.m. UTC | #1
On Tue, Oct 01, 2024 at 03:41:32PM +0200, Nuno Sa wrote:
> We register a devm action to call adp5589_clear_config() and then pass
> the i2c client as argument so that we can call i2c_get_clientdata() in
> order to get our device object. However, i2c_set_clientdata() is only
> being set at the end of the probe function which means that we'll get a
> NULL pointer dereference in case the probe function fails early.
> 
> Fixes: 30df385e35a4 ("Input: adp5589-keys - use devm_add_action_or_reset() for register clear")
> Signed-off-by: Nuno Sa <nuno.sa@analog.com>

Applied and tagged for stable.

Thanks.
diff mbox series

Patch

diff --git a/drivers/input/keyboard/adp5589-keys.c b/drivers/input/keyboard/adp5589-keys.c
index 8996e00cd63a8203ec53d46ccb922c21ddb47355..68a29d67be57fc22088a912694e3e6e16e46d956 100644
--- a/drivers/input/keyboard/adp5589-keys.c
+++ b/drivers/input/keyboard/adp5589-keys.c
@@ -936,10 +936,9 @@  static int adp5589_keypad_add(struct adp5589_kpad *kpad, unsigned int revid)
 
 static void adp5589_clear_config(void *data)
 {
-	struct i2c_client *client = data;
-	struct adp5589_kpad *kpad = i2c_get_clientdata(client);
+	struct adp5589_kpad *kpad = data;
 
-	adp5589_write(client, kpad->var->reg(ADP5589_GENERAL_CFG), 0);
+	adp5589_write(kpad->client, kpad->var->reg(ADP5589_GENERAL_CFG), 0);
 }
 
 static int adp5589_probe(struct i2c_client *client)
@@ -983,7 +982,7 @@  static int adp5589_probe(struct i2c_client *client)
 	}
 
 	error = devm_add_action_or_reset(&client->dev, adp5589_clear_config,
-					 client);
+					 kpad);
 	if (error)
 		return error;
 
@@ -1010,8 +1009,6 @@  static int adp5589_probe(struct i2c_client *client)
 	if (error)
 		return error;
 
-	i2c_set_clientdata(client, kpad);
-
 	dev_info(&client->dev, "Rev.%d keypad, irq %d\n", revid, client->irq);
 	return 0;
 }