All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] ptp: Fix possible memory leak in ptp_clock_register()
@ 2021-10-20  8:18 Yang Yingliang
  2021-10-20 13:50 ` patchwork-bot+netdevbpf
  2021-10-20 14:21 ` Jakub Kicinski
  0 siblings, 2 replies; 3+ messages in thread
From: Yang Yingliang @ 2021-10-20  8:18 UTC (permalink / raw)
  To: linux-kernel, netdev; +Cc: richardcochran

I got memory leak as follows when doing fault injection test:

unreferenced object 0xffff88800906c618 (size 8):
  comm "i2c-idt82p33931", pid 4421, jiffies 4294948083 (age 13.188s)
  hex dump (first 8 bytes):
    70 74 70 30 00 00 00 00                          ptp0....
  backtrace:
    [<00000000312ed458>] __kmalloc_track_caller+0x19f/0x3a0
    [<0000000079f6e2ff>] kvasprintf+0xb5/0x150
    [<0000000026aae54f>] kvasprintf_const+0x60/0x190
    [<00000000f323a5f7>] kobject_set_name_vargs+0x56/0x150
    [<000000004e35abdd>] dev_set_name+0xc0/0x100
    [<00000000f20cfe25>] ptp_clock_register+0x9f4/0xd30 [ptp]
    [<000000008bb9f0de>] idt82p33_probe.cold+0x8b6/0x1561 [ptp_idt82p33]

When posix_clock_register() returns an error, the name allocated
in dev_set_name() will be leaked, the put_device() should be used
to give up the device reference, then the name will be freed in
kobject_cleanup() and other memory will be freed in ptp_clock_release().

Reported-by: Hulk Robot <hulkci@huawei.com>
Fixes: a33121e5487b ("ptp: fix the race between the release of ptp_clock and cdev")
Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
---
 drivers/ptp/ptp_clock.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/drivers/ptp/ptp_clock.c b/drivers/ptp/ptp_clock.c
index 4dfc52e06704..7fd02aabd79a 100644
--- a/drivers/ptp/ptp_clock.c
+++ b/drivers/ptp/ptp_clock.c
@@ -283,15 +283,22 @@ struct ptp_clock *ptp_clock_register(struct ptp_clock_info *info,
 	/* Create a posix clock and link it to the device. */
 	err = posix_clock_register(&ptp->clock, &ptp->dev);
 	if (err) {
+	        if (ptp->pps_source)
+	                pps_unregister_source(ptp->pps_source);
+
+		kfree(ptp->vclock_index);
+
+		if (ptp->kworker)
+	                kthread_destroy_worker(ptp->kworker);
+
+		put_device(&ptp->dev);
+
 		pr_err("failed to create posix clock\n");
-		goto no_clock;
+		return ERR_PTR(err);
 	}
 
 	return ptp;
 
-no_clock:
-	if (ptp->pps_source)
-		pps_unregister_source(ptp->pps_source);
 no_pps:
 	ptp_cleanup_pin_groups(ptp);
 no_pin_groups:
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] ptp: Fix possible memory leak in ptp_clock_register()
  2021-10-20  8:18 [PATCH] ptp: Fix possible memory leak in ptp_clock_register() Yang Yingliang
@ 2021-10-20 13:50 ` patchwork-bot+netdevbpf
  2021-10-20 14:21 ` Jakub Kicinski
  1 sibling, 0 replies; 3+ messages in thread
From: patchwork-bot+netdevbpf @ 2021-10-20 13:50 UTC (permalink / raw)
  To: Yang Yingliang; +Cc: linux-kernel, netdev, richardcochran

Hello:

This patch was applied to netdev/net.git (master)
by David S. Miller <davem@davemloft.net>:

On Wed, 20 Oct 2021 16:18:34 +0800 you wrote:
> I got memory leak as follows when doing fault injection test:
> 
> unreferenced object 0xffff88800906c618 (size 8):
>   comm "i2c-idt82p33931", pid 4421, jiffies 4294948083 (age 13.188s)
>   hex dump (first 8 bytes):
>     70 74 70 30 00 00 00 00                          ptp0....
>   backtrace:
>     [<00000000312ed458>] __kmalloc_track_caller+0x19f/0x3a0
>     [<0000000079f6e2ff>] kvasprintf+0xb5/0x150
>     [<0000000026aae54f>] kvasprintf_const+0x60/0x190
>     [<00000000f323a5f7>] kobject_set_name_vargs+0x56/0x150
>     [<000000004e35abdd>] dev_set_name+0xc0/0x100
>     [<00000000f20cfe25>] ptp_clock_register+0x9f4/0xd30 [ptp]
>     [<000000008bb9f0de>] idt82p33_probe.cold+0x8b6/0x1561 [ptp_idt82p33]
> 
> [...]

