{
  "schema_version": "1.6.1",
  "id": "RPI-CVE-2026-89856",
  "modified": "2026-10-09T11:39:44Z",
  "upstream": [
    "CVE-2026-89856"
  ],
  "published": "2026-09-16T10:32:03Z",
  "summary": "scsi: qla2xxx: Clamp MSI-X derived queue counts to avoid truncation",
  "details": "In the Linux kernel, the following vulnerability has been resolved:\n\nscsi: qla2xxx: Clamp MSI-X derived queue counts to avoid truncation\n\nha->msix_count is u16, but ha->max_req_queues, ha->max_rsp_queues and\nha->max_qpairs are u8. Deriving the queue count as\n\"ha->max_req_queues = ha->msix_count - 1\" therefore truncates: a board\n(or a misconfigured/malicious hot-plugged device) advertising 257 MSI-X\nvectors yields msix_count - 1 == 256, which truncates to 0. An MSI-X\ncount of 1 zeroes it as well, and in target mode the subsequent\n\"ha->max_req_queues--\" then underflows 0 to 255.\n\nWhen the count is 0, qla2x00_alloc_queues() calls\nkzalloc_objs(struct req_que *, 0), which returns ZERO_SIZE_PTR. That is\nnot NULL, so the allocation check passes and the following\n\"ha->req_q_map[0] = req\" dereferences ZERO_SIZE_PTR, corrupting memory\nor crashing the kernel.\n\nAdd qla_calc_queue_count() to clamp the derived value into\n[1, QLA_MAX_QUEUES - 1] so it always fits in u8 and is never zero, and\nuse it at all three derivation sites (qla25xx_iospace_config(),\nqla83xx_iospace_config() and qla24xx_enable_msix()). Also guard the\ntarget-mode decrement so it cannot reintroduce a zero (which would in\nturn underflow max_qpairs).",
  "severity": [
    {
      "type": "CVSS_V3",
      "score": "CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
    }
  ],
  "affected": [
    {
      "package": {
        "ecosystem": "Raspberry Pi OS:12",
        "name": "linux"
      },
      "versions": [
        "1:6.1.47-1+rpt4"
      ],
      "ecosystem_specific": {
        "binaries": [
          {
            "binary_name": "linux-image-6.1.0-rpi3-rpi-2712",
            "binary_version": "1:6.1.47-1+rpt4"
          },
          {
            "binary_name": "linux-image-6.1.0-rpi3-rpi-v6",
            "binary_version": "1:6.1.47-1+rpt4"
          },
          {
            "binary_name": "linux-image-6.1.0-rpi3-rpi-v7",
            "binary_version": "1:6.1.47-1+rpt4"
          },
          {
            "binary_name": "linux-image-6.1.0-rpi3-rpi-v7l",
            "binary_version": "1:6.1.47-1+rpt4"
          },
          {
            "binary_name": "linux-image-6.1.0-rpi3-rpi-v8",
            "binary_version": "1:6.1.47-1+rpt4"
          }
        ]
      },
      "database_specific": {
        "per_version": {
          "1:6.1.47-1+rpt4": {
            "linux_commit": "655fc658a15ae7a6f37103754adb39ba52a9a14e",
            "upstream_version": "6.1.47",
            "assessment": "commit ancestry (strak rule)",
            "upstream_fixed": "6.1.188",
            "compiled_filter": false
          }
        }
      }
    }
  ],
  "references": [
    {
      "type": "ADVISORY",
      "url": "https://www.cve.org/CVERecord?id=CVE-2026-89856"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/cf623d32761b00f221a9cfded3303d56e84b429d"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/9eeddbeaa896f39d943644b16d83a6ad0ceab255"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/802068b9b683b8008fcccbf6e9ad133e597ec87c"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/e80adfeac61b4d5db7ffe0f5af43999c33a4145e"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/2efe50b2da829909023de4a2eb87badb7cfa53cc"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/7a448f5ed0b283dbde4e9183dd1e98c221432dab"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/33c77254e6e91f37c72c7fad4051777452b10de8"
    },
    {
      "type": "FIX",
      "url": "https://git.kernel.org/stable/c/ebfd35c64433821bd5619a6d07ccc2df8b5b1de3"
    }
  ],
  "database_specific": {
    "source": "https://git.kernel.org/pub/scm/linux/security/vulns.git",
    "upstream_modified": "2026-09-16T14:40:32Z",
    "severity": {
      "source": "kernel CNA",
      "cvss_v3_score": 8.4,
      "cvss_v3_severity": "High",
      "scenario": "AV:L - The flaw is in qla2xxx PCI probe (qla2x00_probe_one \u2192 iospace_config/qla24xx_enable_msix \u2192 qla2x00_alloc_queues). QLogic FC HBAs are local PCI devices in storage servers, blades, and SAN hosts; a board or compromised adapter advertising a truncating MSI-X count triggers it at bind. Not a network/FC-frame path; local PCI is higher severity than physical hotplug.\nAC:L - The attacker-controlled PCI MSI-X vector count (config word or pci_msix_vec_count) is stored in u8 max_req_queues. Advertising 1 or 257+ vectors deterministically truncates that count to 0 and underflows max_qpairs to 255; no race or uninfluenced layout is required.\nPR:N - Probe reads the MSI-X count from the adapter and autoloads qla2xxx on matching QLogic PCI IDs with no capability or credential check. A malicious, misconfigured, or firmware-compromised HBA needs no Linux account or init-namespace privilege.\nUI:N - qla2x00_probe_one runs automatically on PCI enumeration at boot or hotplug bind; no victim must mount a filesystem, open a device node, or otherwise interact.\nS:U - The ZERO_SIZE_PTR store and any resulting oops or privilege escalation remain in the host kernel qla2xxx probe path, the same security authority. This is not a VM escape or IOMMU/DMA boundary bypass.\nC:H - qla2x00_alloc_queues() writes request/response queue pointers through ZERO_SIZE_PTR and can desynchronize u8 queue maps versus MSI-X arrays (0 versus underflowed 255 qpairs). That kernel memory corruption can be leveraged for information disclosure.\nI:H - The wild write of kernel pointers through ZERO_SIZE_PTR, plus the u8 underflow that sizes queue-pair maps to 255 while the request map is a zero-size sentinel, is an out-of-bounds write exploitable for corruption and control-flow hijacking.\nA:H - Dereferencing ZERO_SIZE_PTR is defined to take a distinct access fault, so a malicious MSI-X count causes a kernel oops or panic during probe."
    }
  }
}
