]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
rpc: cleanup in virNetTLSContextNew
authorAdrian Brzezinski <adrian.brzezinski@eo.pl>
Mon, 15 Apr 2019 18:29:42 +0000 (20:29 +0200)
committerDaniel P. Berrangé <berrange@redhat.com>
Tue, 16 Apr 2019 10:22:50 +0000 (11:22 +0100)
Failed new gnutls context allocations in virNetTLSContextNew function
results in double free and segfault. Occasional memory leaks may also
occur.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Adrian Brzezinski <redhat@adrb.pl>
src/rpc/virnettlscontext.c

index 72e9ed9eaccf333424cab826b89a9b1e927e81c7..4adc409c0b4a8c57fb5216565c65077cfc57ba4f 100644 (file)
@@ -707,6 +707,13 @@ static virNetTLSContextPtr virNetTLSContextNew(const char *cacert,
 
     err = gnutls_certificate_allocate_credentials(&ctxt->x509cred);
     if (err) {
+        /* While gnutls_certificate_credentials_t will free any
+         * partially allocated credentials struct, it does not
+         * set the returned pointer back to NULL after it is
+         * freed in an error path.
+         */
+        ctxt->x509cred = NULL;
+
         virReportError(VIR_ERR_SYSTEM_ERROR,
                        _("Unable to allocate x509 credentials: %s"),
                        gnutls_strerror(err));
@@ -758,7 +765,9 @@ static virNetTLSContextPtr virNetTLSContextNew(const char *cacert,
  error:
     if (isServer)
         gnutls_dh_params_deinit(ctxt->dhParams);
-    gnutls_certificate_free_credentials(ctxt->x509cred);
+    if (ctxt->x509cred)
+        gnutls_certificate_free_credentials(ctxt->x509cred);
+    VIR_FREE(ctxt->priority);
     VIR_FREE(ctxt);
     return NULL;
 }