Skip to content

Commit 31db643

Browse files
nefigtutgregkh
authored andcommitted
ptp: free ptp device pin descriptors properly
commit 7571858 upstream. There is a bug in ptp_clock_unregister(), where ptp_cleanup_pin_groups() first frees ptp->pin_{,dev_}attr, but then posix_clock_unregister() needs them to destroy a related sysfs device. These functions can not be just swapped, as posix_clock_unregister() frees ptp which is needed in the ptp_cleanup_pin_groups(). Fix this by calling ptp_cleanup_pin_groups() in ptp_clock_release(), right before ptp is freed. This makes this patch fix an UAF bug in a patch which fixes an UAF bug. Reported-by: Antti Laakso <[email protected]> Fixes: a33121e ("ptp: fix the race between the release of ptp_clock and cdev") Link: https://lore.kernel.org/netdev/[email protected]/ Signed-off-by: Vladis Dronov <[email protected]> Acked-by: Richard Cochran <[email protected]> Signed-off-by: David S. Miller <[email protected]> Signed-off-by: Ben Hutchings <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent 89e8fc9 commit 31db643

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

drivers/ptp/ptp_clock.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ static void ptp_clock_release(struct device *dev)
175175
{
176176
struct ptp_clock *ptp = container_of(dev, struct ptp_clock, dev);
177177

178+
ptp_cleanup_pin_groups(ptp);
178179
mutex_destroy(&ptp->tsevq_mux);
179180
mutex_destroy(&ptp->pincfg_mux);
180181
ida_simple_remove(&ptp_clocks_map, ptp->index);
@@ -276,9 +277,8 @@ int ptp_clock_unregister(struct ptp_clock *ptp)
276277
if (ptp->pps_source)
277278
pps_unregister_source(ptp->pps_source);
278279

279-
ptp_cleanup_pin_groups(ptp);
280-
281280
posix_clock_unregister(&ptp->clock);
281+
282282
return 0;
283283
}
284284
EXPORT_SYMBOL(ptp_clock_unregister);

0 commit comments

Comments
 (0)