drm/nouveau/uvmm: fix NULL deref unwinding an OP_MAP_SPARSE op
In the Linux kernel, the following vulnerability has been resolved: drm/nouveau/uvmm: fix NULL deref unwinding an OP_MAP_SPARSE op Each bind_job_op is zeroed by kzalloc_obj() in bind_job_op_from_uop(), and the OP_MAP_SPARSE case in nouveau_uvmm_bind_job_submit() only creates a region, so op->ops stays NULL for a successfully processed sparse map. If a later op in the same job fails, the reverse unwind loop revisits that op and calls drm_gpuva_ops_free(&uvmm->base, op->ops) unconditionally. drm_gpuva_ops_free() dereferences its argument right away (list_for_each_entry_safe on &ops->list), so a NULL op->ops oopses. The path is reachable by any render-node fd holder, since NOUVEAU_VM_BIND is DRM_RENDER_ALLOW. Guard the free with IS_ERR_OR_NULL(), as nouveau_uvmm_bind_job_cleanup() already does for the identical free.
- Products
- Kernel
- Affected versions
- Not specified
- Fixed versions
- 6.12.110, 6.18.51, 6.6.160, 7.2.5
- CVEs
- CVE-2026-89802
- Confirmed fixed CVEs
- Not specified
- Updated in this feed
- 3 Nov 2026, 17:26 UTC · Revision 1
Source evidence
drm/nouveau/uvmm: fix NULL deref unwinding an OP_MAP_SPARSE op
core-osv · Original sourcePublished 16 Sept 2026, 10:30 UTC
In the Linux kernel, the following vulnerability has been resolved: drm/nouveau/uvmm: fix NULL deref unwinding an OP_MAP_SPARSE op Each bind_job_op is zeroed by kzalloc_obj() in bind_job_op_from_uop(), and the OP_MAP_SPARSE case in nouveau_uvmm_bind_job_submit() only creates a region, so op->ops stays NULL for a successfully processed sparse map. If a later op in the same job fails, the reverse unwind loop revisits that op and calls drm_gpuva_ops_free(&uvmm->base, op->ops) unconditionally. drm_gpuva_ops_free() dereferences its argument right away (list_for_each_entry_safe on &ops->list), so a NULL op->ops oopses. The path is reachable by any render-node fd holder, since NOUVEAU_VM_BIND is DRM_RENDER_ALLOW. Guard the free with IS_ERR_OR_NULL(), as nouveau_uvmm_bind_job_cleanup() already does for the identical free.
osv:CVE-2026-89802
Kernel
Fixed versions: 6.6.160, 6.12.110, 6.18.51, 7.2.5
Complete source record
{
"id": "22f81c8f6ce0dce3d693ad7d3fe35e7de1ea7c444e3ca37e4d505f721c57b942",
"url": "https://osv.dev/vulnerability/CVE-2026-89802",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "drm/nouveau/uvmm: fix NULL deref unwinding an OP_MAP_SPARSE op",
"summary": "In the Linux kernel, the following vulnerability has been resolved: drm/nouveau/uvmm: fix NULL deref unwinding an OP_MAP_SPARSE op Each bind_job_op is zeroed by kzalloc_obj() in bind_job_op_from_uop(), and the OP_MAP_SPARSE case in nouveau_uvmm_bind_job_submit() only creates a region, so op->ops stays NULL for a successfully processed sparse map. If a later op in the same job fails, the reverse unwind loop revisits that op and calls drm_gpuva_ops_free(&uvmm->base, op->ops) unconditionally. drm_gpuva_ops_free() dereferences its argument right away (list_for_each_entry_safe on &ops->list), so a NULL op->ops oopses. The path is reachable by any render-node fd holder, since NOUVEAU_VM_BIND is DRM_RENDER_ALLOW. Guard the free with IS_ERR_OR_NULL(), as nouveau_uvmm_bind_job_cleanup() already does for the identical free.",
"evidence": "osv:CVE-2026-89802",
"products": [
{
"name": {
"value": "Kernel",
"evidence": "/affected/1/package/name"
},
"prerequisites": [],
"fixed_versions": [
{
"value": "6.6.160",
"evidence": "/affected/1/ranges"
},
{
"value": "6.12.110",
"evidence": "/affected/1/ranges"
},
{
"value": "6.18.51",
"evidence": "/affected/1/ranges"
},
{
"value": "7.2.5",
"evidence": "/affected/1/ranges"
}
],
"affected_versions": []
}
],
"severity": "unknown",
"structured": {
"id": "CVE-2026-89802",
"aliases": [
"CVE-2026-89802"
],
"affected": [
{
"ranges": [
{
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"type": "GIT",
"events": [
{
"introduced": "b88baab828713ce0b49b185444b2ee83bed373a8"
},
{
"fixed": "d8ec34618e71018fd7a3f73c57c6b92d71a6c7c3"
},
{
"fixed": "3bf493cf7ed0c2b3df728977a257e0d99b4db1c6"
},
{
"fixed": "b7dc03e09313d22a6d230b759de3b05d504c008f"
},
{
"fixed": "3857238de6bce6c1573e8cb86c37b067e5208f05"
},
{
"fixed": "412a6ceb56d501ef2f8202e26ab4b5d4dfbca566"
}
]
}
],
"database_specific": {
"source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-89802.json"
}
},
{
"ranges": [
{
"type": "ECOSYSTEM",
"events": [
{
"introduced": "6.6.0"
},
{
"fixed": "6.6.160"
}
]
},
{
"type": "ECOSYSTEM",
"events": [
{
"introduced": "6.7.0"
},
{
"fixed": "6.12.110"
}
]
},
{
"type": "ECOSYSTEM",
"events": [
{
"introduced": "6.13.0"
},
{
"fixed": "6.18.51"
}
]
},
{
"type": "ECOSYSTEM",
"events": [
{
"introduced": "6.19.0"
},
{
"fixed": "7.2.5"
}
]
}
],
"package": {
"name": "Kernel",
"ecosystem": "Linux"
},
"database_specific": {
"source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-89802.json"
}
}
],
"modified": "2026-10-28T02:30:30.801151499Z",
"provider": "osv",
"references": [
"https://git.kernel.org/stable/c/3857238de6bce6c1573e8cb86c37b067e5208f05",
"https://git.kernel.org/stable/c/3bf493cf7ed0c2b3df728977a257e0d99b4db1c6",
"https://git.kernel.org/stable/c/412a6ceb56d501ef2f8202e26ab4b5d4dfbca566",
"https://git.kernel.org/stable/c/b7dc03e09313d22a6d230b759de3b05d504c008f",
"https://git.kernel.org/stable/c/d8ec34618e71018fd7a3f73c57c6b92d71a6c7c3",
"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/89xxx/CVE-2026-89802.json",
"https://nvd.nist.gov/vuln/detail/CVE-2026-89802",
"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git"
],
"provider_metadata": {
"cna_assigner": "Linux",
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/89xxx/CVE-2026-89802.json"
}
},
"related_cves": [
{
"value": "CVE-2026-89802",
"evidence": "/id"
}
],
"security_relevant": true,
"severity_evidence": null
},
"source_id": "core-osv",
"document_id": 497821,
"published_at": "2026-09-16T10:30:35.738+00:00"
}