]> git.sesse.net Git - vlc/commitdiff
gnutls: fix memory leaks
authorRémi Denis-Courmont <remi@remlab.net>
Sat, 23 Aug 2014 14:31:17 +0000 (17:31 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Sat, 23 Aug 2014 14:31:17 +0000 (17:31 +0300)
modules/misc/gnutls.c

index a09af8ad8d2019846941bdd659cc6984f8829864..0af44267f860d27e7ecaffad931fc33b114054e6 100644 (file)
@@ -499,7 +499,10 @@ static int OpenServer (vlc_tls_creds_t *crd, const char *cert, const char *key)
 
     vlc_tls_creds_sys_t *sys = malloc (sizeof (*sys));
     if (unlikely(sys == NULL))
-        goto error;
+    {
+        gnutls_Deinit ();
+        return VLC_ENOMEM;
+    }
 
     /* Sets server's credentials */
     val = gnutls_certificate_allocate_credentials (&sys->x509_cred);
@@ -507,7 +510,9 @@ static int OpenServer (vlc_tls_creds_t *crd, const char *cert, const char *key)
     {
         msg_Err (crd, "cannot allocate credentials: %s",
                  gnutls_strerror (val));
-        goto error;
+        free (sys);
+        gnutls_Deinit ();
+        return VLC_ENOMEM;
     }
 
     block_t *certblock = block_FilePath (cert);
@@ -515,7 +520,7 @@ static int OpenServer (vlc_tls_creds_t *crd, const char *cert, const char *key)
     {
         msg_Err (crd, "cannot read certificate chain from %s: %s", cert,
                  vlc_strerror_c(errno));
-        return VLC_EGENERIC;
+        goto error;
     }
 
     block_t *keyblock = block_FilePath (key);
@@ -524,7 +529,7 @@ static int OpenServer (vlc_tls_creds_t *crd, const char *cert, const char *key)
         msg_Err (crd, "cannot read private key from %s: %s", key,
                  vlc_strerror_c(errno));
         block_Release (certblock);
-        return VLC_EGENERIC;
+        goto error;
     }
 
     gnutls_datum_t pub = {
@@ -577,6 +582,7 @@ static int OpenServer (vlc_tls_creds_t *crd, const char *cert, const char *key)
     return VLC_SUCCESS;
 
 error:
+    gnutls_certificate_free_credentials (sys->x509_cred);
     free (sys);
     gnutls_Deinit ();
     return VLC_EGENERIC;