From 9adb1734cf39acc7d297d6900415bf678d350a9a Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 25 Mar 2014 17:39:18 +0100 Subject: srtpenc: unlock object lock before posting error Posting an error with the object lock will deadlock. Rework the code a bit to make things more simple. --- ext/srtp/gstsrtpenc.c | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) (limited to 'ext/srtp') diff --git a/ext/srtp/gstsrtpenc.c b/ext/srtp/gstsrtpenc.c index 4bac174dc..5026b21e3 100644 --- a/ext/srtp/gstsrtpenc.c +++ b/ext/srtp/gstsrtpenc.c @@ -334,26 +334,6 @@ max_cipher_key_size (GstSrtpEnc * filter) return (rtp_size > rtcp_size) ? rtp_size : rtcp_size; } -static gboolean -check_key_size (GstSrtpEnc * filter) -{ - guint expected; - gboolean res; - - expected = max_cipher_key_size (filter); - - res = gst_buffer_get_size (filter->key) == expected; - - if (!res) { - GST_ELEMENT_ERROR (filter, LIBRARY, SETTINGS, - ("Master key size is wrong"), - ("Expected master key of %d bytes, but received %" G_GSIZE_FORMAT - " bytes", expected, gst_buffer_get_size (filter->key))); - } - - return res; -} - /* Create stream */ static gboolean @@ -373,6 +353,9 @@ check_new_stream_locked (GstSrtpEnc * filter, guint32 ssrc) GST_OBJECT_LOCK (filter); if (HAS_CRYPTO (filter)) { + guint expected; + gsize keysize; + if (filter->key == NULL) { GST_OBJECT_UNLOCK (filter); GST_ELEMENT_ERROR (filter, LIBRARY, SETTINGS, @@ -380,8 +363,16 @@ check_new_stream_locked (GstSrtpEnc * filter, guint32 ssrc) ("Cipher is not NULL, key must be set")); return FALSE; } - if (!check_key_size (filter)) { + + expected = max_cipher_key_size (filter); + keysize = gst_buffer_get_size (filter->key); + + if (expected != keysize) { GST_OBJECT_UNLOCK (filter); + GST_ELEMENT_ERROR (filter, LIBRARY, SETTINGS, + ("Master key size is wrong"), + ("Expected master key of %d bytes, but received %" G_GSIZE_FORMAT + " bytes", expected, keysize)); return FALSE; } } -- cgit v1.2.1