Linux: smb: client: avoid leaking refcount in cifs_queue_oplock_break()
What fixes it
- 735a3a610136ae10f381d0909dff38e5b5c5f056LinuxCVE List
- 2ed2c29dd9593637cfa25ac1eb23241b20202778LinuxCVE List
- 9f2e63f1b2d5fc5b5423424902c091123e220e7eLinuxCVE List
- 3.17LinuxCVE List
- 4.10LinuxCVE List
- 4.15LinuxCVE List
A fixed version on one release line is not the upgrade target for every line. Check your exact version and any vendor backports.
Description
In the Linux kernel, the following vulnerability has been resolved:
smb: client: avoid leaking refcount in cifs_queue_oplock_break()
cifs_queue_oplock_break() unconditionally takes a reference on the target file before queueing cifs_oplock_break(). Only that work item decreases the reference counter again.
If another oplock break arrives while that work is still queued, queue_work() will return false and not queue this second work item. As a result, we will never reach the point to drop the file reference again and are leaking this reference. This can be triggered when interacting with a slow-responding server.
As a result, later unmount operations for this file system will fail with
BUG: Dentry ... still in use (1) [unmount of cifs cifs] VFS: Busy inodes after unmount of cifs (cifs) kernel BUG at fs/super.c:777!
Fix this by only incrementing the reference count if the work has been queued successfully. Taking it after queue_work() is safe because all three callers hold tcon->open_file_lock across the call and _cifsFileInfo_put() decrements under that same lock, so a worker that starts the handler in the window cannot drop the reference before it has been taken.
Text from CVE List
Affected versions 24
- Linuxaffected: b98749cac4a695f084a5ff076f4510b23e353ecd before 735a3a610136ae10f381d0909dff38e5b5c5f056CVE List
- Linuxaffected: b98749cac4a695f084a5ff076f4510b23e353ecd before de2a6bcff2659bea40c7485115b57f0ae189fc01CVE List
- Linuxaffected: b98749cac4a695f084a5ff076f4510b23e353ecd before af0193bbf1ac8c0f67f972998b0cc629d6116cf6CVE List
- Linuxaffected: b98749cac4a695f084a5ff076f4510b23e353ecd before 2ed2c29dd9593637cfa25ac1eb23241b20202778CVE List
- Linuxaffected: b98749cac4a695f084a5ff076f4510b23e353ecd before dfe7b750c7e069873a8a57a11c816831a235618aCVE List
- Linuxaffected: b98749cac4a695f084a5ff076f4510b23e353ecd before 9f2e63f1b2d5fc5b5423424902c091123e220e7eCVE List
- Linuxaffected: 2429fcf06d3cb962693868ab0a927c9038f12a2dCVE List
- Linuxaffected: 1ee4f2d7cdcd4508cc3cbe3b2622d7177b89da12CVE List
- Linuxaffected: 53fc31a4853e30d6e8f142b824f724da27ff3e40CVE List
- Linuxaffected: 8092ecc306d81186a64cda42411121f4d35aaff4CVE List
- Linuxaffected: ebac4d0adf68f8962bd82fcf483936edd6ec095bCVE List
- Linuxaffected: 3.16.72 before 3.17CVE List
- Linuxaffected: 4.9.171 before 4.10CVE List
- Linuxaffected: 4.14.114 before 4.15CVE List
- Linuxaffected: 4.19.37 before 4.20CVE List
- Linuxaffected: 5.0.10 before 5.1CVE List
- Linuxaffected: 5.1CVE List
- Linuxunaffected: all versions before 5.1CVE List
- Linuxunaffected: 6.1.189 through 6.1.*CVE List
- Linuxunaffected: 6.6.158 through 6.6.*CVE List
- Linuxunaffected: 6.12.111 through 6.12.*CVE List
- Linuxunaffected: 6.18.53 through 6.18.*CVE List
- Linuxunaffected: 7.2.7 through 7.2.*CVE List
- Linuxunaffected: 7.3CVE List
References 6
- git.kernel.org/stable/c/735a3a610136ae10f381d0909dff38e5b5c5f056Referencevia CVE List
- git.kernel.org/stable/c/de2a6bcff2659bea40c7485115b57f0ae189fc01Referencevia CVE List
- git.kernel.org/stable/c/af0193bbf1ac8c0f67f972998b0cc629d6116cf6Referencevia CVE List
- git.kernel.org/stable/c/2ed2c29dd9593637cfa25ac1eb23241b20202778Referencevia CVE List
- git.kernel.org/stable/c/dfe7b750c7e069873a8a57a11c816831a235618aReferencevia CVE List
- git.kernel.org/stable/c/9f2e63f1b2d5fc5b5423424902c091123e220e7eReferencevia CVE List