mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-10 06:49:40 +00:00
Merge "res_rtp_asterisk.c: Fix crash in RTCP DTLS operation." into 13
This commit is contained in:
@@ -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 */
|
||||||
|
Reference in New Issue
Block a user