KVM: Fix KVM_GET_MSR_INDEX_LIST

So far, KVM copied the emulated_msrs (only MSR_IA32_MISC_ENABLE) to a
wrong address in user space due to broken pointer arithmetic. This
caused subtle corruption up there (missing MSR_IA32_MISC_ENABLE had
probably no practical relevance). Moreover, the size check for the
user-provided kvm_msr_list forgot about emulated MSRs.

Cc: stable@kernel.org
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
Jan Kiszka 2009-07-02 21:45:47 +02:00 коммит произвёл Avi Kivity
Родитель 90bc1a658a
Коммит e125e7b694
1 изменённых файлов: 2 добавлений и 3 удалений

Просмотреть файл

@ -1079,14 +1079,13 @@ long kvm_arch_dev_ioctl(struct file *filp,
if (copy_to_user(user_msr_list, &msr_list, sizeof msr_list)) if (copy_to_user(user_msr_list, &msr_list, sizeof msr_list))
goto out; goto out;
r = -E2BIG; r = -E2BIG;
if (n < num_msrs_to_save) if (n < msr_list.nmsrs)
goto out; goto out;
r = -EFAULT; r = -EFAULT;
if (copy_to_user(user_msr_list->indices, &msrs_to_save, if (copy_to_user(user_msr_list->indices, &msrs_to_save,
num_msrs_to_save * sizeof(u32))) num_msrs_to_save * sizeof(u32)))
goto out; goto out;
if (copy_to_user(user_msr_list->indices if (copy_to_user(user_msr_list->indices + num_msrs_to_save,
+ num_msrs_to_save * sizeof(u32),
&emulated_msrs, &emulated_msrs,
ARRAY_SIZE(emulated_msrs) * sizeof(u32))) ARRAY_SIZE(emulated_msrs) * sizeof(u32)))
goto out; goto out;