Commit 65d6fa34 authored by Nuno Sa's avatar Nuno Sa Committed by Yi Yang
Browse files

Input: adp5589-keys - fix NULL pointer dereference

stable inclusion
from stable-v6.6.55
commit 7c3f04223aaf82489472d614c6decee5a1ce8d7f
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/IAYR9T
CVE: CVE-2024-49871

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=7c3f04223aaf82489472d614c6decee5a1ce8d7f



--------------------------------

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: 30df385e ("Input: adp5589-keys - use devm_add_action_or_reset() for register clear")
Signed-off-by: default avatarNuno 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: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarYi Yang <yiyang13@huawei.com>
parent bc1376a3
Loading
Loading
Loading
Loading
+3 −6
Original line number Diff line number Diff line
@@ -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;
}