CVE-2024-26807

spi: cadence-qspi: fix pointer reference in runtime PM hooks

State
Published
Severity
7.8 High
Published
Apr 4, 2024
Updated
Aug 5, 2026
Reserved
Feb 19, 2024

Read the record on cve.org

Description

In the Linux kernel, the following vulnerability has been resolved:

Both cadence-quadspi ->runtime_suspend() and ->runtime_resume() implementations start with:

struct cqspi_st *cqspi = dev_get_drvdata(dev); struct spi_controller *host = dev_get_drvdata(dev);

This obviously cannot be correct, unless "struct cqspi_st" is the first member of " struct spi_controller", or the other way around, but it is not the case. "struct spi_controller" is allocated by devm_spi_alloc_host(), which allocates an extra amount of memory for private data, used to store "struct cqspi_st".

The ->probe() function of the cadence-quadspi driver then sets the device drvdata to store the address of the "struct cqspi_st" structure. Therefore:

struct cqspi_st *cqspi = dev_get_drvdata(dev);

is correct, but:

struct spi_controller *host = dev_get_drvdata(dev);

is not, as it makes "host" point not to a "struct spi_controller" but to the same "struct cqspi_st" structure as above.

This obviously leads to bad things (memory corruption, kernel crashes) directly during ->probe(), as ->probe() enables the device using PM runtime, leading the ->runtime_resume() hook being called, which in turns calls spi_controller_resume() with the wrong pointer.

This has at least been reported [0] to cause a kernel crash, but the exact behavior will depend on the memory contents.

[0] https://lore.kernel.org/all/20240226121803.5a7r5wkpbbowcxgx@dhruva/

This issue potentially affects all platforms that are currently using the cadence-quadspi driver.

Scores

CVSSScoreVectorSource
3.17.8 HighCVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:HLinux

Weaknesses

The record names no weakness.

Affected Products

ProductVersions
LinuxLinux
  • 79acf7fb856eade9c3d0cf00fd34a04bf5c43a1c to before 2c914aac9522f6e93822c18dff233d3e92399c81Affected
  • 2087e85bb66ee3652dafe732bb9b9b896229eafc to before 03f1573c9587029730ca68503f5062105b122f61Affected
  • 2087e85bb66ee3652dafe732bb9b9b896229eafc to before 34e1d5c4407c78de0e3473e1fbf8fb74dbe66d03Affected
  • 2087e85bb66ee3652dafe732bb9b9b896229eafc to before 32ce3bb57b6b402de2aec1012511e7ac4e7449dcAffected
  • e3f9fc9a4f1499cc9e1bad4482d377494e367b3dAffected
  • 6716203844bc8489af5e5564f0fa31e0c094a7ffAffected
  • b24f1ecc8fe2ceefc14af02edb1744c246d87bf7Affected
  • d453f25faf681799d636fe9d6899ad91c45aa11eAffected
  • 18cb554e9da81bc4eca653c17a0d65e8b5835c09Affected
  • 1368dbc0a432acf9fc0dcb23bfe52d32ca4c09abAffected
  • 6.1.28 to before 6.1.140Affected
  • 4.19.283 to before 4.20Affected
  • 5.4.243 to before 5.5Affected
  • 5.10.180 to before 5.11Affected
  • 5.15.111 to before 5.16Affected
  • 6.2.15 to before 6.3Affected
  • 6.3.2 to before 6.4Affected
LinuxLinux
  • 6.4Affected
  • before 6.4Not affected
  • 6.1.140 through 6.1.*Not affected
  • 6.6.21 through 6.6.*Not affected
  • 6.7.9 through 6.7.*Not affected
  • 6.8 and laterNot affected

References

Every record here comes from the CVE Program’s CVE List. © 1999–2026 The MITRE Corporation. CVE is a registered trademark of The MITRE Corporation. The records are reproduced under the CVE Program terms of use.