]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
KVM: x86/xen: Fix eventfd error handling in kvm_xen_eventfd_assign()
authorEiichi Tsukata <eiichi.tsukata@nutanix.com>
Fri, 28 Oct 2022 09:26:31 +0000 (09:26 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 26 Nov 2022 08:27:54 +0000 (09:27 +0100)
commit 7353633814f6e5b4899fb9ee1483709d6bb0e1cd upstream.

Should not call eventfd_ctx_put() in case of error.

Fixes: 2fd6df2f2b47 ("KVM: x86/xen: intercept EVTCHNOP_send from guests")
Reported-by: syzbot+6f0c896c5a9449a10ded@syzkaller.appspotmail.com
Signed-off-by: Eiichi Tsukata <eiichi.tsukata@nutanix.com>
Message-Id: <20221028092631.117438-1-eiichi.tsukata@nutanix.com>
[Introduce new goto target instead. - Paolo]
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/x86/kvm/xen.c

index cecf8299b187baaf251ed847f596db67690017b5..9a1950879fc44ea2b6fdd50c911760f717bcf80a 100644 (file)
@@ -1667,18 +1667,18 @@ static int kvm_xen_eventfd_assign(struct kvm *kvm,
        case EVTCHNSTAT_ipi:
                /* IPI  must map back to the same port# */
                if (data->u.evtchn.deliver.port.port != data->u.evtchn.send_port)
-                       goto out; /* -EINVAL */
+                       goto out_noeventfd; /* -EINVAL */
                break;
 
        case EVTCHNSTAT_interdomain:
                if (data->u.evtchn.deliver.port.port) {
                        if (data->u.evtchn.deliver.port.port >= max_evtchn_port(kvm))
-                               goto out; /* -EINVAL */
+                               goto out_noeventfd; /* -EINVAL */
                } else {
                        eventfd = eventfd_ctx_fdget(data->u.evtchn.deliver.eventfd.fd);
                        if (IS_ERR(eventfd)) {
                                ret = PTR_ERR(eventfd);
-                               goto out;
+                               goto out_noeventfd;
                        }
                }
                break;
@@ -1718,6 +1718,7 @@ static int kvm_xen_eventfd_assign(struct kvm *kvm,
 out:
        if (eventfd)
                eventfd_ctx_put(eventfd);
+out_noeventfd:
        kfree(evtchnfd);
        return ret;
 }