diff options
author | Yann Droneaud <ydroneaud@opteya.com> | 2013-08-24 16:14:07 -0400 |
---|---|---|
committer | Gleb Natapov <gleb@redhat.com> | 2013-08-26 06:19:35 -0400 |
commit | 24009b0549de563006705b9af8694fc8fc9a5aa1 (patch) | |
tree | 57ff65347231974fc0621919529022464a7ed6e1 /virt | |
parent | 9bc6cbebfe006bcf0f83b10221cd4b893a130d10 (diff) |
kvm: use anon_inode_getfd() with O_CLOEXEC flag
KVM uses anon_inode_get() to allocate file descriptors as part
of some of its ioctls. But those ioctls are lacking a flag argument
allowing userspace to choose options for the newly opened file descriptor.
In such case it's advised to use O_CLOEXEC by default so that
userspace is allowed to choose, without race, if the file descriptor
is going to be inherited across exec().
This patch set O_CLOEXEC flag on all file descriptors created
with anon_inode_getfd() to not leak file descriptors across exec().
Signed-off-by: Yann Droneaud <ydroneaud@opteya.com>
Link: http://lkml.kernel.org/r/cover.1377372576.git.ydroneaud@opteya.com
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Gleb Natapov <gleb@redhat.com>
Diffstat (limited to 'virt')
-rw-r--r-- | virt/kvm/kvm_main.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index c6c8bbea1748..d2836788561e 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -1896,7 +1896,7 @@ static struct file_operations kvm_vcpu_fops = { | |||
1896 | */ | 1896 | */ |
1897 | static int create_vcpu_fd(struct kvm_vcpu *vcpu) | 1897 | static int create_vcpu_fd(struct kvm_vcpu *vcpu) |
1898 | { | 1898 | { |
1899 | return anon_inode_getfd("kvm-vcpu", &kvm_vcpu_fops, vcpu, O_RDWR); | 1899 | return anon_inode_getfd("kvm-vcpu", &kvm_vcpu_fops, vcpu, O_RDWR | O_CLOEXEC); |
1900 | } | 1900 | } |
1901 | 1901 | ||
1902 | /* | 1902 | /* |
@@ -2305,7 +2305,7 @@ static int kvm_ioctl_create_device(struct kvm *kvm, | |||
2305 | return ret; | 2305 | return ret; |
2306 | } | 2306 | } |
2307 | 2307 | ||
2308 | ret = anon_inode_getfd(ops->name, &kvm_device_fops, dev, O_RDWR); | 2308 | ret = anon_inode_getfd(ops->name, &kvm_device_fops, dev, O_RDWR | O_CLOEXEC); |
2309 | if (ret < 0) { | 2309 | if (ret < 0) { |
2310 | ops->destroy(dev); | 2310 | ops->destroy(dev); |
2311 | return ret; | 2311 | return ret; |
@@ -2589,7 +2589,7 @@ static int kvm_dev_ioctl_create_vm(unsigned long type) | |||
2589 | return r; | 2589 | return r; |
2590 | } | 2590 | } |
2591 | #endif | 2591 | #endif |
2592 | r = anon_inode_getfd("kvm-vm", &kvm_vm_fops, kvm, O_RDWR); | 2592 | r = anon_inode_getfd("kvm-vm", &kvm_vm_fops, kvm, O_RDWR | O_CLOEXEC); |
2593 | if (r < 0) | 2593 | if (r < 0) |
2594 | kvm_put_kvm(kvm); | 2594 | kvm_put_kvm(kvm); |
2595 | 2595 | ||