Blame SOURCES/kvm-target-i386-sev-fix-memory-leaks.patch

1bdc94
From db0396e4d2663f41aaea944eaaf29141b20f5e1f Mon Sep 17 00:00:00 2001
1bdc94
From: Markus Armbruster <armbru@redhat.com>
1bdc94
Date: Fri, 31 Aug 2018 14:24:58 +0200
1bdc94
Subject: [PATCH 07/29] target/i386: sev: fix memory leaks
1bdc94
1bdc94
RH-Author: Markus Armbruster <armbru@redhat.com>
1bdc94
Message-id: <20180831142459.18567-2-armbru@redhat.com>
1bdc94
Patchwork-id: 81984
1bdc94
O-Subject: [RHEL-7.6 qemu-kvm-rhev PATCH 1/2] target/i386: sev: fix memory leaks
1bdc94
Bugzilla: 1624390
1bdc94
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
1bdc94
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
1bdc94
RH-Acked-by: Auger Eric <eric.auger@redhat.com>
1bdc94
1bdc94
From: Paolo Bonzini <pbonzini@redhat.com>
1bdc94
1bdc94
Reported by Coverity.
1bdc94
1bdc94
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
1bdc94
(cherry picked from commit bf3175b49952628f96d72d1247d8bb3aa5c2466c)
1bdc94
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
1bdc94
---
1bdc94
 target/i386/sev.c | 32 +++++++++++++++++---------------
1bdc94
 1 file changed, 17 insertions(+), 15 deletions(-)
1bdc94
1bdc94
diff --git a/target/i386/sev.c b/target/i386/sev.c
1bdc94
index c011671..2395171 100644
1bdc94
--- a/target/i386/sev.c
1bdc94
+++ b/target/i386/sev.c
1bdc94
@@ -430,7 +430,8 @@ static int
1bdc94
 sev_get_pdh_info(int fd, guchar **pdh, size_t *pdh_len, guchar **cert_chain,
1bdc94
                  size_t *cert_chain_len)
