Linux: vhost-vdpa: don't install the eventfd_ctx_fdget() error in config_ctx
What fixes it
- 66e73fa18910b39fea0941dea5fe091122240855LinuxCVE List
- 4fde085eb839fbb39c25cbba5d2a091ded394877LinuxCVE List
- 59fc7c1c6b4d325194ca45352180340092d95098LinuxCVE List
- 388c678639a0cebfd936b3e56c64ac6a371efec2LinuxCVE List
- 65faf9eaa00e408e1406fbcf675c8c8d0e27ff2aLinuxCVE List
- 6b20b40f020bde236f6b8a08ff88d8653261ec2bLinuxCVE 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:
vhost-vdpa: don't install the eventfd_ctx_fdget() error in config_ctx
vhost_vdpa_set_config_call() swaps the eventfd_ctx_fdget() return value into v->config_ctx before checking it, so on failure the field briefly holds an ERR_PTR:
ctx = fd == VHOST_FILE_UNBIND ? NULL : eventfd_ctx_fdget(fd); swap(ctx, v->config_ctx);
if (!IS_ERR_OR_NULL(ctx)) eventfd_ctx_put(ctx);
if (IS_ERR(v->config_ctx)) { long ret = PTR_ERR(v->config_ctx);
v->config_ctx = NULL; return ret; }
Commit 0bde59c1723a ("vhost-vdpa: set v->config_ctx to NULL if eventfd_ctx_fdget() fails") added that clearing, and spelled out the invariant the rest of the file relies on: "we consider 'v->config_ctx' valid if it is not NULL". The window between the swap and the clearing still breaks it. vhost_vdpa_config_cb() only tests for NULL, so a config interrupt delivered inside the window hands the ERR_PTR to eventfd_signal().
Check the fd before installing it instead. That closes the window and matches how vhost_vring_ioctl() handles the same failure for the vq call fd.
It also stops a rejected fd from tearing down a config interrupt that was working: until now the swap replaced the live context and put it, so after an EBADF the device silently stopped delivering config interrupts until userspace installed a new fd.
Text from CVE List
Affected versions 18
- Linuxaffected: 776f395004d829bbbf18c159ed9beb517a208c71 before e260dc9fbfdae0978e7a8698f977fbb463a657beCVE List
- Linuxaffected: 776f395004d829bbbf18c159ed9beb517a208c71 before 66e73fa18910b39fea0941dea5fe091122240855CVE List
- Linuxaffected: 776f395004d829bbbf18c159ed9beb517a208c71 before 4fde085eb839fbb39c25cbba5d2a091ded394877CVE List
- Linuxaffected: 776f395004d829bbbf18c159ed9beb517a208c71 before 59fc7c1c6b4d325194ca45352180340092d95098CVE List
- Linuxaffected: 776f395004d829bbbf18c159ed9beb517a208c71 before 388c678639a0cebfd936b3e56c64ac6a371efec2CVE List
- Linuxaffected: 776f395004d829bbbf18c159ed9beb517a208c71 before 65faf9eaa00e408e1406fbcf675c8c8d0e27ff2aCVE List
- Linuxaffected: 776f395004d829bbbf18c159ed9beb517a208c71 before 6b20b40f020bde236f6b8a08ff88d8653261ec2bCVE List
- Linuxaffected: 776f395004d829bbbf18c159ed9beb517a208c71 before e74a9fa50749b9940b4fb13199652325e08d3c4aCVE List
- Linuxaffected: 5.8CVE List
- Linuxunaffected: all versions before 5.8CVE List
- Linuxunaffected: 5.10.271 through 5.10.*CVE List
- Linuxunaffected: 5.15.222 through 5.15.*CVE 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 8
- git.kernel.org/stable/c/e260dc9fbfdae0978e7a8698f977fbb463a657beReferencevia CVE List
- git.kernel.org/stable/c/66e73fa18910b39fea0941dea5fe091122240855Referencevia CVE List
- git.kernel.org/stable/c/4fde085eb839fbb39c25cbba5d2a091ded394877Referencevia CVE List
- git.kernel.org/stable/c/59fc7c1c6b4d325194ca45352180340092d95098Referencevia CVE List
- git.kernel.org/stable/c/388c678639a0cebfd936b3e56c64ac6a371efec2Referencevia CVE List
- git.kernel.org/stable/c/65faf9eaa00e408e1406fbcf675c8c8d0e27ff2aReferencevia CVE List
- git.kernel.org/stable/c/6b20b40f020bde236f6b8a08ff88d8653261ec2bReferencevia CVE List
- git.kernel.org/stable/c/e74a9fa50749b9940b4fb13199652325e08d3c4aReferencevia CVE List