From: Hwankyu Jhun Date: Tue, 14 Apr 2020 02:14:39 +0000 (+0900) Subject: Fix Frame Broker X-Git-Tag: submit/tizen/20200417.051505~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4bdfac75ff8975b51598e2cccada91abd3414c7e;p=platform%2Fcore%2Fappfw%2Fwidget-viewer.git Fix Frame Broker - 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 --- diff --git a/frame-broker/src/frame_broker.c b/frame-broker/src/frame_broker.c index ac1462fc..d09aa9c1 100644 --- a/frame-broker/src/frame_broker.c +++ b/frame-broker/src/frame_broker.c @@ -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; }