res_rtp_asterisk: fix memory leak in dtls
authorTorrey Searle <torrey@voxbone.com>
Tue, 21 Jun 2016 11:52:20 +0000 (13:52 +0200)
committerTorrey Searle <tsearle@gmail.com>
Wed, 22 Jun 2016 07:29:21 +0000 (02:29 -0500)
ensure that cert bios get freed after creating the fingerprint

ASTERISK-26129 #close

Change-Id: I44d23aea07dce80176ca1ff877c5ace9452ef451

res/res_rtp_asterisk.c

index 1bf1694..119e45d 100644 (file)
@@ -1398,7 +1398,7 @@ static int ast_rtp_dtls_set_configuration(struct ast_rtp_instance *instance, con
        if (!ast_strlen_zero(dtls_cfg->certfile)) {
                char *private = ast_strlen_zero(dtls_cfg->pvtfile) ? dtls_cfg->certfile : dtls_cfg->pvtfile;
                BIO *certbio;
-               X509 *cert;
+               X509 *cert = NULL;
                const EVP_MD *type;
                unsigned int size, i;
                unsigned char fingerprint[EVP_MAX_MD_SIZE];
@@ -1440,6 +1440,9 @@ static int ast_rtp_dtls_set_configuration(struct ast_rtp_instance *instance, con
                        ast_log(LOG_ERROR, "Could not produce fingerprint from certificate '%s' for RTP instance '%p'\n",
                                dtls_cfg->certfile, instance);
                        BIO_free_all(certbio);
+                       if (cert) {
+                               X509_free(cert);
+                       }
                        return -1;
                }
 
@@ -1451,6 +1454,7 @@ static int ast_rtp_dtls_set_configuration(struct ast_rtp_instance *instance, con
                *(local_fingerprint-1) = 0;
 
                BIO_free_all(certbio);
+               X509_free(cert);
        }
 
        if (!ast_strlen_zero(dtls_cfg->cipher)) {