mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 13:55:32 +00:00
![]() When devm runs function in the "remove" path for a device it runs them
in the reverse order. That means that if you have parts of your driver
that aren't using devm or are using "roll your own" devm w/
devm_add_action_or_reset() you need to keep that in mind.
The mt8186 audio driver didn't quite get this right. Specifically, in
mt8186_init_clock() it called mt8186_audsys_clk_register() and then
went on to call a bunch of other devm function. The caller of
mt8186_init_clock() used devm_add_action_or_reset() to call
mt8186_deinit_clock() but, because of the intervening devm functions,
the order was wrong.
Specifically at probe time, the order was:
1. mt8186_audsys_clk_register()
2. afe_priv->clk = devm_kcalloc(...)
3. afe_priv->clk[i] = devm_clk_get(...)
At remove time, the order (which should have been 3, 2, 1) was:
1. mt8186_audsys_clk_unregister()
3. Free all of afe_priv->clk[i]
2. Free afe_priv->clk
The above seemed to be causing a use-after-free. Luckily, it's easy to
fix this by simply using devm more correctly. Let's move the
devm_add_action_or_reset() to the right place. In addition to fixing
the use-after-free, code inspection shows that this fixes a leak
(missing call to mt8186_audsys_clk_unregister()) that would have
happened if any of the syscon_regmap_lookup_by_phandle() calls in
mt8186_init_clock() had failed.
Fixes:
|
||
---|---|---|
.. | ||
Makefile | ||
mt8186-afe-clk.c | ||
mt8186-afe-clk.h | ||
mt8186-afe-common.h | ||
mt8186-afe-control.c | ||
mt8186-afe-gpio.c | ||
mt8186-afe-gpio.h | ||
mt8186-afe-pcm.c | ||
mt8186-audsys-clk.c | ||
mt8186-audsys-clk.h | ||
mt8186-audsys-clkid.h | ||
mt8186-dai-adda.c | ||
mt8186-dai-hostless.c | ||
mt8186-dai-hw-gain.c | ||
mt8186-dai-i2s.c | ||
mt8186-dai-pcm.c | ||
mt8186-dai-src.c | ||
mt8186-dai-tdm.c | ||
mt8186-interconnection.h | ||
mt8186-misc-control.c | ||
mt8186-mt6366-common.c | ||
mt8186-mt6366-common.h | ||
mt8186-mt6366-da7219-max98357.c | ||
mt8186-mt6366-rt1019-rt5682s.c | ||
mt8186-reg.h |