From 35e935f5e293417979949efed55261a7f82f8d5d Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Thu, 10 Feb 2022 14:58:38 -0500 Subject: [PATCH] TT#156900 add extra check for closed socket We must now hold the master lock for reads from the socket as the socket may get closed after the poller has already fired an event for it. Change-Id: I1ab4b38f09988e8569a70c449de17c208ef2aa96 (cherry picked from commit 4eecec9a1eb8e6c6a7f17f94c3eb7acd49d858b3) --- daemon/media_socket.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/daemon/media_socket.c b/daemon/media_socket.c index 9c4b7b0fd..0e0dc985c 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -2571,6 +2571,8 @@ static void stream_fd_readable(int fd, void *p, uintptr_t u) { if (sfd->socket.fd != fd) return; + ca = sfd->call ? : NULL; + log_info_stream_fd(sfd); int strikes = g_atomic_int_get(&sfd->error_strikes); @@ -2596,8 +2598,17 @@ static void stream_fd_readable(int fd, void *p, uintptr_t u) { ZERO(phc); phc.mp.sfd = sfd; + if (ca) { + rwlock_lock_r(&ca->master_lock); + if (sfd->socket.fd != fd) { + rwlock_unlock_r(&ca->master_lock); + goto done; + } + } ret = socket_recvfrom_ts(&sfd->socket, buf + RTP_BUFFER_HEAD_ROOM, MAX_RTP_PACKET_SIZE, &phc.mp.fsin, &phc.mp.tv); + if (ca) + rwlock_unlock_r(&ca->master_lock); if (ret < 0) { if (errno == EINTR) @@ -2631,7 +2642,6 @@ static void stream_fd_readable(int fd, void *p, uintptr_t u) { g_atomic_int_compare_and_exchange(&sfd->error_strikes, strikes, strikes - 1); strike: - ca = sfd->call ? : NULL; if (ca && update) { redis_update_onekey(ca, rtpe_redis_write);