Here is the summary with links:
  - ptp: Fix possible memory leak in ptp_clock_register()
    https://git.kernel.org/netdev/net/c/4225fea1cb28

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] ptp: Fix possible memory leak in ptp_clock_register()
  2021-10-20  8:18 [PATCH] ptp: Fix possible memory leak in ptp_clock_register() Yang Yingliang
  2021-10-20 13:50 ` patchwork-bot+netdevbpf
@ 2021-10-20 14:21 ` Jakub Kicinski
  1 sibling, 0 replies; 3+ messages in thread
From: Jakub Kicinski @ 2021-10-20 14:21 UTC (permalink / raw)
  To: Yang Yingliang; +Cc: linux-kernel, netdev, richardcochran

On Wed, 20 Oct 2021 16:18:34 +0800 Yang Yingliang wrote:
> I got memory leak as follows when doing fault injection test:
> 
> unreferenced object 0xffff88800906c618 (size 8):
>   comm "i2c-idt82p33931", pid 4421, jiffies 4294948083 (age 13.188s)
>   hex dump (first 8 bytes):
>     70 74 70 30 00 00 00 00                          ptp0....
>   backtrace:
>     [<00000000312ed458>] __kmalloc_track_caller+0x19f/0x3a0
>     [<0000000079f6e2ff>] kvasprintf+0xb5/0x150
>     [<0000000026aae54f>] kvasprintf_const+0x60/0x190
>     [<00000000f323a5f7>] kobject_set_name_vargs+0x56/0x150
>     [<000000004e35abdd>] dev_set_name+0xc0/0x100
>     [<00000000f20cfe25>] ptp_clock_register+0x9f4/0xd30 [ptp]
>     [<000000008bb9f0de>] idt82p33_probe.cold+0x8b6/0x1561 [ptp_idt82p33]
> 
> When posix_clock_register() returns an error, the name allocated
> in dev_set_name() will be leaked, the put_device() should be used
> to give up the device reference, then the name will be freed in
> kobject_cleanup() and other memory will be freed in ptp_clock_release().
> 
> Reported-by: Hulk Robot <hulkci@huawei.com>
> Fixes: a33121e5487b ("ptp: fix the race between the release of ptp_clock and cdev")
> Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>

> diff --git a/drivers/ptp/ptp_clock.c b/drivers/ptp/ptp_clock.c
> index 4dfc52e06704..7fd02aabd79a 100644
> --- a/drivers/ptp/ptp_clock.c
> +++ b/drivers/ptp/ptp_clock.c
> @@ -283,15 +283,22 @@ struct ptp_clock *ptp_clock_register(struct ptp_clock_info *info,
>  	/* Create a posix clock and link it to the device. */
>  	err = posix_clock_register(&ptp->clock, &ptp->dev);
>  	if (err) {
> +	        if (ptp->pps_source)
> +	                pps_unregister_source(ptp->pps_source);
> +
> +		kfree(ptp->vclock_index);

I think the way ptp->vclock_index is freed is also buggy.

It's accessed from sysfs so it should be freed from the release
function, not directly here or in ptp_clock_unregister(), right?

If that makes sense please submit a separate fix for the issue.

> +		if (ptp->kworker)
> +	                kthread_destroy_worker(ptp->kworker);
> +
> +		put_device(&ptp->dev);
> +
>  		pr_err("failed to create posix clock\n");
> -		goto no_clock;
> +		return ERR_PTR(err);
>  	}
>  
>  	return ptp;
>  
> -no_clock:
> -	if (ptp->pps_source)
> -		pps_unregister_source(ptp->pps_source);
>  no_pps:
>  	ptp_cleanup_pin_groups(ptp);
>  no_pin_groups:


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-10-20 14:21 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-20  8:18 [PATCH] ptp: Fix possible memory leak in ptp_clock_register() Yang Yingliang
2021-10-20 13:50 ` patchwork-bot+netdevbpf
2021-10-20 14:21 ` Jakub Kicinski

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.