diff options
author | Marcelo Tosatti <mtosatti@redhat.com> | 2010-10-19 09:00:34 -0200 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2010-10-20 16:15:04 -0500 |
commit | 0f53994f7ad4d34e0a0a4a10cb71b2f936e25e3f (patch) | |
tree | 62107d80da730a1594c59496c6d0a222994cbfad | |
parent | 577804958ae8ea40b630bc820b72c33f37b01e81 (diff) |
Fix memory leak in register save load due to xsave support
From: Avi Kivity <avi@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
-rw-r--r-- | target-i386/kvm.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/target-i386/kvm.c b/target-i386/kvm.c index 35daf907fd..512d533970 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -660,7 +660,7 @@ static int kvm_put_fpu(CPUState *env) static int kvm_put_xsave(CPUState *env) { #ifdef KVM_CAP_XSAVE - int i; + int i, r; struct kvm_xsave* xsave; uint16_t cwd, swd, twd, fop; @@ -685,7 +685,9 @@ static int kvm_put_xsave(CPUState *env) *(uint64_t *)&xsave->region[XSAVE_XSTATE_BV] = env->xstate_bv; memcpy(&xsave->region[XSAVE_YMMH_SPACE], env->ymmh_regs, sizeof env->ymmh_regs); - return kvm_vcpu_ioctl(env, KVM_SET_XSAVE, xsave); + r = kvm_vcpu_ioctl(env, KVM_SET_XSAVE, xsave); + qemu_free(xsave); + return r; #else return kvm_put_fpu(env); #endif @@ -850,8 +852,10 @@ static int kvm_get_xsave(CPUState *env) xsave = qemu_memalign(4096, sizeof(struct kvm_xsave)); ret = kvm_vcpu_ioctl(env, KVM_GET_XSAVE, xsave); - if (ret < 0) + if (ret < 0) { + qemu_free(xsave); return ret; + } cwd = (uint16_t)xsave->region[0]; swd = (uint16_t)(xsave->region[0] >> 16); @@ -870,6 +874,7 @@ static int kvm_get_xsave(CPUState *env) env->xstate_bv = *(uint64_t *)&xsave->region[XSAVE_XSTATE_BV]; memcpy(env->ymmh_regs, &xsave->region[XSAVE_YMMH_SPACE], sizeof env->ymmh_regs); + qemu_free(xsave); return 0; #else return kvm_get_fpu(env); |