Skip to content
Heist/ feed
Back to feed
Unrated

sched_ext: Fix use-after-free of a destroyed user DSQ by a deferred reenqueue

Type: advisorySources: Official CVE List

In the Linux kernel, the following vulnerability has been resolved: sched_ext: Fix use-after-free of a destroyed user DSQ by a deferred reenqueue A deferred reenqueue can read a freed user DSQ. The request stays on its CPU's deferred list until run_deferred() takes it, and the RCU callback that frees the DSQ assumes that the grace period has flushed it, so exit_dsq() checks the per-CPU node without the deferred list lock. A grace period waits for readers in flight, not for a pending run_deferred(). A run_deferred() which starts after the grace period began can detach the request right before the callback looks and then read the freed DSQ's id. Cancel the pending requests before the grace period instead. The irq work that frees the DSQ unlinks every CPU's request under the per-CPU deferred list lock, and schedule_dsq_reenq() ignores a new request under the same lock once the id is invalid. Only a run_deferred() that started before the grace period can hold a request, and it runs with IRQs disabled, so the grace period waits for it and nothing touches the DSQ after the callback.

Products
Linux
Affected versions
Not specified
Fixed versions
Not specified
CVEs
CVE-2026-99144
Confirmed fixed CVEs
Not specified
Updated in this feed
1 Nov 2026, 02:45 UTC · Revision 1

Source evidence

sched_ext: Fix use-after-free of a destroyed user DSQ by a deferred reenqueue

core-cve · Original source

Published 28 Oct 2026, 10:35 UTC

In the Linux kernel, the following vulnerability has been resolved: sched_ext: Fix use-after-free of a destroyed user DSQ by a deferred reenqueue A deferred reenqueue can read a freed user DSQ. The request stays on its CPU's deferred list until run_deferred() takes it, and the RCU callback that frees the DSQ assumes that the grace period has flushed it, so exit_dsq() checks the per-CPU node without the deferred list lock. A grace period waits for readers in flight, not for a pending run_deferred(). A run_deferred() which starts after the grace period began can detach the request right before the callback looks and then read the freed DSQ's id. Cancel the pending requests before the grace period instead. The irq work that frees the DSQ unlinks every CPU's request under the per-CPU deferred list lock, and schedule_dsq_reenq() ignores a new request under the same lock once the id is invalid. Only a run_deferred() that started before the grace period can hold a request, and it runs with IRQs disabled, so the grace period waits for it and nothing touches the DSQ after the callback.

cve:CVE-2026-99144

Linux

Fixed versions: Not specified

Linux

Fixed versions: Not specified

Complete source record
{
  "id": "1815dd4efdfee0429d59cdb175b7fc1d1637ae6e79d32163a2e2726d6df01f74",
  "url": "https://www.cve.org/CVERecord?id=CVE-2026-99144",
  "method": "structured",
  "payload": {
    "kind": "advisory",
    "title": "sched_ext: Fix use-after-free of a destroyed user DSQ by a deferred reenqueue",
    "summary": "In the Linux kernel, the following vulnerability has been resolved: sched_ext: Fix use-after-free of a destroyed user DSQ by a deferred reenqueue A deferred reenqueue can read a freed user DSQ. The request stays on its CPU's deferred list until run_deferred() takes it, and the RCU callback that frees the DSQ assumes that the grace period has flushed it, so exit_dsq() checks the per-CPU node without the deferred list lock. A grace period waits for readers in flight, not for a pending run_deferred(). A run_deferred() which starts after the grace period began can detach the request right before the callback looks and then read the freed DSQ's id. Cancel the pending requests before the grace period instead. The irq work that frees the DSQ unlinks every CPU's request under the per-CPU deferred list lock, and schedule_dsq_reenq() ignores a new request under the same lock once the id is invalid. Only a run_deferred() that started before the grace period can hold a request, and it runs with IRQs disabled, so the grace period waits for it and nothing touches the DSQ after the callback.",
    "evidence": "cve:CVE-2026-99144",
    "products": [
      {
        "name": {
          "value": "Linux",
          "evidence": "/containers/cna/affected/0/product"
        },
        "prerequisites": [],
        "fixed_versions": [],
        "affected_versions": []
      },
      {
        "name": {
          "value": "Linux",
          "evidence": "/containers/cna/affected/1/product"
        },
        "prerequisites": [],
        "fixed_versions": [],
        "affected_versions": []
      }
    ],
    "severity": "unknown",
    "structured": {
      "id": "CVE-2026-99144",
      "aliases": [
        "CVE-2026-99144"
      ],
      "metrics": [],
      "affected": [
        {
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "product": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "84b1a0ea0b7c23dec240783a592e480780efe459",
              "lessThan": "633f586329bfd9843bf8acf86c95353f4c16e22d",
              "versionType": "git"
            },
            {
              "status": "affected",
              "version": "84b1a0ea0b7c23dec240783a592e480780efe459",
              "lessThan": "069403dff337feb192bfc70fb28ddc8a171e20c1",
              "versionType": "git"
            }
          ],
          "programFiles": [
            "kernel/sched/ext/ext.c"
          ],
          "defaultStatus": "unaffected"
        },
        {
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "product": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "7.1"
            },
            {
              "status": "unaffected",
              "version": "0",
              "lessThan": "7.1",
              "versionType": "semver"
            },
            {
              "status": "unaffected",
              "version": "7.2.13",
              "versionType": "semver",
              "lessThanOrEqual": "7.2.*"
            },
            {
              "status": "unaffected",
              "version": "7.3",
              "versionType": "original_commit_for_fix",
              "lessThanOrEqual": "*"
            }
          ],
          "programFiles": [
            "kernel/sched/ext/ext.c"
          ],
          "defaultStatus": "affected"
        }
      ],
      "modified": "2026-10-28T10:35:00.602Z",
      "provider": "cve",
      "references": [
        "https://git.kernel.org/stable/c/633f586329bfd9843bf8acf86c95353f4c16e22d",
        "https://git.kernel.org/stable/c/069403dff337feb192bfc70fb28ddc8a171e20c1"
      ],
      "provider_metadata": {
        "cna": {
          "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
          "shortName": "Linux",
          "dateUpdated": "2026-10-28T10:35:00.602Z"
        }
      }
    },
    "related_cves": [
      {
        "value": "CVE-2026-99144",
        "evidence": "/cveMetadata/cveId"
      }
    ],
    "security_relevant": true,
    "severity_evidence": null
  },
  "source_id": "core-cve",
  "document_id": 425355,
  "published_at": "2026-10-28T10:35:00.602+00:00"
}