Fix coverity issue: Data race condition 81/319081/1 accepted/tizen_unified_x_asan accepted/tizen/unified/20250204.155503 accepted/tizen/unified/x/20250212.043913 accepted/tizen/unified/x/asan/20250211.003609
authorJeongmo Yang <jm80.yang@samsung.com>
Tue, 4 Feb 2025 04:57:00 +0000 (13:57 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Tue, 4 Feb 2025 04:57:00 +0000 (13:57 +0900)
[Version] 1.3.5
[Issue Type] Coverity

Change-Id: Iaec4bd0ac04a3393e2160f17187504a0f85e4be2
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
packaging/hal-backend-camera-v4l2.spec
src/hal_backend_camera_v4l2.c
src/hal_backend_camera_v4l2_private.h

index aeef4706f9c95584ece2334ca9ef1cd86cb8606d..d49ccd6d321f3e66d943a1ad666b6ac04a70504c 100644 (file)
@@ -2,7 +2,7 @@
 
 Name:       hal-backend-camera-v4l2
 Summary:    Tizen Camera Hal using generic V4L2 interface
-Version:    1.3.4
+Version:    1.3.5
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index d4e7f2681096d5da224653f5b5f4141a25934ffe..a3edf9a6b56872ad3aa686e03a3d1f12e9640769 100644 (file)
@@ -1438,14 +1438,11 @@ static void __camera_do_capture(hal_camera_handle *handle)
                handle->camera_buffers[index].planes[0].bytesused = bytesused;
 
                if (handle->captured_count > 0) {
-                       g_mutex_lock(&handle->buffer_lock);
                        if (handle->state != CAMERA_STATE_CAPTURING) {
                                LOGW("stop continuous capture");
                                handle->captured_count = handle->capture_count;
-                               g_mutex_unlock(&handle->buffer_lock);
                                goto _TRY_NEXT;
                        }
-                       g_mutex_unlock(&handle->buffer_lock);
                }
 
                if (handle->capture_count > 1) {
@@ -1458,9 +1455,7 @@ static void __camera_do_capture(hal_camera_handle *handle)
                                goto _TRY_NEXT;
                }
 
-               g_mutex_lock(&handle->buffer_lock);
                handle->captured_count++;
-               g_mutex_unlock(&handle->buffer_lock);
 
                LOGD("capture cb[%p], buffer index[%d],count[%d]",
                        handle->capture_cb, index, handle->captured_count);
@@ -1483,17 +1478,17 @@ _TRY_NEXT:
                        LOGE("qbuf failed for capture[0x%x]", ret);
        } while (handle->captured_count < handle->capture_count);
 
-       g_mutex_lock(&handle->buffer_lock);
+       g_mutex_lock(&handle->lock);
 
        if (handle->state == CAMERA_STATE_CAPTURING) {
                LOGD("wait for capture stop signal");
-               g_cond_wait(&handle->buffer_cond, &handle->buffer_lock);
+               g_cond_wait(&handle->cond, &handle->lock);
                LOGD("signal received");
        } else {
                LOGD("The state is already changed.");
        }
 
-       g_mutex_unlock(&handle->buffer_lock);
+       g_mutex_unlock(&handle->lock);
 
 _CAPTURE_DONE:
        /* restart stream for preview */
@@ -1760,6 +1755,7 @@ static void __camera_release_handle(hal_camera_handle *handle)
        g_mutex_clear(&handle->buffer_lock);
        g_mutex_clear(&handle->msg_cb_lock);
        g_mutex_clear(&handle->extra_preview_lock);
+       g_cond_clear(&handle->cond);
        g_cond_clear(&handle->buffer_cond);
        g_cond_clear(&handle->msg_cb_cond);
 
@@ -1815,6 +1811,7 @@ int camera_v4l2_init(void **camera_handle)
        g_mutex_init(&new_handle->buffer_lock);
        g_mutex_init(&new_handle->msg_cb_lock);
        g_mutex_init(&new_handle->extra_preview_lock);
+       g_cond_init(&new_handle->cond);
        g_cond_init(&new_handle->buffer_cond);
        g_cond_init(&new_handle->msg_cb_cond);
 
@@ -2483,6 +2480,11 @@ int camera_v4l2_stop_capture(void *camera_handle)
                return CAMERA_ERROR_INVALID_PARAMETER;
        }
 
+       if (handle->captured_count == 0) {
+               LOGE("No captured image yet.");
+               return CAMERA_ERROR_INTERNAL;
+       }
+
        g_mutex_lock(&handle->lock);
 
        if (handle->state != CAMERA_STATE_CAPTURING) {
@@ -2491,21 +2493,11 @@ int camera_v4l2_stop_capture(void *camera_handle)
                return CAMERA_ERROR_INVALID_STATE;
        }
 
-       g_mutex_lock(&handle->buffer_lock);
-
-       if (handle->captured_count == 0) {
-               LOGE("No captured image yet.");
-               g_mutex_unlock(&handle->buffer_lock);
-               g_mutex_unlock(&handle->lock);
-               return CAMERA_ERROR_INTERNAL;
-       }
+       handle->state = CAMERA_STATE_PREVIEWING;
 
        LOGD("send signal to start preview after capture");
 
-       g_cond_signal(&handle->buffer_cond);
-       g_mutex_unlock(&handle->buffer_lock);
-
-       handle->state = CAMERA_STATE_PREVIEWING;
+       g_cond_signal(&handle->cond);
 
        g_mutex_unlock(&handle->lock);
 
index bf1ede2e9a3018fa07a846ba2d91ebef3e6cd91a..55f6401f12069023aaac46bae2b224f03caa7e55 100644 (file)
@@ -98,6 +98,7 @@ typedef struct _camera_hal_handle {
 
        /* etc */
        GMutex lock;
+       GCond cond;
        camera_state_e state;
 } hal_camera_handle;