Browse Source

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
pull/1446/head
Richard Fuchs 4 years ago
parent
commit
4eecec9a1e
1 changed files with 11 additions and 1 deletions
  1. +11
    -1
      daemon/media_socket.c

+ 11
- 1
daemon/media_socket.c View File

@ -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);


Loading…
Cancel
Save