Fix Frame Broker 34/230734/1
authorHwankyu Jhun <h.jhun@samsung.com>
Tue, 14 Apr 2020 02:14:39 +0000 (11:14 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Tue, 14 Apr 2020 02:17:59 +0000 (11:17 +0900)
- Fixes AUL launcher service handler
- Ignores stop and cleanup events if the serial is not equal to
the requested serial
- Sets the context handle to nullptr to prevent invalid access after
destroying it

Change-Id: I29240db3c07abd65ebcfe56f4f6cf9f7d5eecd11
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
frame-broker/src/frame_broker.c

index ac1462f..d09aa9c 100644 (file)
@@ -100,6 +100,7 @@ static uint32_t __generate_serial(void)
        static gint serial;
 
        g_atomic_int_inc(&serial);
+       g_atomic_int_compare_and_exchange(&serial, 0, 1);
 
        return (uint32_t)serial;
 }
@@ -124,10 +125,6 @@ static void __aul_launcher_service_cb(const char *app_id,
                void *user_data)
 {
        frame_broker_h broker = user_data;
-       frame_context_h context;
-       int ctx_pid = -1;
-       uint32_t ctx_serial = 0;
-       int ret;
 
        _D("app_id(%s), inst_id(%s), pid(%d), serial(%u)",
                        app_id, inst_id, pid, serial);
@@ -137,32 +134,8 @@ static void __aul_launcher_service_cb(const char *app_id,
                return;
        }
 
-       __check_pre_context(broker);
-       frame_context_set_inst_id(broker->context, inst_id);
-       frame_context_set_pid(broker->context, pid);
-
-       frame_context_get_pid(broker->context, &ctx_pid);
-       frame_context_get_serial(broker->context, &ctx_serial);
-       if (ctx_pid == pid && ctx_serial == serial) {
-               _D("Frame context already exists");
-               return;
-       }
-
-       ret = frame_context_create(broker, app_id, inst_id, pid, serial,
-                       &broker->callback, broker->user_data,
-                       &context);
-       if (ret != FRAME_BROKER_ERROR_NONE) {
-               _E("Failed to create frame context. error(%d)", ret);
-               return;
-       }
-
-       if (broker->context) {
-               _D("Destroy previous context");
-               frame_context_destroy(broker->context);
-       }
-
-       broker->context = context;
-       frame_context_on_create(context);
+       frame_context_set_inst_id(broker->pre_context, inst_id);
+       frame_context_set_pid(broker->pre_context, pid);
 }
 
 static void __scls_prepare_cb(screen_connector_launcher_service_image_h image,
@@ -202,6 +175,7 @@ static void __scls_stop_cb(uint32_t serial, void *user_data)
 {
        frame_broker_h broker = user_data;
        frame_context_h context = broker->context;
+       uint32_t ctx_serial = 0;
 
        _D("[__SCLS__] Stop");
        if (context == NULL) {
@@ -214,8 +188,15 @@ static void __scls_stop_cb(uint32_t serial, void *user_data)
                }
        }
 
+       frame_context_get_serial(context, &ctx_serial);
+       if (ctx_serial != serial) {
+               _W("Skip! serial(%u:%u)", ctx_serial, serial);
+               return;
+       }
+
        _D("Destroy context");
        frame_context_destroy(context);
+       broker->context = NULL;
 }
 
 static frame_context_error_e __convert_error(
@@ -260,6 +241,7 @@ static void __scls_cleanup_cb(uint32_t serial, void *user_data)
        frame_context_h context = broker->context;
        frame_direction_e direction;
        frame_h frame;
+       uint32_t ctx_serial;
        int ret;
 
        _D("[__SCLS__] Clean up");
@@ -268,6 +250,12 @@ static void __scls_cleanup_cb(uint32_t serial, void *user_data)
                return;
        }
 
+       frame_context_get_serial(context, &ctx_serial);
+       if (ctx_serial != serial) {
+               _W("Skip! serial(%u:%u)", ctx_serial, serial);
+               return;
+       }
+
        frame_context_on_pause(context);
 
        ret = frame_context_get_frame(context, &frame);
@@ -282,6 +270,7 @@ static void __scls_cleanup_cb(uint32_t serial, void *user_data)
                        frame == NULL) {
                _D("Destroy context");
                frame_context_destroy(context);
+               broker->context = NULL;
        }
 }
 
@@ -291,6 +280,9 @@ static void __scls_reset_cb(uint32_t serial, void *user_data)
        frame_context_h context = broker->context;
 
        _W("[__SCLS__] Reset");
+       if (context == NULL)
+               return;
+
        frame_context_set_frame(context, NULL);
 }
 
@@ -390,6 +382,9 @@ API int frame_broker_destroy(frame_broker_h handle)
        if (handle->context)
                frame_context_destroy(handle->context);
 
+       if (handle->pre_context)
+               frame_context_destroy(handle->pre_context);
+
        screen_connector_launcher_service_destroy(handle->scls);
        aul_launcher_service_destroy(handle->als);
        free(handle->name);
@@ -592,7 +587,7 @@ int frame_broker_launch_with_shared_widget(frame_broker_h handle,
 {
        int ret;
 
-       if (!handle || !app_id ||  pid < -1 || !serial) {
+       if (!handle || !app_id || pid < -1 || !serial) {
                _E("Invalid parameter");
                return FRAME_BROKER_ERROR_INVALID_PARAMETER;
        }