diff options
author | Gleb Smirnoff <glebius@FreeBSD.org> | 2023-07-12 16:16:40 +0000 |
---|---|---|
committer | Gleb Smirnoff <glebius@FreeBSD.org> | 2023-07-12 16:16:40 +0000 |
commit | 0d1ff2b04d27c21bf7f66a0b1aaade817ed271e5 (patch) | |
tree | 3be8dc9ddfcb9a2906289da434a32bd66cc5a89a /sys/amd64 | |
parent | 30f0328a322eb17e7b6bf31a8d587a071e9421ed (diff) | |
download | src-0d1ff2b04d27c21bf7f66a0b1aaade817ed271e5.tar.gz src-0d1ff2b04d27c21bf7f66a0b1aaade817ed271e5.zip |
vmm: don't leak locks exiting vmmdev_ioctl()
At least an error from vcpu_lock_all() at line 553 would leak
memseg lock. There might be other cases as well.
Reviewed by: corvink, markj
Differential Revision: https://reviews.freebsd.org/D40981
Diffstat (limited to 'sys/amd64')
-rw-r--r-- | sys/amd64/vmm/vmm_dev.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/sys/amd64/vmm/vmm_dev.c b/sys/amd64/vmm/vmm_dev.c index 74c751d7f116..dabcd4393a3f 100644 --- a/sys/amd64/vmm/vmm_dev.c +++ b/sys/amd64/vmm/vmm_dev.c @@ -1083,6 +1083,7 @@ vmmdev_ioctl(struct cdev *cdev, u_long cmd, caddr_t data, int fflag, break; } +done: if (vcpus_locked == SINGLE) vcpu_unlock_one(sc, vcpuid, vcpu); else if (vcpus_locked == ALL) @@ -1090,7 +1091,6 @@ vmmdev_ioctl(struct cdev *cdev, u_long cmd, caddr_t data, int fflag, if (memsegs_locked) vm_unlock_memsegs(sc->vm); -done: /* * Make sure that no handler returns a kernel-internal * error value to userspace. |