From: Sangchul Lee Date: Wed, 3 Jan 2024 03:02:18 +0000 (+0900) Subject: Add locking mutex for state X-Git-Tag: accepted/tizen/unified/20240105.013006^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a4d1ffdec1da9c091d5ef43996318896e7ea967d;p=platform%2Fcore%2Fapi%2Fwebrtc.git Add locking mutex for state [Version] 0.4.29 [Issue Type] Coverity defect (MISSING_LOCK) Change-Id: If29613750c55c1179a3393de65f52866be4997b8 Signed-off-by: Sangchul Lee --- diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index 6ff3c348..7aada97d 100644 --- a/packaging/capi-media-webrtc.spec +++ b/packaging/capi-media-webrtc.spec @@ -1,6 +1,6 @@ Name: capi-media-webrtc Summary: A WebRTC library in Tizen Native API -Version: 0.4.28 +Version: 0.4.29 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc.c b/src/webrtc.c index f5927e5d..221d06fd 100644 --- a/src/webrtc.c +++ b/src/webrtc.c @@ -748,11 +748,12 @@ int webrtc_screen_source_set_crop(webrtc_h webrtc, unsigned int source_id, int x RET_VAL_IF(y < 0, WEBRTC_ERROR_INVALID_PARAMETER, "y < 0"); RET_VAL_IF(width == 0, WEBRTC_ERROR_INVALID_PARAMETER, "width is 0"); RET_VAL_IF(height == 0, WEBRTC_ERROR_INVALID_PARAMETER, "height is 0"); - RET_VAL_IF(_webrtc->state == WEBRTC_STATE_IDLE, WEBRTC_ERROR_INVALID_STATE, "the state should not be IDLE"); - RET_ERR_IF_PRIVILEGE_IS_NOT_ALLOWED(_WEBRTC_PRIVILEGE_PLATFORM); locker = g_mutex_locker_new(&_webrtc->mutex); + RET_VAL_IF(_webrtc->state == WEBRTC_STATE_IDLE, WEBRTC_ERROR_INVALID_STATE, "the state should not be IDLE"); + RET_ERR_IF_PRIVILEGE_IS_NOT_ALLOWED(_WEBRTC_PRIVILEGE_PLATFORM); + #ifdef TIZEN_FEATURE_UI return _set_screen_source_crop(_webrtc, source_id, x, y, width, height); #else @@ -768,11 +769,12 @@ int webrtc_screen_source_unset_crop(webrtc_h webrtc, unsigned int source_id) RET_VAL_IF(_webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL"); RET_VAL_IF(source_id == 0, WEBRTC_ERROR_INVALID_PARAMETER, "source_id is 0"); - RET_VAL_IF(_webrtc->state == WEBRTC_STATE_IDLE, WEBRTC_ERROR_INVALID_STATE, "the state should not be IDLE"); - RET_ERR_IF_PRIVILEGE_IS_NOT_ALLOWED(_WEBRTC_PRIVILEGE_PLATFORM); locker = g_mutex_locker_new(&_webrtc->mutex); + RET_VAL_IF(_webrtc->state == WEBRTC_STATE_IDLE, WEBRTC_ERROR_INVALID_STATE, "the state should not be IDLE"); + RET_ERR_IF_PRIVILEGE_IS_NOT_ALLOWED(_WEBRTC_PRIVILEGE_PLATFORM); + #ifdef TIZEN_FEATURE_UI return _unset_screen_source_crop(_webrtc, source_id); #else diff --git a/src/webrtc_private.c b/src/webrtc_private.c index 0cd747f9..c35e1cc0 100644 --- a/src/webrtc_private.c +++ b/src/webrtc_private.c @@ -1452,12 +1452,15 @@ static void __webrtcbin_pad_added_cb(GstElement *webrtcbin, GstPad *new_pad, gpo webrtc_s *webrtc = (webrtc_s *)user_data; gchar *media_type = NULL; bool is_audio; + g_autoptr(GMutexLocker) locker = NULL; RET_IF(webrtc == NULL, "webrtc is NULL"); if (GST_PAD_DIRECTION(new_pad) != GST_PAD_SRC) return; + locker = g_mutex_locker_new(&webrtc->mutex); + RET_IF(webrtc->pend_state == WEBRTC_STATE_IDLE, "pend_state is IDLE, skip it"); LOG_INFO("new pad[%s] is added", GST_PAD_NAME(new_pad)); @@ -1473,6 +1476,9 @@ static void __webrtcbin_pad_added_cb(GstElement *webrtcbin, GstPad *new_pad, gpo is_audio = _is_audio_media_type(media_type); g_free(media_type); + /* NOTE: Unlock the mutex here before calling track added user callback */ + g_clear_pointer(&locker, g_mutex_locker_free); + if ((!is_audio && webrtc->encoded_video_frame_cb.callback) || (is_audio && webrtc->encoded_audio_frame_cb.callback)) { ret = _add_forwarding_sink_bin(webrtc, new_pad, is_audio); diff --git a/src/webrtc_stats.c b/src/webrtc_stats.c index ffc95007..7489a023 100644 --- a/src/webrtc_stats.c +++ b/src/webrtc_stats.c @@ -973,6 +973,11 @@ void _webrtcbin_foreach_stats(webrtc_s *webrtc, int type_mask, void *callback, v static gboolean __get_stats_periodically(gpointer user_data) { webrtc_s *webrtc = (webrtc_s *)user_data; + g_autoptr(GMutexLocker) locker = NULL; + + RET_VAL_IF(webrtc == NULL, G_SOURCE_REMOVE, "webrtc is NULL"); + + locker = g_mutex_locker_new(&webrtc->mutex); if (webrtc->state == WEBRTC_STATE_PLAYING) _webrtcbin_foreach_stats(webrtc, WEBRTC_STATS_TYPE_GST_ALL, NULL, NULL);