* [PATCH] clocksource: clps711x: Fix resource leaks in error paths
@ 2025-07-31 6:23 Zhen Ni
2025-08-01 14:00 ` Markus Elfring
2025-08-04 12:36 ` [PATCH v2] " Zhen Ni
0 siblings, 2 replies; 6+ messages in thread
From: Zhen Ni @ 2025-07-31 6:23 UTC (permalink / raw)
To: daniel.lezcano, tglx; +Cc: linux-kernel, Zhen Ni
The current implementation of clps711x_timer_init() has multiple error
paths that directly return without releasing the base I/O memory mapped
via of_iomap(). This leads to resource leaks when:
1. irq_of_parse_and_map() fails
2. of_clk_get() returns an error
3. _clps711x_clkevt_init() fails for CLOCKEVENT alias
4. An unrecognized timer alias is provided
Signed-off-by: Zhen Ni <zhen.ni@easystack.cn>
---
drivers/clocksource/clps711x-timer.c | 24 +++++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)
diff --git a/drivers/clocksource/clps711x-timer.c b/drivers/clocksource/clps711x-timer.c
index e95fdc49c226..f803d694c7a4 100644
--- a/drivers/clocksource/clps711x-timer.c
+++ b/drivers/clocksource/clps711x-timer.c
@@ -78,24 +78,34 @@ static int __init clps711x_timer_init(struct device_node *np)
unsigned int irq = irq_of_parse_and_map(np, 0);
struct clk *clock = of_clk_get(np, 0);
void __iomem *base = of_iomap(np, 0);
+ int ret = 0;
if (!base)
return -ENOMEM;
- if (!irq)
- return -EINVAL;
- if (IS_ERR(clock))
- return PTR_ERR(clock);
+ if (!irq) {
+ ret = -EINVAL;
+ goto out;
+ }
+ if (IS_ERR(clock)) {
+ ret = PTR_ERR(clock);
+ goto out;
+ }
switch (of_alias_get_id(np, "timer")) {
case CLPS711X_CLKSRC_CLOCKSOURCE:
clps711x_clksrc_init(clock, base);
break;
case CLPS711X_CLKSRC_CLOCKEVENT:
- return _clps711x_clkevt_init(clock, base, irq);
+ ret = _clps711x_clkevt_init(clock, base, irq);
+ break;
default:
- return -EINVAL;
+ ret = -EINVAL;
+ break;
}
- return 0;
+out:
+ if (base)
+ iounmap(base);
+ return ret;
}
TIMER_OF_DECLARE(clps711x, "cirrus,ep7209-timer", clps711x_timer_init);
--
2.20.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] clocksource: clps711x: Fix resource leaks in error paths
2025-07-31 6:23 [PATCH] clocksource: clps711x: Fix resource leaks in error paths Zhen Ni
@ 2025-08-01 14:00 ` Markus Elfring
2025-08-04 12:36 ` [PATCH v2] " Zhen Ni
1 sibling, 0 replies; 6+ messages in thread
From: Markus Elfring @ 2025-08-01 14:00 UTC (permalink / raw)
To: Zhen Ni, Thomas Gleixner, Daniel Lezcano; +Cc: LKML, kernel-janitors
> The current implementation of clps711x_timer_init() has multiple error
> paths that directly return without releasing the base I/O memory mapped
How do you think about to add any tags (like “Fixes” and “Cc”) accordingly?
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst?h=v6.16#n145
> via of_iomap(). This leads to resource leaks when:
Please reconsider the need for the presented enumeration once more.
See also:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst?h=v6.16#n94
…
> +++ b/drivers/clocksource/clps711x-timer.c
> @@ -78,24 +78,34 @@ static int __init clps711x_timer_init(struct device_node *np)
…
> - return 0;
> +out:
> + if (base)
* I suggest to omit such a pointer check because it was performed already
directly after the of_iomap() call.
* Would it be nicer to use the label “unmap_io”?
> + iounmap(base);
> + return ret;
> }
> TIMER_OF_DECLARE(clps711x, "cirrus,ep7209-timer", clps711x_timer_init);
…
Regards,
Markus
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2] clocksource: clps711x: Fix resource leaks in error paths
2025-07-31 6:23 [PATCH] clocksource: clps711x: Fix resource leaks in error paths Zhen Ni
2025-08-01 14:00 ` Markus Elfring
@ 2025-08-04 12:36 ` Zhen Ni
2025-08-04 12:52 ` Markus Elfring
` (2 more replies)
1 sibling, 3 replies; 6+ messages in thread
From: Zhen Ni @ 2025-08-04 12:36 UTC (permalink / raw)
To: Markus.Elfring, daniel.lezcano, tglx; +Cc: linux-kernel, Zhen Ni, stable
The current implementation of clps711x_timer_init() has multiple error
paths that directly return without releasing the base I/O memory mapped
via of_iomap(). Fix of_iomap leaks in err paths.
Fixes: 04410efbb6bc ("clocksource/drivers/clps711x: Convert init function to return error")
Fixes: 2a6a8e2d9004 ("clocksource/drivers/clps711x: Remove board support")
Cc: stable@vger.kernel.org
Signed-off-by: Zhen Ni <zhen.ni@easystack.cn>
---
changes in v2:
- Add tags of 'Fixes' and 'Cc'
- Reduce detailed enumeration of err paths
- Omit a pointer check before iounmap()
- Change goto target from out to unmap_io
---
drivers/clocksource/clps711x-timer.c | 23 ++++++++++++++++-------
1 file changed, 16 insertions(+), 7 deletions(-)
diff --git a/drivers/clocksource/clps711x-timer.c b/drivers/clocksource/clps711x-timer.c
index e95fdc49c226..bbceb0289d45 100644
--- a/drivers/clocksource/clps711x-timer.c
+++ b/drivers/clocksource/clps711x-timer.c
@@ -78,24 +78,33 @@ static int __init clps711x_timer_init(struct device_node *np)
unsigned int irq = irq_of_parse_and_map(np, 0);
struct clk *clock = of_clk_get(np, 0);
void __iomem *base = of_iomap(np, 0);
+ int ret = 0;
if (!base)
return -ENOMEM;
- if (!irq)
- return -EINVAL;
- if (IS_ERR(clock))
- return PTR_ERR(clock);
+ if (!irq) {
+ ret = -EINVAL;
+ goto unmap_io;
+ }
+ if (IS_ERR(clock)) {
+ ret = PTR_ERR(clock);
+ goto unmap_io;
+ }
switch (of_alias_get_id(np, "timer")) {
case CLPS711X_CLKSRC_CLOCKSOURCE:
clps711x_clksrc_init(clock, base);
break;
case CLPS711X_CLKSRC_CLOCKEVENT:
- return _clps711x_clkevt_init(clock, base, irq);
+ ret = _clps711x_clkevt_init(clock, base, irq);
+ break;
default:
- return -EINVAL;
+ ret = -EINVAL;
+ break;
}
- return 0;
+unmap_io:
+ iounmap(base);
+ return ret;
}
TIMER_OF_DECLARE(clps711x, "cirrus,ep7209-timer", clps711x_timer_init);
--
2.20.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2] clocksource: clps711x: Fix resource leaks in error paths
2025-08-04 12:36 ` [PATCH v2] " Zhen Ni
@ 2025-08-04 12:52 ` Markus Elfring
[not found] ` <20250805035637.169422-1-zhen.ni@easystack.cn>
2025-08-14 12:33 ` Zhen Ni
2 siblings, 0 replies; 6+ messages in thread
From: Markus Elfring @ 2025-08-04 12:52 UTC (permalink / raw)
To: Zhen Ni, Thomas Gleixner, Daniel Lezcano; +Cc: linux-kernel, stable
> The current implementation of clps711x_timer_init() has multiple error
> paths that directly return without releasing the base I/O memory mapped
> via of_iomap(). Fix of_iomap leaks in err paths.
error?
Regards,
Markus
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v3] clocksource: clps711x: Fix resource leaks in error paths
[not found] ` <20250805035637.169422-1-zhen.ni@easystack.cn>
@ 2025-08-13 12:14 ` Daniel Lezcano
0 siblings, 0 replies; 6+ messages in thread
From: Daniel Lezcano @ 2025-08-13 12:14 UTC (permalink / raw)
To: Zhen Ni, Markus.Elfring, tglx; +Cc: linux-kernel, stable
Hi,
this patch does not seem to have reached lkml@, making impossible to
extract via git b4 neither adding the Link tag.
On 05/08/2025 05:56, Zhen Ni wrote:
> The current implementation of clps711x_timer_init() has multiple error
> paths that directly return without releasing the base I/O memory mapped
> via of_iomap(). Fix of_iomap leaks in error paths.
>
> Fixes: 04410efbb6bc ("clocksource/drivers/clps711x: Convert init function to return error")
> Fixes: 2a6a8e2d9004 ("clocksource/drivers/clps711x: Remove board support")
> Cc: stable@vger.kernel.org
> Signed-off-by: Zhen Ni <zhen.ni@easystack.cn>
> ---
> changes in v3:
> - Change "err" to "error" in the commit message.
> changes in v2:
> - Add tags of 'Fixes' and 'Cc'
> - Reduce detailed enumeration of err paths
> - Omit a pointer check before iounmap()
> - Change goto target from out to unmap_io
> ---
> drivers/clocksource/clps711x-timer.c | 23 ++++++++++++++++-------
> 1 file changed, 16 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/clocksource/clps711x-timer.c b/drivers/clocksource/clps711x-timer.c
> index e95fdc49c226..bbceb0289d45 100644
> --- a/drivers/clocksource/clps711x-timer.c
> +++ b/drivers/clocksource/clps711x-timer.c
> @@ -78,24 +78,33 @@ static int __init clps711x_timer_init(struct device_node *np)
> unsigned int irq = irq_of_parse_and_map(np, 0);
> struct clk *clock = of_clk_get(np, 0);
> void __iomem *base = of_iomap(np, 0);
> + int ret = 0;
>
> if (!base)
> return -ENOMEM;
> - if (!irq)
> - return -EINVAL;
> - if (IS_ERR(clock))
> - return PTR_ERR(clock);
> + if (!irq) {
> + ret = -EINVAL;
> + goto unmap_io;
> + }
> + if (IS_ERR(clock)) {
> + ret = PTR_ERR(clock);
> + goto unmap_io;
> + }
>
> switch (of_alias_get_id(np, "timer")) {
> case CLPS711X_CLKSRC_CLOCKSOURCE:
> clps711x_clksrc_init(clock, base);
> break;
> case CLPS711X_CLKSRC_CLOCKEVENT:
> - return _clps711x_clkevt_init(clock, base, irq);
> + ret = _clps711x_clkevt_init(clock, base, irq);
> + break;
> default:
> - return -EINVAL;
> + ret = -EINVAL;
> + break;
> }
>
> - return 0;
> +unmap_io:
> + iounmap(base);
> + return ret;
> }
> TIMER_OF_DECLARE(clps711x, "cirrus,ep7209-timer", clps711x_timer_init);
--
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v3] clocksource: clps711x: Fix resource leaks in error paths
2025-08-04 12:36 ` [PATCH v2] " Zhen Ni
2025-08-04 12:52 ` Markus Elfring
[not found] ` <20250805035637.169422-1-zhen.ni@easystack.cn>
@ 2025-08-14 12:33 ` Zhen Ni
2 siblings, 0 replies; 6+ messages in thread
From: Zhen Ni @ 2025-08-14 12:33 UTC (permalink / raw)
To: daniel.lezcano, tglx; +Cc: linux-kernel, Zhen Ni, stable
The current implementation of clps711x_timer_init() has multiple error
paths that directly return without releasing the base I/O memory mapped
via of_iomap(). Fix of_iomap leaks in error paths.
Fixes: 04410efbb6bc ("clocksource/drivers/clps711x: Convert init function to return error")
Fixes: 2a6a8e2d9004 ("clocksource/drivers/clps711x: Remove board support")
Cc: stable@vger.kernel.org
Signed-off-by: Zhen Ni <zhen.ni@easystack.cn>
---
changes in v3:
- Change "err" to "error" in the commit message.
changes in v2:
- Add tags of 'Fixes' and 'Cc'
- Reduce detailed enumeration of err paths
- Omit a pointer check before iounmap()
- Change goto target from out to unmap_io
---
drivers/clocksource/clps711x-timer.c | 23 ++++++++++++++++-------
1 file changed, 16 insertions(+), 7 deletions(-)
diff --git a/drivers/clocksource/clps711x-timer.c b/drivers/clocksource/clps711x-timer.c
index e95fdc49c226..bbceb0289d45 100644
--- a/drivers/clocksource/clps711x-timer.c
+++ b/drivers/clocksource/clps711x-timer.c
@@ -78,24 +78,33 @@ static int __init clps711x_timer_init(struct device_node *np)
unsigned int irq = irq_of_parse_and_map(np, 0);
struct clk *clock = of_clk_get(np, 0);
void __iomem *base = of_iomap(np, 0);
+ int ret = 0;
if (!base)
return -ENOMEM;
- if (!irq)
- return -EINVAL;
- if (IS_ERR(clock))
- return PTR_ERR(clock);
+ if (!irq) {
+ ret = -EINVAL;
+ goto unmap_io;
+ }
+ if (IS_ERR(clock)) {
+ ret = PTR_ERR(clock);
+ goto unmap_io;
+ }
switch (of_alias_get_id(np, "timer")) {
case CLPS711X_CLKSRC_CLOCKSOURCE:
clps711x_clksrc_init(clock, base);
break;
case CLPS711X_CLKSRC_CLOCKEVENT:
- return _clps711x_clkevt_init(clock, base, irq);
+ ret = _clps711x_clkevt_init(clock, base, irq);
+ break;
default:
- return -EINVAL;
+ ret = -EINVAL;
+ break;
}
- return 0;
+unmap_io:
+ iounmap(base);
+ return ret;
}
TIMER_OF_DECLARE(clps711x, "cirrus,ep7209-timer", clps711x_timer_init);
--
2.20.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-08-14 12:48 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-31 6:23 [PATCH] clocksource: clps711x: Fix resource leaks in error paths Zhen Ni
2025-08-01 14:00 ` Markus Elfring
2025-08-04 12:36 ` [PATCH v2] " Zhen Ni
2025-08-04 12:52 ` Markus Elfring
[not found] ` <20250805035637.169422-1-zhen.ni@easystack.cn>
2025-08-13 12:14 ` [PATCH v3] " Daniel Lezcano
2025-08-14 12:33 ` Zhen Ni
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).