Merge "res_rtp_asterisk.c: Fix crash in RTCP DTLS operation." into 13

This commit is contained in:
Joshua Colp
2017-04-27 13:58:38 -05:00
committed by Gerrit Code Review

View File

@@ -1721,8 +1721,10 @@ static void ast_rtp_dtls_stop(struct ast_rtp_instance *instance)
dtls_srtp_stop_timeout_timer(instance, rtp, 1); dtls_srtp_stop_timeout_timer(instance, rtp, 1);
ao2_lock(instance); ao2_lock(instance);
if (rtp->rtcp->dtls.ssl && (rtp->rtcp->dtls.ssl != ssl)) { if (rtp->rtcp->dtls.ssl) {
SSL_free(rtp->rtcp->dtls.ssl); if (rtp->rtcp->dtls.ssl != ssl) {
SSL_free(rtp->rtcp->dtls.ssl);
}
rtp->rtcp->dtls.ssl = NULL; rtp->rtcp->dtls.ssl = NULL;
} }
} }
@@ -5423,14 +5425,14 @@ static void ast_rtp_prop_set(struct ast_rtp_instance *instance, enum ast_rtp_pro
* to activating RTP. It is not until RTP is activated that timers start for RTCP * to activating RTP. It is not until RTP is activated that timers start for RTCP
* transmission * transmission
*/ */
if (rtp->rtcp->s > -1) { if (rtp->rtcp->s > -1 && rtp->rtcp->s != rtp->s) {
close(rtp->rtcp->s); close(rtp->rtcp->s);
} }
rtp->rtcp->s = rtp->s; rtp->rtcp->s = rtp->s;
ast_rtp_instance_get_remote_address(instance, &addr); ast_rtp_instance_get_remote_address(instance, &addr);
ast_sockaddr_copy(&rtp->rtcp->them, &addr); ast_sockaddr_copy(&rtp->rtcp->them, &addr);
#ifdef HAVE_OPENSSL_SRTP #ifdef HAVE_OPENSSL_SRTP
if (rtp->rtcp->dtls.ssl) { if (rtp->rtcp->dtls.ssl && rtp->rtcp->dtls.ssl != rtp->dtls.ssl) {
SSL_free(rtp->rtcp->dtls.ssl); SSL_free(rtp->rtcp->dtls.ssl);
} }
rtp->rtcp->dtls.ssl = rtp->dtls.ssl; rtp->rtcp->dtls.ssl = rtp->dtls.ssl;
@@ -5438,7 +5440,6 @@ static void ast_rtp_prop_set(struct ast_rtp_instance *instance, enum ast_rtp_pro
} }
ast_debug(1, "Setup RTCP on RTP instance '%p'\n", instance); ast_debug(1, "Setup RTCP on RTP instance '%p'\n", instance);
return;
} else { } else {
if (rtp->rtcp) { if (rtp->rtcp) {
if (rtp->rtcp->schedid > -1) { if (rtp->rtcp->schedid > -1) {
@@ -5459,6 +5460,10 @@ static void ast_rtp_prop_set(struct ast_rtp_instance *instance, enum ast_rtp_pro
close(rtp->rtcp->s); close(rtp->rtcp->s);
} }
#ifdef HAVE_OPENSSL_SRTP #ifdef HAVE_OPENSSL_SRTP
ao2_unlock(instance);
dtls_srtp_stop_timeout_timer(instance, rtp, 1);
ao2_lock(instance);
if (rtp->rtcp->dtls.ssl && rtp->rtcp->dtls.ssl != rtp->dtls.ssl) { if (rtp->rtcp->dtls.ssl && rtp->rtcp->dtls.ssl != rtp->dtls.ssl) {
SSL_free(rtp->rtcp->dtls.ssl); SSL_free(rtp->rtcp->dtls.ssl);
} }
@@ -5467,11 +5472,8 @@ static void ast_rtp_prop_set(struct ast_rtp_instance *instance, enum ast_rtp_pro
ast_free(rtp->rtcp); ast_free(rtp->rtcp);
rtp->rtcp = NULL; rtp->rtcp = NULL;
} }
return;
} }
} }
return;
} }
/*! \pre instance is locked */ /*! \pre instance is locked */