srtpenc: Add missing locks

https://bugzilla.gnome.org/show_bug.cgi?id=746387
This commit is contained in:
Jose Antonio Santos Cadenas 2015-03-18 09:39:49 +01:00 committed by Sebastian Dröge
parent 2d3938c063
commit ef4a904700

View file

@ -389,6 +389,8 @@ max_cipher_key_size (GstSrtpEnc * filter)
} }
/* Create stream /* Create stream
*
* Should be called with the filter locked
*/ */
static err_status_t static err_status_t
gst_srtp_enc_create_session (GstSrtpEnc * filter) gst_srtp_enc_create_session (GstSrtpEnc * filter)
@ -400,8 +402,6 @@ gst_srtp_enc_create_session (GstSrtpEnc * filter)
memset (&policy, 0, sizeof (srtp_policy_t)); memset (&policy, 0, sizeof (srtp_policy_t));
GST_OBJECT_LOCK (filter);
if (HAS_CRYPTO (filter)) { if (HAS_CRYPTO (filter)) {
guint expected; guint expected;
gsize keysize; gsize keysize;
@ -457,24 +457,26 @@ gst_srtp_enc_create_session (GstSrtpEnc * filter)
if (HAS_CRYPTO (filter)) if (HAS_CRYPTO (filter))
gst_buffer_unmap (filter->key, &map); gst_buffer_unmap (filter->key, &map);
GST_OBJECT_UNLOCK (filter);
return ret; return ret;
} }
/* Release ressources and set default values /* Release ressources and set default values
*/ */
static void static void
gst_srtp_enc_reset (GstSrtpEnc * filter) gst_srtp_enc_reset_no_lock (GstSrtpEnc * filter)
{ {
GST_OBJECT_LOCK (filter);
if (!filter->first_session) if (!filter->first_session)
srtp_dealloc (filter->session); srtp_dealloc (filter->session);
filter->first_session = TRUE; filter->first_session = TRUE;
filter->key_changed = FALSE; filter->key_changed = FALSE;
}
static void
gst_srtp_enc_reset (GstSrtpEnc * filter)
{
GST_OBJECT_LOCK (filter);
gst_srtp_enc_reset_no_lock (filter);
GST_OBJECT_UNLOCK (filter); GST_OBJECT_UNLOCK (filter);
} }
@ -982,16 +984,18 @@ gst_srtp_enc_check_set_caps (GstSrtpEnc * filter, GstPad * pad,
{ {
gboolean do_setcaps = FALSE; gboolean do_setcaps = FALSE;
do_setcaps = filter->key_changed; GST_OBJECT_LOCK (filter);
if (do_setcaps) { if (filter->key_changed) {
gst_srtp_enc_reset (filter); gst_srtp_enc_reset_no_lock (filter);
do_setcaps = TRUE;
} }
if (filter->first_session) { if (filter->first_session) {
err_status_t status = gst_srtp_enc_create_session (filter); err_status_t status = gst_srtp_enc_create_session (filter);
if (status != err_status_ok) { if (status != err_status_ok) {
GST_OBJECT_UNLOCK (filter);
GST_ELEMENT_ERROR (filter, LIBRARY, INIT, GST_ELEMENT_ERROR (filter, LIBRARY, INIT,
("Could not initialize SRTP encoder"), ("Could not initialize SRTP encoder"),
("Failed to add stream to SRTP encoder (err: %d)", status)); ("Failed to add stream to SRTP encoder (err: %d)", status));
@ -999,6 +1003,8 @@ gst_srtp_enc_check_set_caps (GstSrtpEnc * filter, GstPad * pad,
} }
} }
GST_OBJECT_UNLOCK (filter);
/* Update source caps if asked */ /* Update source caps if asked */
if (do_setcaps) { if (do_setcaps) {
GstCaps *caps; GstCaps *caps;
@ -1116,7 +1122,9 @@ gst_srtp_enc_chain (GstPad * pad, GstObject * parent, GstBuffer * buf,
GST_OBJECT_LOCK (filter); GST_OBJECT_LOCK (filter);
if (gst_srtp_get_soft_limit_reached ()) { if (gst_srtp_get_soft_limit_reached ()) {
GST_OBJECT_UNLOCK (filter);
g_signal_emit (filter, gst_srtp_enc_signals[SIGNAL_SOFT_LIMIT], 0); g_signal_emit (filter, gst_srtp_enc_signals[SIGNAL_SOFT_LIMIT], 0);
GST_OBJECT_LOCK (filter);
if (filter->random_key && !filter->key_changed) if (filter->random_key && !filter->key_changed)
gst_srtp_enc_replace_random_key (filter); gst_srtp_enc_replace_random_key (filter);
} }
@ -1178,8 +1186,10 @@ gst_srtp_enc_change_state (GstElement * element, GstStateChange transition)
"RTCP authentication can't be NULL if encryption is not NULL."); "RTCP authentication can't be NULL if encryption is not NULL.");
return GST_STATE_CHANGE_FAILURE; return GST_STATE_CHANGE_FAILURE;
} }
GST_OBJECT_LOCK (filter);
if (!filter->first_session) if (!filter->first_session)
gst_srtp_enc_reset (filter); gst_srtp_enc_reset_no_lock (filter);
GST_OBJECT_UNLOCK (filter);
break; break;
case GST_STATE_CHANGE_READY_TO_PAUSED: case GST_STATE_CHANGE_READY_TO_PAUSED:
break; break;