Skip to content

Commit 4225fea

Browse files
Yang Yingliangdavem330
authored andcommitted
ptp: Fix possible memory leak in ptp_clock_register()
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: a33121e ("ptp: fix the race between the release of ptp_clock and cdev") Signed-off-by: Yang Yingliang <yangyingliang@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 3cb9580 commit 4225fea

File tree

1 file changed

+11
-4
lines changed

1 file changed

+11
-4
lines changed

drivers/ptp/ptp_clock.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -283,15 +283,22 @@ struct ptp_clock *ptp_clock_register(struct ptp_clock_info *info,
283283
/* Create a posix clock and link it to the device. */
284284
err = posix_clock_register(&ptp->clock, &ptp->dev);
285285
if (err) {
286+
if (ptp->pps_source)
287+
pps_unregister_source(ptp->pps_source);
288+
289+
kfree(ptp->vclock_index);
290+
291+
if (ptp->kworker)
292+
kthread_destroy_worker(ptp->kworker);
293+
294+
put_device(&ptp->dev);
295+
286296
pr_err("failed to create posix clock\n");
287-
goto no_clock;
297+
return ERR_PTR(err);
288298
}
289299

290300
return ptp;
291301

292-
no_clock:
293-
if (ptp->pps_source)
294-
pps_unregister_source(ptp->pps_source);
295302
no_pps:
296303
ptp_cleanup_pin_groups(ptp);
297304
no_pin_groups:

0 commit comments

Comments
 (0)