1bdc94
 {
1bdc94
-    guchar *pdh_data, *cert_chain_data;
1bdc94
+    guchar *pdh_data = NULL;
1bdc94
+    guchar *cert_chain_data = NULL;
1bdc94
     struct sev_user_data_pdh_cert_export export = {};
1bdc94
     int err, r;
1bdc94
 
1bdc94
@@ -471,8 +472,9 @@ e_free:
1bdc94
 SevCapability *
1bdc94
 sev_get_capabilities(void)
1bdc94
 {
1bdc94
-    SevCapability *cap;
1bdc94
-    guchar *pdh_data, *cert_chain_data;
1bdc94
+    SevCapability *cap = NULL;
1bdc94
+    guchar *pdh_data = NULL;
1bdc94
+    guchar *cert_chain_data = NULL;
1bdc94
     size_t pdh_len = 0, cert_chain_len = 0;
1bdc94
     uint32_t ebx;
1bdc94
     int fd;
1bdc94
@@ -486,7 +488,7 @@ sev_get_capabilities(void)
1bdc94
 
1bdc94
     if (sev_get_pdh_info(fd, &pdh_data, &pdh_len,
1bdc94
                          &cert_chain_data, &cert_chain_len)) {
1bdc94
-        return NULL;
1bdc94
+        goto out;
1bdc94
     }
1bdc94
 
1bdc94
     cap = g_new0(SevCapability, 1);
1bdc94
@@ -502,9 +504,9 @@ sev_get_capabilities(void)
1bdc94
      */
1bdc94
     cap->reduced_phys_bits = 1;
1bdc94
 
1bdc94
+out:
1bdc94
     g_free(pdh_data);
1bdc94
     g_free(cert_chain_data);
1bdc94
-
1bdc94
     close(fd);
1bdc94
     return cap;
1bdc94
 }
1bdc94
@@ -530,7 +532,7 @@ sev_launch_start(SEVState *s)
1bdc94
 {
1bdc94
     gsize sz;
1bdc94
     int ret = 1;
1bdc94
-    int fw_error;
1bdc94
+    int fw_error, rc;
1bdc94
     QSevGuestInfo *sev = s->sev_info;
1bdc94
     struct kvm_sev_launch_start *start;
1bdc94
     guchar *session = NULL, *dh_cert = NULL;
1bdc94
@@ -543,7 +545,7 @@ sev_launch_start(SEVState *s)
1bdc94
                                             &error_abort);
1bdc94
     if (sev->session_file) {
1bdc94
         if (sev_read_file_base64(sev->session_file, &session, &sz) < 0) {
1bdc94
-            return 1;
1bdc94
+            goto out;
1bdc94
         }
1bdc94
         start->session_uaddr = (unsigned long)session;
1bdc94
         start->session_len = sz;
1bdc94
@@ -551,18 +553,18 @@ sev_launch_start(SEVState *s)
1bdc94
 
1bdc94
     if (sev->dh_cert_file) {
1bdc94
         if (sev_read_file_base64(sev->dh_cert_file, &dh_cert, &sz) < 0) {
1bdc94
-            return 1;
1bdc94
+            goto out;
1bdc94
         }
1bdc94
         start->dh_uaddr = (unsigned long)dh_cert;
1bdc94
         start->dh_len = sz;
1bdc94
     }
1bdc94
 
1bdc94
     trace_kvm_sev_launch_start(start->policy, session, dh_cert);
1bdc94
-    ret = sev_ioctl(s->sev_fd, KVM_SEV_LAUNCH_START, start, &fw_error);
1bdc94
-    if (ret < 0) {
1bdc94
+    rc = sev_ioctl(s->sev_fd, KVM_SEV_LAUNCH_START, start, &fw_error);
1bdc94
+    if (rc < 0) {
1bdc94
         error_report("%s: LAUNCH_START ret=%d fw_error=%d '%s'",
1bdc94
                 __func__, ret, fw_error, fw_error_to_str(fw_error));
1bdc94
-        return 1;
1bdc94
+        goto out;
1bdc94
     }
1bdc94
 
1bdc94
     object_property_set_int(OBJECT(sev), start->handle, "handle",
1bdc94
@@ -570,12 +572,13 @@ sev_launch_start(SEVState *s)
1bdc94
     sev_set_guest_state(SEV_STATE_LAUNCH_UPDATE);
1bdc94
     s->handle = start->handle;
1bdc94
     s->policy = start->policy;
1bdc94
+    ret = 0;
1bdc94
 
1bdc94
+out:
1bdc94
     g_free(start);
1bdc94
     g_free(session);
1bdc94
     g_free(dh_cert);
1bdc94
-
1bdc94
-    return 0;
1bdc94
+    return ret;
1bdc94
 }
1bdc94
 
1bdc94
 static int
1bdc94
@@ -712,7 +715,7 @@ sev_guest_init(const char *id)
1bdc94
     uint32_t host_cbitpos;
1bdc94
     struct sev_user_data_status status = {};
1bdc94
 
1bdc94
-    s = g_new0(SEVState, 1);
1bdc94
+    sev_state = s = g_new0(SEVState, 1);
1bdc94
     s->sev_info = lookup_sev_guest_info(id);
1bdc94
     if (!s->sev_info) {
1bdc94
         error_report("%s: '%s' is not a valid '%s' object",
1bdc94
@@ -720,7 +723,6 @@ sev_guest_init(const char *id)
1bdc94
         goto err;
1bdc94
     }
1bdc94
 
1bdc94
-    sev_state = s;
1bdc94
     s->state = SEV_STATE_UNINIT;
1bdc94
 
1bdc94
     host_cpuid(0x8000001F, 0, NULL, &ebx, NULL, NULL);
1bdc94
-- 
1bdc94
1.8.3.1
1bdc94