{
  "affected": [
    {
      "ranges": [
        {
          "events": [
            {
              "introduced": "1c13bf9f2e3cd5a59ef988c6c5a49fe0f02bcdfc"
            },
            {
              "fixed": "549bd9868e9d77b07ea94870940d64342829c6ad"
            },
            {
              "fixed": "bf1f948691523282cc4905bc6cd325e0c0b49e6a"
            },
            {
              "fixed": "e270e5a0778e5bff852c8862ce9576ce70359393"
            }
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "type": "GIT"
        }
      ]
    },
    {
      "package": {
        "ecosystem": "Linux",
        "name": "Kernel"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "6.9.0"
            },
            {
              "fixed": "6.18.51"
            }
          ],
          "type": "ECOSYSTEM"
        },
        {
          "events": [
            {
              "introduced": "6.19.0"
            },
            {
              "fixed": "7.2.4"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    }
  ],
  "database_specific": {
    "cna_assigner": "Linux",
    "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/89xxx/CVE-2026-89660.json"
  },
  "details": "In the Linux kernel, the following vulnerability has been resolved:\n\nNFSD: Prevent client use-after-free during admin state revocation\n\nA stateid holds only a bare pointer to its nfs4_client; a stateid\nreference does not pin it.  The client survives only because\n__destroy_client() drains its stateids before free_client() runs.\n\nnfsd4_revoke_states() drops nn-\u003eclient_lock across revoke_one_stid(),\nwhich dereferences the client to revoke a stateid and read\nclp-\u003ecl_minorversion.  A teardown racing the dropped lock can free\nthe client first.\n\nPinning cl_rpc_users under client_lock blocks the DESTROY_CLIENTID and\nEXCHANGE_ID teardown, which refuses while cl_rpc_users is non-zero.\nforce_expire_client() ignores it: once its wait for cl_rpc_users to\nreach zero has passed, a later pin goes unnoticed.\n\nUnder client_lock, skip a client whose cl_time is already zero --\nforce_expire_client() clears it there before waiting -- otherwise pin\ncl_rpc_users before dropping the lock.  The walk then either sees the\nexpiry and skips, or pins in time for that wait to cover the revoke.",
  "id": "CVE-2026-89660",
  "modified": "2026-09-13T03:30:31.716390177Z",
  "published": "2026-09-11T19:45:48.341Z",
  "references": [
    {
      "type": "WEB",
      "url": "https://git.kernel.org/stable/c/549bd9868e9d77b07ea94870940d64342829c6ad"
    },
    {
      "type": "WEB",
      "url": "https://git.kernel.org/stable/c/bf1f948691523282cc4905bc6cd325e0c0b49e6a"
    },
    {
      "type": "WEB",
      "url": "https://git.kernel.org/stable/c/e270e5a0778e5bff852c8862ce9576ce70359393"
    },
    {
      "type": "ADVISORY",
      "url": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/89xxx/CVE-2026-89660.json"
    },
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-89660"
    },
    {
      "type": "PACKAGE",
      "url": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git"
    }
  ],
  "schema_version": "1.9.0",
  "summary": "NFSD: Prevent client use-after-free during admin state revocation"
}