webrtcbin: Fix deadlock when receiving new sctp stream
authorJohan Sternerup <johast@axis.com>
Thu, 22 Apr 2021 08:43:55 +0000 (10:43 +0200)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Wed, 12 May 2021 03:02:27 +0000 (03:02 +0000)
commit4d514abfd60dcdcbadc4b748e56c1c4da4e051d9
tree80bf3a7c2fe28ad388e2e684bedfefee4a9a7302
parent8dbdfad914340c2f7e0a91317e85ecb438e0ca39
webrtcbin: Fix deadlock when receiving new sctp stream

When receiving an sctp message for a stream that not yet has an
sctpdec pad associated with it means we end up in
_on_sctpdec_pad_added. At this point we're holding the sctpassocation
lock. Then it's not possible to take the pc_lock because then code
executing under the pc_lock (which means anything in the webrtc
thread) may not take the sctpassociation lock. For example, running
the data channel close procedure from the webrtc thread means we
eventually end up sending a SCTP_RESET_STREAMS packet which needs to
grab the sctpassociation lock.

This means _on_sctpdec_pad_added simply cannot take the pc_lock and
also it is not possible to postpone the channel creation as we need to
link the pads right there. The solution is to introduce a more
granular dc_lock that protects only the things that needs to be done
to create the datachannel.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2186>
ext/webrtc/gstwebrtcbin.c
ext/webrtc/gstwebrtcbin.h