diff --git a/daemon/call.c b/daemon/call.c index 765221f82..cf45bfc55 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -527,7 +527,7 @@ void callmaster_msg_mh_src(struct callmaster *cm, struct msghdr *mh) { /* called lock-free */ static int stream_packet(struct stream_fd *sfd, str *s, struct sockaddr_in6 *fsin) { - struct packet_stream *stream = sfd->stream, + struct packet_stream *stream, *sink = NULL, *in_srtp, *out_srtp; struct call_media *media; @@ -544,16 +544,20 @@ static int stream_packet(struct stream_fd *sfd, str *s, struct sockaddr_in6 *fsi struct endpoint endpoint; rewrite_func rwf_in, rwf_out; - if (!stream) - return 0; - media = stream->media; - call = stream->call; + call = sfd->call; cm = call->callmaster; smart_ntop_port(addr, fsin, sizeof(addr)); rwlock_lock_r(&call->master_lock); + + stream = sfd->stream; + if (!stream) + goto unlock_out; + mutex_lock(&stream->in_lock); + media = stream->media; + if (!stream->sfd) goto done; @@ -764,6 +768,7 @@ done: stream_unkernelize(stream->rtp_sink); stream_unkernelize(stream->rtcp_sink); } +unlock_out: rwlock_unlock_r(&call->master_lock); return ret;