CVE-2023-52982

Source
https://nvd.nist.gov/vuln/detail/CVE-2023-52982
Import Source
https://storage.googleapis.com/osv-test-cve-osv-conversion/osv-output/CVE-2023-52982.json
JSON Data
https://api.test.osv.dev/v1/vulns/CVE-2023-52982
Downstream
Published
2025-03-27T16:43:20.735Z
Modified
2025-11-29T23:59:15.602359Z
Summary
fscache: Use wait_on_bit() to wait for the freeing of relinquished volume
Details

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

fscache: Use waitonbit() to wait for the freeing of relinquished volume

The freeing of relinquished volume will wake up the pending volume acquisition by using wakeupbit(), however it is mismatched with waitvarevent() used in fscachewaitonvolumecollision() and it will never wake up the waiter in the wait-queue because these two functions operate on different wait-queues.

According to the implementation in fscachewaitonvolumecollision(), if the wake-up of pending acquisition is delayed longer than 20 seconds (e.g., due to the delay of on-demand fd closing), the first waitvareventtimeout() will timeout and the following waitvar_event() will hang forever as shown below:

FS-Cache: Potential volume collision new=00000024 old=00000022 ...... INFO: task mount:1148 blocked for more than 122 seconds. Not tainted 6.1.0-rc6+ #1 task:mount state:D stack:0 pid:1148 ppid:1 Call Trace: <TASK> _schedule+0x2f6/0xb80 schedule+0x67/0xe0 fscachewaitonvolumecollision.cold+0x80/0x82 _fscacheacquirevolume+0x40d/0x4e0 erofsfscacheregistervolume+0x51/0xe0 [erofs] erofsfscacheregisterfs+0x19c/0x240 [erofs] erofsfcfillsuper+0x746/0xaf0 [erofs] vfsgetsuper+0x7d/0x100 gettreenodev+0x16/0x20 erofsfcgettree+0x20/0x30 [erofs] vfsgettree+0x24/0xb0 pathmount+0x2fa/0xa90 domount+0x7c/0xa0 _x64sysmount+0x8b/0xe0 dosyscall64+0x30/0x60 entrySYSCALL64after_hwframe+0x46/0xb0

Considering that wakeupbit() is more selective, so fix it by using waitonbit() instead of waitvarevent() to wait for the freeing of relinquished volume. In addition because waitqueueactive() is used in wakeupbit() and clearbit() doesn't imply any memory barrier, use clearandwakeupbit() to add the missing memory barrier between cursor->flags and waitqueue_active().

Database specific
{
    "cna_assigner": "Linux",
    "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2023/52xxx/CVE-2023-52982.json"
}
References

Affected packages

Git / git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

Affected ranges

Type
GIT
Repo
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
Events
Introduced
62ab63352350e881ae693a8236b35d7d0516c78b
Fixed
3be069f42a7b79d3149194f21cdf24bf23864cac
Fixed
8226e37d82f43657da34dd770e2b38f20242ada7

Affected versions

v5.*

v5.16
v5.16-rc5
v5.16-rc6
v5.16-rc7
v5.16-rc8
v5.17
v5.17-rc1
v5.17-rc2
v5.17-rc3
v5.17-rc4
v5.17-rc5
v5.17-rc6
v5.17-rc7
v5.17-rc8
v5.18
v5.18-rc1
v5.18-rc2
v5.18-rc3
v5.18-rc4
v5.18-rc5
v5.18-rc6
v5.18-rc7
v5.19
v5.19-rc1
v5.19-rc2
v5.19-rc3
v5.19-rc4
v5.19-rc5
v5.19-rc6
v5.19-rc7
v5.19-rc8

v6.*

v6.0
v6.0-rc1
v6.0-rc2
v6.0-rc3
v6.0-rc4
v6.0-rc5
v6.0-rc6
v6.0-rc7
v6.1
v6.1-rc1
v6.1-rc2
v6.1-rc3
v6.1-rc4
v6.1-rc5
v6.1-rc6
v6.1-rc7
v6.1-rc8
v6.1.1
v6.1.10
v6.1.2
v6.1.3
v6.1.4
v6.1.5
v6.1.6
v6.1.7
v6.1.8
v6.1.9
v6.2-rc1
v6.2-rc2
v6.2-rc3
v6.2-rc4
v6.2-rc5
v6.2-rc6

Linux / Kernel

Package

Name
Kernel

Affected ranges

Type
ECOSYSTEM
Events
Introduced
5.17.0
Fixed
6.1.11