Message ID | 1578128209-12891-1-git-send-email-linmiaohe@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] KVM: SVM: Fix potential memory leak in svm_cpu_init() | expand |
On 04/01/20 09:56, linmiaohe wrote: > From: Miaohe Lin <linmiaohe@huawei.com> > > When kmalloc memory for sd->sev_vmcbs failed, we forget to free the page > held by sd->save_area. Also get rid of the var r as '-ENOMEM' is actually > the only possible outcome here. > > Reviewed-by: Liran Alon <liran.alon@oracle.com> > Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com> > Signed-off-by: Miaohe Lin <linmiaohe@huawei.com> > --- > -v2: > drop var r as suggested by Vitaly > --- > arch/x86/kvm/svm.c | 13 ++++++------- > 1 file changed, 6 insertions(+), 7 deletions(-) > > diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c > index 8f1b715dfde8..5f9d6547e0e7 100644 > --- a/arch/x86/kvm/svm.c > +++ b/arch/x86/kvm/svm.c > @@ -1003,33 +1003,32 @@ static void svm_cpu_uninit(int cpu) > static int svm_cpu_init(int cpu) > { > struct svm_cpu_data *sd; > - int r; > > sd = kzalloc(sizeof(struct svm_cpu_data), GFP_KERNEL); > if (!sd) > return -ENOMEM; > sd->cpu = cpu; > - r = -ENOMEM; > sd->save_area = alloc_page(GFP_KERNEL); > if (!sd->save_area) > - goto err_1; > + goto free_cpu_data; > > if (svm_sev_enabled()) { > - r = -ENOMEM; > sd->sev_vmcbs = kmalloc_array(max_sev_asid + 1, > sizeof(void *), > GFP_KERNEL); > if (!sd->sev_vmcbs) > - goto err_1; > + goto free_save_area; > } > > per_cpu(svm_data, cpu) = sd; > > return 0; > > -err_1: > +free_save_area: > + __free_page(sd->save_area); > +free_cpu_data: > kfree(sd); > - return r; > + return -ENOMEM; > > } > > Queued, thanks. Paolo
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 8f1b715dfde8..5f9d6547e0e7 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -1003,33 +1003,32 @@ static void svm_cpu_uninit(int cpu) static int svm_cpu_init(int cpu) { struct svm_cpu_data *sd; - int r; sd = kzalloc(sizeof(struct svm_cpu_data), GFP_KERNEL); if (!sd) return -ENOMEM; sd->cpu = cpu; - r = -ENOMEM; sd->save_area = alloc_page(GFP_KERNEL); if (!sd->save_area) - goto err_1; + goto free_cpu_data; if (svm_sev_enabled()) { - r = -ENOMEM; sd->sev_vmcbs = kmalloc_array(max_sev_asid + 1, sizeof(void *), GFP_KERNEL); if (!sd->sev_vmcbs) - goto err_1; + goto free_save_area; } per_cpu(svm_data, cpu) = sd; return 0; -err_1: +free_save_area: + __free_page(sd->save_area); +free_cpu_data: kfree(sd); - return r; + return -ENOMEM; }