CVE-2026-90144 (GCVE-0-2026-90144)
Vulnerability from cvelistv5
Published
2026-09-17 16:06
Modified
2026-10-21 12:50
Severity ?
VLAI Severity ?
EPSS score ?
Summary
In the Linux kernel, the following vulnerability has been resolved:
dpll: fix NULL deref in dpll_device_ops() during teardown race
When the last owner of a dpll device unregisters while a foreign driver
still holds a pin on it via dpll_pin_on_pin_register(), the dpll object
stays alive with an empty registration list. A pin notification queued
before the unregister (e.g. ice reacting to zl3073x_i2c removal) then
walks pin->dpll_refs into dpll_device_ops(), which trips the WARN_ON and
dereferences the missing registration. dpll_lock cannot help because the
notification work was queued before the unregistering driver took the
lock.
Treat the empty registration list as a legitimate transient state. Make
dpll_priv() and dpll_device_ops() return NULL in that case and make
every pin netlink path that resolves a device from a pin skip such
dplls. dpll_cmd_pin_get_one() picks a ref with a live registration and
returns -ENODEV when there is none, the pin dumpit skips such a pin
instead of aborting the dump, dpll_msg_add_pin_dplls() and the
frequency, esync, reference sync and phase adjust set paths skip dead
refs, and dpll_pin_parent_device_set() validates the parent with
dpll_device_get_by_id(). dpll_pin_register() is the last caller that
dereferenced the device ops without a check, so move its frequency
monitor validation under dpll_lock and tolerate a missing registration
there as well.
The empty registration list is equivalent to a cleared DPLL_REGISTERED
mark, both transitions happen under dpll_lock in dpll_device_register()
and dpll_device_unregister(). A pin notification for a pin whose dplls
are all gone is now dropped with -ENODEV instead of crashing, all
callers in the core ignore that return value.
WARNING: drivers/dpll/dpll_core.c:1092 at dpll_device_ops+0x24/0x40,
CPU#83: kworker/u576:3/23471
Modules linked in: ... ice ... zl3073x_i2c(-) ... zl3073x ...
Workqueue: ice_dpll_wq ice_dpll_pin_notify_work [ice]
RIP: 0010:dpll_device_ops+0x24/0x40
Call Trace:
<TASK>
dpll_cmd_pin_get_one+0x336/0x520
dpll_pin_event_send+0x82/0x140
dpll_pin_on_pin_unregister+0xbb/0x160
ice_dpll_pin_notify_work+0x1bc/0x1f0 [ice]
process_one_work+0x19e/0x370
worker_thread+0x1a6/0x310
kthread+0xe4/0x120
ret_from_fork+0x1a1/0x270
ret_from_fork_asm+0x1a/0x30
</TASK>
---[ end trace 0000000000000000 ]---
BUG: kernel NULL pointer dereference, address: 0000000000000010
#PF: supervisor read access in kernel mode
#PF: error_code(0x0000) - not-present page
References
| URL | Tags | |
|---|---|---|
Impacted products
{
"containers": {
"cna": {
"affected": [
{
"defaultStatus": "unaffected",
"product": "Linux",
"programFiles": [
"drivers/dpll/dpll_core.c",
"drivers/dpll/dpll_netlink.c"
],
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"versions": [
{
"lessThan": "7d9661d6ef60bee705a3bb220dc59f10d9155c31",
"status": "affected",
"version": "9431063ad323ac864750aeba4d304389bc42ca4e",
"versionType": "git"
},
{
"lessThan": "d39da3ff8d39c31761bf1698bc02a5a206722136",
"status": "affected",
"version": "9431063ad323ac864750aeba4d304389bc42ca4e",
"versionType": "git"
},
{
"lessThan": "fdbf04e3e01a872d0ef2149f846f1a3e3cb54f5b",
"status": "affected",
"version": "9431063ad323ac864750aeba4d304389bc42ca4e",
"versionType": "git"
},
{
"lessThan": "33f016b23a219fe034213849b51436b8e79df251",
"status": "affected",
"version": "9431063ad323ac864750aeba4d304389bc42ca4e",
"versionType": "git"
}
]
},
{
"defaultStatus": "affected",
"product": "Linux",
"programFiles": [
"drivers/dpll/dpll_core.c",
"drivers/dpll/dpll_netlink.c"
],
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"vendor": "Linux",
"versions": [
{
"status": "affected",
"version": "6.7"
},
{
"lessThan": "6.7",
"status": "unaffected",
"version": "0",
"versionType": "semver"
},
{
"lessThanOrEqual": "6.12.*",
"status": "unaffected",
"version": "6.12.114",
"versionType": "semver"
},
{
"lessThanOrEqual": "6.18.*",
"status": "unaffected",
"version": "6.18.57",
"versionType": "semver"
},
{
"lessThanOrEqual": "7.2.*",
"status": "unaffected",
"version": "7.2.6",
"versionType": "semver"
},
{
"lessThanOrEqual": "*",
"status": "unaffected",
"version": "7.3",
"versionType": "original_commit_for_fix"
}
]
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "6.12.114",
"versionStartIncluding": "6.7",
"vulnerable": true
},
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "6.18.57",
"versionStartIncluding": "6.7",
"vulnerable": true
},
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "7.2.6",
"versionStartIncluding": "6.7",
"vulnerable": true
},
{
"criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
"versionEndExcluding": "7.3",
"versionStartIncluding": "6.7",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
]
}
],
"descriptions": [
{
"lang": "en",
"value": "In the Linux kernel, the following vulnerability has been resolved:\n\ndpll: fix NULL deref in dpll_device_ops() during teardown race\n\nWhen the last owner of a dpll device unregisters while a foreign driver\nstill holds a pin on it via dpll_pin_on_pin_register(), the dpll object\nstays alive with an empty registration list. A pin notification queued\nbefore the unregister (e.g. ice reacting to zl3073x_i2c removal) then\nwalks pin-\u003edpll_refs into dpll_device_ops(), which trips the WARN_ON and\ndereferences the missing registration. dpll_lock cannot help because the\nnotification work was queued before the unregistering driver took the\nlock.\n\nTreat the empty registration list as a legitimate transient state. Make\ndpll_priv() and dpll_device_ops() return NULL in that case and make\nevery pin netlink path that resolves a device from a pin skip such\ndplls. dpll_cmd_pin_get_one() picks a ref with a live registration and\nreturns -ENODEV when there is none, the pin dumpit skips such a pin\ninstead of aborting the dump, dpll_msg_add_pin_dplls() and the\nfrequency, esync, reference sync and phase adjust set paths skip dead\nrefs, and dpll_pin_parent_device_set() validates the parent with\ndpll_device_get_by_id(). dpll_pin_register() is the last caller that\ndereferenced the device ops without a check, so move its frequency\nmonitor validation under dpll_lock and tolerate a missing registration\nthere as well.\n\nThe empty registration list is equivalent to a cleared DPLL_REGISTERED\nmark, both transitions happen under dpll_lock in dpll_device_register()\nand dpll_device_unregister(). A pin notification for a pin whose dplls\nare all gone is now dropped with -ENODEV instead of crashing, all\ncallers in the core ignore that return value.\n\n WARNING: drivers/dpll/dpll_core.c:1092 at dpll_device_ops+0x24/0x40,\n CPU#83: kworker/u576:3/23471\n Modules linked in: ... ice ... zl3073x_i2c(-) ... zl3073x ...\n Workqueue: ice_dpll_wq ice_dpll_pin_notify_work [ice]\n RIP: 0010:dpll_device_ops+0x24/0x40\n Call Trace:\n \u003cTASK\u003e\n dpll_cmd_pin_get_one+0x336/0x520\n dpll_pin_event_send+0x82/0x140\n dpll_pin_on_pin_unregister+0xbb/0x160\n ice_dpll_pin_notify_work+0x1bc/0x1f0 [ice]\n process_one_work+0x19e/0x370\n worker_thread+0x1a6/0x310\n kthread+0xe4/0x120\n ret_from_fork+0x1a1/0x270\n ret_from_fork_asm+0x1a/0x30\n \u003c/TASK\u003e\n ---[ end trace 0000000000000000 ]---\n BUG: kernel NULL pointer dereference, address: 0000000000000010\n #PF: supervisor read access in kernel mode\n #PF: error_code(0x0000) - not-present page"
}
],
"providerMetadata": {
"dateUpdated": "2026-10-21T12:50:03.630Z",
"orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"shortName": "Linux"
},
"references": [
{
"url": "https://git.kernel.org/stable/c/7d9661d6ef60bee705a3bb220dc59f10d9155c31"
},
{
"url": "https://git.kernel.org/stable/c/d39da3ff8d39c31761bf1698bc02a5a206722136"
},
{
"url": "https://git.kernel.org/stable/c/fdbf04e3e01a872d0ef2149f846f1a3e3cb54f5b"
},
{
"url": "https://git.kernel.org/stable/c/33f016b23a219fe034213849b51436b8e79df251"
}
],
"title": "dpll: fix NULL deref in dpll_device_ops() during teardown race",
"x_generator": {
"engine": "bippy-1.2.0"
}
}
},
"cveMetadata": {
"assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
"assignerShortName": "Linux",
"cveId": "CVE-2026-90144",
"datePublished": "2026-09-17T16:06:40.413Z",
"dateReserved": "2026-09-11T19:38:34.789Z",
"dateUpdated": "2026-10-21T12:50:03.630Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
Loading…
Loading…
Sightings
| Author | Source | Type | Date |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or seen somewhere by the user.
- Confirmed: The vulnerability is confirmed from an analyst perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: This vulnerability was exploited and seen by the user reporting the sighting.
- Patched: This vulnerability was successfully patched by the user reporting the sighting.
- Not exploited: This vulnerability was not exploited or seen by the user reporting the sighting.
- Not confirmed: The user expresses doubt about the veracity of the vulnerability.
- Not patched: This vulnerability was not successfully patched by the user reporting the sighting.
Loading…
Loading…