2022-01-06 17:15:52

by Fabio Estevam

[permalink] [raw]
Subject: [PATCH] regmap: debugfs: Free the previous allocated debugfs_name buffer

The following error message is seen when booting an imx6q-sabresd:

debugfs: Directory 'dummy-iomuxc-gpr@20e0000' with parent 'regmap' already present!

By inspecting the duplicate directory name:

[ 0.274418] platform panel: Fixing up cyclic dependency with ldb
[ 0.276896] ************ 1: devname is dummy
[ 0.276926] ************ 2: name is iomuxc-gpr@20e0000
[ 0.276951] ************ 3: Forming the final name
[ 0.276979] ************ 3a: Name from map->debugfs_name dummy-iomuxc-gpr@20e0000
[ 0.277001] ************ 4: name is dummy-iomuxc-gpr@20e0000
[ 0.277022] ************ 5: Final name is dummy-iomuxc-gpr@20e0000
[ 0.277746] No ATAGs?
[ 0.278355] hw-breakpoint: found 5 (+1 reserved) breakpoint and 1 watchpoint registers.
[ 0.278469] hw-breakpoint: maximum watchpoint size is 4 bytes.
[ 0.282007] ********** gpr succeeded
[ 0.282042] ************ 1: devname is 20e0000.pinctrl
[ 0.282070] ************ 2: name is gpr
[ 0.282093] ************ 3a: Name from map->debugfs_name dummy-iomuxc-gpr@20e0000
[ 0.282115] ************ 4: name is dummy-iomuxc-gpr@20e0000
[ 0.282138] ************ 5: Final name is dummy-iomuxc-gpr@20e0000
[ 0.282185] debugfs: Directory 'dummy-iomuxc-gpr@20e0000' with parent 'regmap' already present!


The 'dummy-iomuxc-gpr@20e0000' name is caused by a non-freed map->debugfs_name
buffer.

After calling kfree(map->debugfs_name), no more duplicate naming is seen:

After:

[ 0.257135] platform 2800000.ipu: Fixing up cyclic dependency with 120000.hdmi
[ 0.257460] platform 2800000.ipu: Fixing up cyclic dependency with 20e0000.iomuxc-gpr:ipu2_csi1_mux
[ 0.257782] platform 2800000.ipu: Fixing up cyclic dependency with 21dc000.mipi
[ 0.273536] platform panel: Fixing up cyclic dependency with ldb
[ 0.276013] ************ 1: devname is dummy
[ 0.276043] ************ 2: name is iomuxc-gpr@20e0000
[ 0.276067] ************ 3: Forming the final name
[ 0.276097] ************ 3a: Name from map->debugfs_name dummy-iomuxc-gpr@20e0000
[ 0.276119] ************ 4: name is dummy-iomuxc-gpr@20e0000
[ 0.276141] ************ 5: Final name is dummy-iomuxc-gpr@20e0000
[ 0.276859] No ATAGs?
[ 0.277468] hw-breakpoint: found 5 (+1 reserved) breakpoint and 1 watchpoint registers.
[ 0.277580] hw-breakpoint: maximum watchpoint size is 4 bytes.
[ 0.281122] ********** gpr succeeded
[ 0.281156] ************ 1: devname is 20e0000.pinctrl
[ 0.281184] ************ 2: name is gpr
[ 0.281206] ************ 3a: Name from map->debugfs_name 20e0000.pinctrl
[ 0.281228] ************ 4: name is 20e0000.pinctrl
[ 0.281251] ************ 5: Final name is 20e0000.pinctrl

Signed-off-by: Fabio Estevam <[email protected]>
---
drivers/base/regmap/regmap-debugfs.c | 2 ++
1 file changed, 2 insertions(+)

diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c
index ad684d37c2da..18f0c7223082 100644
--- a/drivers/base/regmap/regmap-debugfs.c
+++ b/drivers/base/regmap/regmap-debugfs.c
@@ -589,6 +589,7 @@ void regmap_debugfs_init(struct regmap *map)
return;
}
name = map->debugfs_name;
+ kfree(map->debugfs_name);
} else {
name = devname;
}
@@ -600,6 +601,7 @@ void regmap_debugfs_init(struct regmap *map)
if (!map->debugfs_name)
return;
name = map->debugfs_name;
+ kfree(map->debugfs_name);
dummy_index++;
}

--
2.25.1



2022-01-06 17:32:00

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH] regmap: debugfs: Free the previous allocated debugfs_name buffer

On Thu, Jan 06, 2022 at 02:15:37PM -0300, Fabio Estevam wrote:

> debugfs: Directory 'dummy-iomuxc-gpr@20e0000' with parent 'regmap' already present!
>
> By inspecting the duplicate directory name:
>
> [ 0.274418] platform panel: Fixing up cyclic dependency with ldb
> [ 0.276896] ************ 1: devname is dummy
> [ 0.276926] ************ 2: name is iomuxc-gpr@20e0000

It's quite hard to read these kernel logs and tie them into anything -
they're fairly verbose and weirdly formatted with all the *********s.

> +++ b/drivers/base/regmap/regmap-debugfs.c
> @@ -589,6 +589,7 @@ void regmap_debugfs_init(struct regmap *map)
> return;
> }
> name = map->debugfs_name;
> + kfree(map->debugfs_name);
> } else {
> name = devname;
> }
> @@ -600,6 +601,7 @@ void regmap_debugfs_init(struct regmap *map)
> if (!map->debugfs_name)
> return;
> name = map->debugfs_name;
> + kfree(map->debugfs_name);

This is fairly clearly introducing a use after free bug - we've taken a
copy of map->debugfs_name in name then immediately free map->debugfs_name
so any use of name will be referencing freed memory. If this works it
will be because something went and zeroed the memory, it's just as
likely to cause us to crash.


Attachments:
(No filename) (1.22 kB)
signature.asc (488.00 B)
Download all attachments