In the Linux kernel, the following vulnerability has been resolved:
ptp: remove ptp->nvclocks check logic in ptpvclockinuse()
There is no disagreement that we should check both ptp->isvirtualclock and ptp->n_vclocks to check if the ptp virtual clock is in use.
However, when we acquire ptp->nvclocksmux to read ptp->nvclocks in ptpvclockinuse(), we observe a recursive lock in the call trace starting from nvclocksstore().
============================================ WARNING: possible recursive locking detected
syz.0.1540/13807 is trying to acquire lock: ffff888035a24868 (&ptp->nvclocksmux){+.+.}-{4:4}, at: ptpvclockinuse drivers/ptp/ptpprivate.h:103 [inline] ffff888035a24868 (&ptp->nvclocksmux){+.+.}-{4:4}, at: ptpclockunregister+0x21/0x250 drivers/ptp/ptp_clock.c:415
but task is already holding lock: ffff888030704868 (&ptp->nvclocksmux){+.+.}-{4:4}, at: nvclocksstore+0xf1/0x6d0 drivers/ptp/ptp_sysfs.c:215
other info that might help us debug this: Possible unsafe locking scenario:
CPU0
----
lock(&ptp->nvclocksmux); lock(&ptp->nvclocksmux);
* DEADLOCK *
The best way to solve this is to remove the logic that checks ptp->nvclocks in ptpvclockinuse().
The reason why this is appropriate is that any path that uses ptp->nvclocks must unconditionally check if ptp->nvclocks is greater than 0 before unregistering vclocks, and all functions are already written this way. And in the function that uses ptp->nvclocks, we already get ptp->nvclocks_mux before unregistering vclocks.
Therefore, we need to remove the redundant check for ptp->nvclocks in ptpvclockinuse() to prevent recursive locking.
[
{
"signature_type": "Function",
"deprecated": false,
"digest": {
"length": 252.0,
"function_hash": "202970553941156971695674683295490356204"
},
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@b1b73c452331451020be3bf4b014901015ae6663",
"target": {
"file": "drivers/ptp/ptp_private.h",
"function": "ptp_vclock_in_use"
},
"id": "CVE-2025-38305-151074a6"
},
{
"signature_type": "Line",
"deprecated": false,
"digest": {
"line_hashes": [
"209938777727543383754954504593005706985",
"13867334632487831977293226065503751226",
"66548110248894193625297853898364062586",
"305030080018382486931445845206730916222",
"137669108073844981154280273537477513607",
"131435057965409424677679193574815925528",
"182200070002342779392707896022544265120",
"217902974384086069514610480059152249547",
"19667593619778992113060007672890643999",
"56334761424526767071552970871763046201"
],
"threshold": 0.9
},
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@5d217e7031a5c06d366580fc6ddbf43527b780d4",
"target": {
"file": "drivers/ptp/ptp_private.h"
},
"id": "CVE-2025-38305-2cd6f0a1"
},
{
"signature_type": "Line",
"deprecated": false,
"digest": {
"line_hashes": [
"209938777727543383754954504593005706985",
"13867334632487831977293226065503751226",
"66548110248894193625297853898364062586",
"305030080018382486931445845206730916222",
"137669108073844981154280273537477513607",
"131435057965409424677679193574815925528",
"182200070002342779392707896022544265120",
"217902974384086069514610480059152249547",
"23402096753737139674864324444770625399",
"191565232318965220846697371290968386610"
],
"threshold": 0.9
},
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@b1b73c452331451020be3bf4b014901015ae6663",
"target": {
"file": "drivers/ptp/ptp_private.h"
},
"id": "CVE-2025-38305-5fa3f265"
},
{
"signature_type": "Function",
"deprecated": false,
"digest": {
"length": 252.0,
"function_hash": "202970553941156971695674683295490356204"
},
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@259119595227fd20f6aa29d85abe086b6fdd9eb1",
"target": {
"file": "drivers/ptp/ptp_private.h",
"function": "ptp_vclock_in_use"
},
"id": "CVE-2025-38305-8666b99c"
},
{
"signature_type": "Function",
"deprecated": false,
"digest": {
"length": 252.0,
"function_hash": "202970553941156971695674683295490356204"
},
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@5d217e7031a5c06d366580fc6ddbf43527b780d4",
"target": {
"file": "drivers/ptp/ptp_private.h",
"function": "ptp_vclock_in_use"
},
"id": "CVE-2025-38305-a2581031"
},
{
"signature_type": "Line",
"deprecated": false,
"digest": {
"line_hashes": [
"209938777727543383754954504593005706985",
"13867334632487831977293226065503751226",
"66548110248894193625297853898364062586",
"305030080018382486931445845206730916222",
"137669108073844981154280273537477513607",
"131435057965409424677679193574815925528",
"182200070002342779392707896022544265120",
"217902974384086069514610480059152249547",
"23402096753737139674864324444770625399",
"191565232318965220846697371290968386610"
],
"threshold": 0.9
},
"signature_version": "v1",
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@259119595227fd20f6aa29d85abe086b6fdd9eb1",
"target": {
"file": "drivers/ptp/ptp_private.h"
},
"id": "CVE-2025-38305-ca2ee0e7"
}
]