* [PATCH AUTOSEL 6.3 01/37] power: supply: ab8500: Fix external_power_changed race
@ 2023-06-15 11:36 Sasha Levin
2023-06-15 11:36 ` [PATCH AUTOSEL 6.3 02/37] power: supply: sc27xx: " Sasha Levin
` (5 more replies)
0 siblings, 6 replies; 8+ messages in thread
From: Sasha Levin @ 2023-06-15 11:36 UTC (permalink / raw)
To: linux-kernel, stable
Cc: Hans de Goede, Linus Walleij, Sebastian Reichel, Sasha Levin, sre,
linux-pm
From: Hans de Goede <hdegoede@redhat.com>
[ Upstream commit a5299ce4e96f3e8930e9c051b28d8093ada87b08 ]
ab8500_btemp_external_power_changed() dereferences di->btemp_psy,
which gets sets in ab8500_btemp_probe() like this:
di->btemp_psy = devm_power_supply_register(dev, &ab8500_btemp_desc,
&psy_cfg);
As soon as devm_power_supply_register() has called device_add()
the external_power_changed callback can get called. So there is a window
where ab8500_btemp_external_power_changed() may get called while
di->btemp_psy has not been set yet leading to a NULL pointer dereference.
Fixing this is easy. The external_power_changed callback gets passed
the power_supply which will eventually get stored in di->btemp_psy,
so ab8500_btemp_external_power_changed() can simply directly use
the passed in psy argument which is always valid.
And the same applies to ab8500_fg_external_power_changed().
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/power/supply/ab8500_btemp.c | 6 ++----
drivers/power/supply/ab8500_fg.c | 6 ++----
2 files changed, 4 insertions(+), 8 deletions(-)
diff --git a/drivers/power/supply/ab8500_btemp.c b/drivers/power/supply/ab8500_btemp.c
index 307ee6f71042e..6f83e99d2eb72 100644
--- a/drivers/power/supply/ab8500_btemp.c
+++ b/drivers/power/supply/ab8500_btemp.c
@@ -624,10 +624,8 @@ static int ab8500_btemp_get_ext_psy_data(struct device *dev, void *data)
*/
static void ab8500_btemp_external_power_changed(struct power_supply *psy)
{
- struct ab8500_btemp *di = power_supply_get_drvdata(psy);
-
- class_for_each_device(power_supply_class, NULL,
- di->btemp_psy, ab8500_btemp_get_ext_psy_data);
+ class_for_each_device(power_supply_class, NULL, psy,
+ ab8500_btemp_get_ext_psy_data);
}
/* ab8500 btemp driver interrupts and their respective isr */
diff --git a/drivers/power/supply/ab8500_fg.c b/drivers/power/supply/ab8500_fg.c
index 41a7bff9ac376..53560fbb6dcd3 100644
--- a/drivers/power/supply/ab8500_fg.c
+++ b/drivers/power/supply/ab8500_fg.c
@@ -2407,10 +2407,8 @@ static int ab8500_fg_init_hw_registers(struct ab8500_fg *di)
*/
static void ab8500_fg_external_power_changed(struct power_supply *psy)
{
- struct ab8500_fg *di = power_supply_get_drvdata(psy);
-
- class_for_each_device(power_supply_class, NULL,
- di->fg_psy, ab8500_fg_get_ext_psy_data);
+ class_for_each_device(power_supply_class, NULL, psy,
+ ab8500_fg_get_ext_psy_data);
}
/**
--
2.39.2
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH AUTOSEL 6.3 02/37] power: supply: sc27xx: Fix external_power_changed race
2023-06-15 11:36 [PATCH AUTOSEL 6.3 01/37] power: supply: ab8500: Fix external_power_changed race Sasha Levin
@ 2023-06-15 11:36 ` Sasha Levin
2023-06-15 11:36 ` [PATCH AUTOSEL 6.3 03/37] power: supply: bq27xxx: Use mod_delayed_work() instead of cancel() + schedule() Sasha Levin
` (4 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Sasha Levin @ 2023-06-15 11:36 UTC (permalink / raw)
To: linux-kernel, stable
Cc: Hans de Goede, Orson Zhai, Chunyan Zhang, Baolin Wang,
Sebastian Reichel, Sasha Levin, sre, linux-pm
From: Hans de Goede <hdegoede@redhat.com>
[ Upstream commit 4d5c129d6c8993fe96e9ae712141eedcb9ca68c2 ]
sc27xx_fgu_external_power_changed() dereferences data->battery,
which gets sets in ab8500_btemp_probe() like this:
data->battery = devm_power_supply_register(dev, &sc27xx_fgu_desc,
&fgu_cfg);
As soon as devm_power_supply_register() has called device_add()
the external_power_changed callback can get called. So there is a window
where sc27xx_fgu_external_power_changed() may get called while
data->battery has not been set yet leading to a NULL pointer dereference.
Fixing this is easy. The external_power_changed callback gets passed
the power_supply which will eventually get stored in data->battery,
so sc27xx_fgu_external_power_changed() can simply directly use
the passed in psy argument which is always valid.
After this change sc27xx_fgu_external_power_changed() is reduced to just
"power_supply_changed(psy);" and it has the same prototype. While at it
simply replace it with making the external_power_changed callback
directly point to power_supply_changed.
Cc: Orson Zhai <orsonzhai@gmail.com>
Cc: Chunyan Zhang <zhang.lyra@gmail.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/power/supply/sc27xx_fuel_gauge.c | 9 +--------
1 file changed, 1 insertion(+), 8 deletions(-)
diff --git a/drivers/power/supply/sc27xx_fuel_gauge.c b/drivers/power/supply/sc27xx_fuel_gauge.c
index 632977f84b954..bd23c4d9fed43 100644
--- a/drivers/power/supply/sc27xx_fuel_gauge.c
+++ b/drivers/power/supply/sc27xx_fuel_gauge.c
@@ -733,13 +733,6 @@ static int sc27xx_fgu_set_property(struct power_supply *psy,
return ret;
}
-static void sc27xx_fgu_external_power_changed(struct power_supply *psy)
-{
- struct sc27xx_fgu_data *data = power_supply_get_drvdata(psy);
-
- power_supply_changed(data->battery);
-}
-
static int sc27xx_fgu_property_is_writeable(struct power_supply *psy,
enum power_supply_property psp)
{
@@ -774,7 +767,7 @@ static const struct power_supply_desc sc27xx_fgu_desc = {
.num_properties = ARRAY_SIZE(sc27xx_fgu_props),
.get_property = sc27xx_fgu_get_property,
.set_property = sc27xx_fgu_set_property,
- .external_power_changed = sc27xx_fgu_external_power_changed,
+ .external_power_changed = power_supply_changed,
.property_is_writeable = sc27xx_fgu_property_is_writeable,
.no_thermal = true,
};
--
2.39.2
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH AUTOSEL 6.3 03/37] power: supply: bq27xxx: Use mod_delayed_work() instead of cancel() + schedule()
2023-06-15 11:36 [PATCH AUTOSEL 6.3 01/37] power: supply: ab8500: Fix external_power_changed race Sasha Levin
2023-06-15 11:36 ` [PATCH AUTOSEL 6.3 02/37] power: supply: sc27xx: " Sasha Levin
@ 2023-06-15 11:36 ` Sasha Levin
2023-06-15 11:36 ` [PATCH AUTOSEL 6.3 04/37] ARM: dts: vexpress: add missing cache properties Sasha Levin
` (3 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Sasha Levin @ 2023-06-15 11:36 UTC (permalink / raw)
To: linux-kernel, stable
Cc: Hans de Goede, Sebastian Reichel, Sasha Levin, sre, linux-pm
From: Hans de Goede <hdegoede@redhat.com>
[ Upstream commit 59dddea9879713423c7b2ade43c423bb71e0d216 ]
Use mod_delayed_work() instead of separate cancel_delayed_work_sync() +
schedule_delayed_work() calls.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/power/supply/bq27xxx_battery.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/drivers/power/supply/bq27xxx_battery.c b/drivers/power/supply/bq27xxx_battery.c
index 5ff6f44fd47b2..1cc3c4cff8ca4 100644
--- a/drivers/power/supply/bq27xxx_battery.c
+++ b/drivers/power/supply/bq27xxx_battery.c
@@ -1083,10 +1083,8 @@ static int poll_interval_param_set(const char *val, const struct kernel_param *k
return ret;
mutex_lock(&bq27xxx_list_lock);
- list_for_each_entry(di, &bq27xxx_battery_devices, list) {
- cancel_delayed_work_sync(&di->work);
- schedule_delayed_work(&di->work, 0);
- }
+ list_for_each_entry(di, &bq27xxx_battery_devices, list)
+ mod_delayed_work(system_wq, &di->work, 0);
mutex_unlock(&bq27xxx_list_lock);
return ret;
--
2.39.2
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH AUTOSEL 6.3 04/37] ARM: dts: vexpress: add missing cache properties
2023-06-15 11:36 [PATCH AUTOSEL 6.3 01/37] power: supply: ab8500: Fix external_power_changed race Sasha Levin
2023-06-15 11:36 ` [PATCH AUTOSEL 6.3 02/37] power: supply: sc27xx: " Sasha Levin
2023-06-15 11:36 ` [PATCH AUTOSEL 6.3 03/37] power: supply: bq27xxx: Use mod_delayed_work() instead of cancel() + schedule() Sasha Levin
@ 2023-06-15 11:36 ` Sasha Levin
2023-06-15 11:36 ` [PATCH AUTOSEL 6.3 05/37] arm64: dts: arm: " Sasha Levin
` (2 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Sasha Levin @ 2023-06-15 11:36 UTC (permalink / raw)
To: linux-kernel, stable
Cc: Krzysztof Kozlowski, Sudeep Holla, Sasha Levin, liviu.dudau,
lpieralisi, robh+dt, krzysztof.kozlowski+dt, conor+dt,
linux-arm-kernel, devicetree
From: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
[ Upstream commit 328acc5657c6197753238d7ce0a6924ead829347 ]
As all level 2 and level 3 caches are unified, add required
cache-unified property to fix warnings like:
vexpress-v2p-ca5s.dtb: cache-controller@2c0f0000: 'cache-unified' is a required property
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Link: https://lore.kernel.org/r/20230423150837.118466-1-krzysztof.kozlowski@linaro.org
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
arch/arm/boot/dts/vexpress-v2p-ca5s.dts | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/arm/boot/dts/vexpress-v2p-ca5s.dts b/arch/arm/boot/dts/vexpress-v2p-ca5s.dts
index 3b88209bacea2..ff1f9a1bcfcfc 100644
--- a/arch/arm/boot/dts/vexpress-v2p-ca5s.dts
+++ b/arch/arm/boot/dts/vexpress-v2p-ca5s.dts
@@ -132,6 +132,7 @@ L2: cache-controller@2c0f0000 {
reg = <0x2c0f0000 0x1000>;
interrupts = <0 84 4>;
cache-level = <2>;
+ cache-unified;
};
pmu {
--
2.39.2
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH AUTOSEL 6.3 05/37] arm64: dts: arm: add missing cache properties
2023-06-15 11:36 [PATCH AUTOSEL 6.3 01/37] power: supply: ab8500: Fix external_power_changed race Sasha Levin
` (2 preceding siblings ...)
2023-06-15 11:36 ` [PATCH AUTOSEL 6.3 04/37] ARM: dts: vexpress: add missing cache properties Sasha Levin
@ 2023-06-15 11:36 ` Sasha Levin
2023-06-15 11:36 ` [PATCH AUTOSEL 6.3 06/37] tools: gpio: fix debounce_period_us output of lsgpio Sasha Levin
2023-06-16 8:23 ` [PATCH AUTOSEL 6.3 01/37] power: supply: ab8500: Fix external_power_changed race Pavel Machek
5 siblings, 0 replies; 8+ messages in thread
From: Sasha Levin @ 2023-06-15 11:36 UTC (permalink / raw)
To: linux-kernel, stable
Cc: Krzysztof Kozlowski, Sudeep Holla, Sasha Levin, liviu.dudau,
lpieralisi, robh+dt, krzysztof.kozlowski+dt, conor+dt,
linux-arm-kernel, devicetree
From: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
[ Upstream commit 55b37d9c8ba23d28c584aef0801fb1e60e4a817c ]
As all level 2 and level 3 caches are unified, add required
cache-unified properties to fix warnings like:
foundation-v8.dtb: l2-cache0: 'cache-unified' is a required property
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Link: https://lore.kernel.org/r/20230421223213.115639-1-krzysztof.kozlowski@linaro.org
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
arch/arm64/boot/dts/arm/foundation-v8.dtsi | 1 +
arch/arm64/boot/dts/arm/rtsm_ve-aemv8a.dts | 1 +
arch/arm64/boot/dts/arm/vexpress-v2f-1xv7-ca53x2.dts | 1 +
3 files changed, 3 insertions(+)
diff --git a/arch/arm64/boot/dts/arm/foundation-v8.dtsi b/arch/arm64/boot/dts/arm/foundation-v8.dtsi
index 029578072d8fb..7b41537731a6a 100644
--- a/arch/arm64/boot/dts/arm/foundation-v8.dtsi
+++ b/arch/arm64/boot/dts/arm/foundation-v8.dtsi
@@ -59,6 +59,7 @@ cpu3: cpu@3 {
L2_0: l2-cache0 {
compatible = "cache";
cache-level = <2>;
+ cache-unified;
};
};
diff --git a/arch/arm64/boot/dts/arm/rtsm_ve-aemv8a.dts b/arch/arm64/boot/dts/arm/rtsm_ve-aemv8a.dts
index ef68f5aae7ddf..afdf954206f1d 100644
--- a/arch/arm64/boot/dts/arm/rtsm_ve-aemv8a.dts
+++ b/arch/arm64/boot/dts/arm/rtsm_ve-aemv8a.dts
@@ -72,6 +72,7 @@ cpu@3 {
L2_0: l2-cache0 {
compatible = "cache";
cache-level = <2>;
+ cache-unified;
};
};
diff --git a/arch/arm64/boot/dts/arm/vexpress-v2f-1xv7-ca53x2.dts b/arch/arm64/boot/dts/arm/vexpress-v2f-1xv7-ca53x2.dts
index 796cd7d02eb55..7bdeb965f0a96 100644
--- a/arch/arm64/boot/dts/arm/vexpress-v2f-1xv7-ca53x2.dts
+++ b/arch/arm64/boot/dts/arm/vexpress-v2f-1xv7-ca53x2.dts
@@ -58,6 +58,7 @@ cpu@1 {
L2_0: l2-cache0 {
compatible = "cache";
cache-level = <2>;
+ cache-unified;
};
};
--
2.39.2
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH AUTOSEL 6.3 06/37] tools: gpio: fix debounce_period_us output of lsgpio
2023-06-15 11:36 [PATCH AUTOSEL 6.3 01/37] power: supply: ab8500: Fix external_power_changed race Sasha Levin
` (3 preceding siblings ...)
2023-06-15 11:36 ` [PATCH AUTOSEL 6.3 05/37] arm64: dts: arm: " Sasha Levin
@ 2023-06-15 11:36 ` Sasha Levin
2023-06-16 8:23 ` [PATCH AUTOSEL 6.3 01/37] power: supply: ab8500: Fix external_power_changed race Pavel Machek
5 siblings, 0 replies; 8+ messages in thread
From: Sasha Levin @ 2023-06-15 11:36 UTC (permalink / raw)
To: linux-kernel, stable
Cc: Milo Spadacini, Linus Walleij, Andy Shevchenko,
Bartosz Golaszewski, Sasha Levin, brgl, linux-gpio
From: Milo Spadacini <milo.spadacini@gmail.com>
[ Upstream commit eb4b8eca1bad98f4b8574558a74f041f9acb5a54 ]
Fix incorrect output that could occur when more attributes are used and
GPIO_V2_LINE_ATTR_ID_DEBOUNCE is not the first one.
Signed-off-by: Milo Spadacini <milo.spadacini@gmail.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
tools/gpio/lsgpio.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/gpio/lsgpio.c b/tools/gpio/lsgpio.c
index c61d061247e17..52a0be45410c9 100644
--- a/tools/gpio/lsgpio.c
+++ b/tools/gpio/lsgpio.c
@@ -94,7 +94,7 @@ static void print_attributes(struct gpio_v2_line_info *info)
for (i = 0; i < info->num_attrs; i++) {
if (info->attrs[i].id == GPIO_V2_LINE_ATTR_ID_DEBOUNCE)
fprintf(stdout, ", debounce_period=%dusec",
- info->attrs[0].debounce_period_us);
+ info->attrs[i].debounce_period_us);
}
}
--
2.39.2
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH AUTOSEL 6.3 01/37] power: supply: ab8500: Fix external_power_changed race
2023-06-15 11:36 [PATCH AUTOSEL 6.3 01/37] power: supply: ab8500: Fix external_power_changed race Sasha Levin
` (4 preceding siblings ...)
2023-06-15 11:36 ` [PATCH AUTOSEL 6.3 06/37] tools: gpio: fix debounce_period_us output of lsgpio Sasha Levin
@ 2023-06-16 8:23 ` Pavel Machek
5 siblings, 0 replies; 8+ messages in thread
From: Pavel Machek @ 2023-06-16 8:23 UTC (permalink / raw)
To: Sasha Levin
Cc: linux-kernel, stable, Hans de Goede, Linus Walleij,
Sebastian Reichel, sre, linux-pm
[-- Attachment #1: Type: text/plain, Size: 370 bytes --]
Hi!
I do not see complete series in my inbox (only see patches 1-6).
But then I see another thread which seems to be complete.
Date: Wed, 31 May 2023 09:39:43 -0400
Subject: [PATCH AUTOSEL 6.3 01/37] power: supply: ab8500: Fix external_power_changed race
Best regards,
Pavel
--
People of Russia, stop Putin before his war on Ukraine escalates.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH AUTOSEL 6.3 01/37] power: supply: ab8500: Fix external_power_changed race
@ 2023-05-31 13:39 Sasha Levin
2023-05-31 13:39 ` [PATCH AUTOSEL 6.3 02/37] power: supply: sc27xx: " Sasha Levin
0 siblings, 1 reply; 8+ messages in thread
From: Sasha Levin @ 2023-05-31 13:39 UTC (permalink / raw)
To: linux-kernel, stable
Cc: Hans de Goede, Linus Walleij, Sebastian Reichel, Sasha Levin, sre,
linux-pm
From: Hans de Goede <hdegoede@redhat.com>
[ Upstream commit a5299ce4e96f3e8930e9c051b28d8093ada87b08 ]
ab8500_btemp_external_power_changed() dereferences di->btemp_psy,
which gets sets in ab8500_btemp_probe() like this:
di->btemp_psy = devm_power_supply_register(dev, &ab8500_btemp_desc,
&psy_cfg);
As soon as devm_power_supply_register() has called device_add()
the external_power_changed callback can get called. So there is a window
where ab8500_btemp_external_power_changed() may get called while
di->btemp_psy has not been set yet leading to a NULL pointer dereference.
Fixing this is easy. The external_power_changed callback gets passed
the power_supply which will eventually get stored in di->btemp_psy,
so ab8500_btemp_external_power_changed() can simply directly use
the passed in psy argument which is always valid.
And the same applies to ab8500_fg_external_power_changed().
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/power/supply/ab8500_btemp.c | 6 ++----
drivers/power/supply/ab8500_fg.c | 6 ++----
2 files changed, 4 insertions(+), 8 deletions(-)
diff --git a/drivers/power/supply/ab8500_btemp.c b/drivers/power/supply/ab8500_btemp.c
index 307ee6f71042e..6f83e99d2eb72 100644
--- a/drivers/power/supply/ab8500_btemp.c
+++ b/drivers/power/supply/ab8500_btemp.c
@@ -624,10 +624,8 @@ static int ab8500_btemp_get_ext_psy_data(struct device *dev, void *data)
*/
static void ab8500_btemp_external_power_changed(struct power_supply *psy)
{
- struct ab8500_btemp *di = power_supply_get_drvdata(psy);
-
- class_for_each_device(power_supply_class, NULL,
- di->btemp_psy, ab8500_btemp_get_ext_psy_data);
+ class_for_each_device(power_supply_class, NULL, psy,
+ ab8500_btemp_get_ext_psy_data);
}
/* ab8500 btemp driver interrupts and their respective isr */
diff --git a/drivers/power/supply/ab8500_fg.c b/drivers/power/supply/ab8500_fg.c
index 41a7bff9ac376..53560fbb6dcd3 100644
--- a/drivers/power/supply/ab8500_fg.c
+++ b/drivers/power/supply/ab8500_fg.c
@@ -2407,10 +2407,8 @@ static int ab8500_fg_init_hw_registers(struct ab8500_fg *di)
*/
static void ab8500_fg_external_power_changed(struct power_supply *psy)
{
- struct ab8500_fg *di = power_supply_get_drvdata(psy);
-
- class_for_each_device(power_supply_class, NULL,
- di->fg_psy, ab8500_fg_get_ext_psy_data);
+ class_for_each_device(power_supply_class, NULL, psy,
+ ab8500_fg_get_ext_psy_data);
}
/**
--
2.39.2
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH AUTOSEL 6.3 02/37] power: supply: sc27xx: Fix external_power_changed race
2023-05-31 13:39 Sasha Levin
@ 2023-05-31 13:39 ` Sasha Levin
0 siblings, 0 replies; 8+ messages in thread
From: Sasha Levin @ 2023-05-31 13:39 UTC (permalink / raw)
To: linux-kernel, stable
Cc: Hans de Goede, Orson Zhai, Chunyan Zhang, Baolin Wang,
Sebastian Reichel, Sasha Levin, sre, linux-pm
From: Hans de Goede <hdegoede@redhat.com>
[ Upstream commit 4d5c129d6c8993fe96e9ae712141eedcb9ca68c2 ]
sc27xx_fgu_external_power_changed() dereferences data->battery,
which gets sets in ab8500_btemp_probe() like this:
data->battery = devm_power_supply_register(dev, &sc27xx_fgu_desc,
&fgu_cfg);
As soon as devm_power_supply_register() has called device_add()
the external_power_changed callback can get called. So there is a window
where sc27xx_fgu_external_power_changed() may get called while
data->battery has not been set yet leading to a NULL pointer dereference.
Fixing this is easy. The external_power_changed callback gets passed
the power_supply which will eventually get stored in data->battery,
so sc27xx_fgu_external_power_changed() can simply directly use
the passed in psy argument which is always valid.
After this change sc27xx_fgu_external_power_changed() is reduced to just
"power_supply_changed(psy);" and it has the same prototype. While at it
simply replace it with making the external_power_changed callback
directly point to power_supply_changed.
Cc: Orson Zhai <orsonzhai@gmail.com>
Cc: Chunyan Zhang <zhang.lyra@gmail.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/power/supply/sc27xx_fuel_gauge.c | 9 +--------
1 file changed, 1 insertion(+), 8 deletions(-)
diff --git a/drivers/power/supply/sc27xx_fuel_gauge.c b/drivers/power/supply/sc27xx_fuel_gauge.c
index 632977f84b954..bd23c4d9fed43 100644
--- a/drivers/power/supply/sc27xx_fuel_gauge.c
+++ b/drivers/power/supply/sc27xx_fuel_gauge.c
@@ -733,13 +733,6 @@ static int sc27xx_fgu_set_property(struct power_supply *psy,
return ret;
}
-static void sc27xx_fgu_external_power_changed(struct power_supply *psy)
-{
- struct sc27xx_fgu_data *data = power_supply_get_drvdata(psy);
-
- power_supply_changed(data->battery);
-}
-
static int sc27xx_fgu_property_is_writeable(struct power_supply *psy,
enum power_supply_property psp)
{
@@ -774,7 +767,7 @@ static const struct power_supply_desc sc27xx_fgu_desc = {
.num_properties = ARRAY_SIZE(sc27xx_fgu_props),
.get_property = sc27xx_fgu_get_property,
.set_property = sc27xx_fgu_set_property,
- .external_power_changed = sc27xx_fgu_external_power_changed,
+ .external_power_changed = power_supply_changed,
.property_is_writeable = sc27xx_fgu_property_is_writeable,
.no_thermal = true,
};
--
2.39.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2023-06-16 8:23 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-06-15 11:36 [PATCH AUTOSEL 6.3 01/37] power: supply: ab8500: Fix external_power_changed race Sasha Levin
2023-06-15 11:36 ` [PATCH AUTOSEL 6.3 02/37] power: supply: sc27xx: " Sasha Levin
2023-06-15 11:36 ` [PATCH AUTOSEL 6.3 03/37] power: supply: bq27xxx: Use mod_delayed_work() instead of cancel() + schedule() Sasha Levin
2023-06-15 11:36 ` [PATCH AUTOSEL 6.3 04/37] ARM: dts: vexpress: add missing cache properties Sasha Levin
2023-06-15 11:36 ` [PATCH AUTOSEL 6.3 05/37] arm64: dts: arm: " Sasha Levin
2023-06-15 11:36 ` [PATCH AUTOSEL 6.3 06/37] tools: gpio: fix debounce_period_us output of lsgpio Sasha Levin
2023-06-16 8:23 ` [PATCH AUTOSEL 6.3 01/37] power: supply: ab8500: Fix external_power_changed race Pavel Machek
-- strict thread matches above, loose matches on Subject: below --
2023-05-31 13:39 Sasha Levin
2023-05-31 13:39 ` [PATCH AUTOSEL 6.3 02/37] power: supply: sc27xx: " Sasha Levin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox