| From fb5cc65f973661241e4a2b7390b429aa7b330c69 Mon Sep 17 00:00:00 2001 |
| From: Nuno Sa <nuno.sa@analog.com> |
| Date: Tue, 1 Oct 2024 07:46:44 -0700 |
| Subject: Input: adp5589-keys - fix NULL pointer dereference |
| |
| From: Nuno Sa <nuno.sa@analog.com> |
| |
| commit fb5cc65f973661241e4a2b7390b429aa7b330c69 upstream. |
| |
| 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> |
| Link: https://lore.kernel.org/r/20241001-b4-dev-adp5589-fw-conversion-v1-1-fca0149dfc47@analog.com |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/input/keyboard/adp5589-keys.c | 9 +++------ |
| 1 file changed, 3 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/input/keyboard/adp5589-keys.c |
| +++ b/drivers/input/keyboard/adp5589-keys.c |
| @@ -936,10 +936,9 @@ static int adp5589_keypad_add(struct adp |
| |
| 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_clie |
| } |
| |
| 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_clie |
| if (error) |
| return error; |
| |
| - i2c_set_clientdata(client, kpad); |
| - |
| dev_info(&client->dev, "Rev.%d keypad, irq %d\n", revid, client->irq); |
| return 0; |
| } |