From 5f9a88fb74604fad410b9fbecd3be3f85b51c834 Mon Sep 17 00:00:00 2001 From: Mike Brady <4265913+mikebrady@users.noreply.github.com> Date: Tue, 31 Oct 2023 09:01:24 +0000 Subject: [PATCH] Use pthread_rwlock_wrlock instead of the incorrect use of pthread_rdlock_wrlock when tearing down a connection. --- rtsp.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rtsp.c b/rtsp.c index 26883471..e7903cc5 100644 --- a/rtsp.c +++ b/rtsp.c @@ -594,7 +594,8 @@ int get_play_lock(rtsp_conn_info *conn, int allow_session_interruption) { principal_conn->connection_number); } else if (allow_session_interruption != 0) { rtsp_conn_info *previous_principal_conn = principal_conn; - principal_conn = NULL; // no longer the principal conn + // important -- demote the principal conn before cancelling it + principal_conn = NULL; pthread_cancel(previous_principal_conn->thread); // the previous principal thread will block on the principal conn lock when exiting // so it's important not to wait for it here, e.g. don't put in a pthread_join here. @@ -2715,7 +2716,7 @@ void teardown_phase_two(rtsp_conn_info *conn) { } // only update these things if you're (still) the principal conn - pthread_rwlock_rdlock(&principal_conn_lock); // don't let the principal_conn be changed + pthread_rwlock_wrlock(&principal_conn_lock); // don't let the principal_conn be changed pthread_cleanup_push(rwlock_unlock, (void *)&principal_conn_lock); if (principal_conn == conn) { if (conn->airplay_stream_category == ptp_stream) { @@ -2781,7 +2782,7 @@ void teardown(rtsp_conn_info *conn) { } // only update these things if you're (still) the principal conn - pthread_rwlock_rdlock(&principal_conn_lock); // don't let the principal_conn be changed + pthread_rwlock_wrlock(&principal_conn_lock); // don't let the principal_conn be changed pthread_cleanup_push(rwlock_unlock, (void *)&principal_conn_lock); if (principal_conn == conn) { #ifdef CONFIG_AIRPLAY_2 -- 2.47.2