res_rtp_asterisk.c: Fix bridge_p2p_rtp_write() reentrancy potential.
authorRichard Mudgett <rmudgett@digium.com>
Thu, 14 Sep 2017 02:31:52 +0000 (21:31 -0500)
committerRichard Mudgett <rmudgett@digium.com>
Tue, 26 Sep 2017 16:19:17 +0000 (11:19 -0500)
commit9d65057cdf0ee9a8ca0bafc85b76663238a27418
treea2ded62048b9e0aaefc20eb87790b51bf51b1f42
parentc8a89335581d2c1cfd1b9818a5643283091ed083
res_rtp_asterisk.c: Fix bridge_p2p_rtp_write() reentrancy potential.

The bridge_p2p_rtp_write() has potential reentrancy problems.

* Accessing the bridged RTP members must be done with the instance1 lock
held.  The DTMF and asymmetric codec checks must be split to be done with
the correct RTP instance struct locked.  i.e., They must be done when
working on the appropriate side of the point to point bridge.

* Forcing the RTP mark bit was referencing the wrong side of the point to
point bridge.  The set mark bit is used everywhere else to set the mark
bit when sending not receiving.

The patches for ASTERISK_26745 and ASTERISK_27158 did not take into
account that not everything carried by RTP uses a codec.  The telephony
DTMF events are not exchanged with a codec.  As a result when
RFC2833/RFC4733 sent digits you would crash if "core set debug 1" is
enabled, the DTMF digits would always get passed to the core even though
the local native RTP bridge is active, and the DTMF digits would go out
using the wrong SSRC id.

* Add protection for non-format payload types like DTMF when updating the
lastrxformat and lasttxformat.  Also protect against non-format payload
types when checking for asymmetric codecs.

ASTERISK-27292

Change-Id: I6344ab7de21e26f84503c4d1fca1a41579364186
res/res_rtp_asterisk.c