From: Adrian Brzezinski Date: Mon, 15 Apr 2019 18:29:42 +0000 (+0200) Subject: rpc: cleanup in virNetTLSContextNew X-Git-Tag: v5.3.0-rc1~79 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dc4e9bfb849fc25a5163c64427a7d30b228ed66e;p=thirdparty%2Flibvirt.git rpc: cleanup in virNetTLSContextNew 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é Signed-off-by: Adrian Brzezinski --- diff --git a/src/rpc/virnettlscontext.c b/src/rpc/virnettlscontext.c index 72e9ed9eac..4adc409c0b 100644 --- a/src/rpc/virnettlscontext.c +++ b/src/rpc/virnettlscontext.c @@ -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; }