From b38a3547ee5e7f29a9831da72b068c3f7da50e6e Mon Sep 17 00:00:00 2001 From: Seunghun Lee Date: Mon, 3 Feb 2025 13:11:30 +0900 Subject: [PATCH] e_client: Ensure E_Client has frame object This prevents creation of E_Client instances without corresponding frame objects due to undefined behavior. This tries to fix failure of following assertion. #3 0xf77bca8c in __GI___assert_fail (assertion=0xf5891520 "\001", assertion@entry=0x16cf68 "client != NULL", file=file@entry=0x16cdec "src/bin/core/e_view_client.c", line=line@entry=108, function=function@entry=0x16dfd4 <__PRETTY_FUNCTION__.52349> "e_view_client_view_get") at /usr/src/debug/glibc-2.30-3.14.arm/assert/assert.c:101 #4 0x000f34ba in e_view_client_view_get (client=) at /usr/src/debug/enlightenment-0.20.0-tz9_36.1.1.arm/src/bin/core/e_view_client.c:108 #5 0x000fd1de in e_view_client_view_get (client=) at /usr/src/debug/enlightenment-0.20.0-tz9_36.1.1.arm/src/bin/core/e_zone.c:1098 #6 e_zone_has_ec (zone=0xf5891520, ec=) at /usr/src/debug/enlightenment-0.20.0-tz9_36.1.1.arm/src/bin/core/e_zone.c:1100 #7 0x00072c10 in e_comp_zone_find_by_ec (ec=0x6c) at /usr/src/debug/enlightenment-0.20.0-tz9_36.1.1.arm/src/bin/compmgr/e_comp.c:1421 #8 0x0009f7a0 in e_policy_client_add (ec=) at /usr/src/debug/enlightenment-0.20.0-tz9_36.1.1.arm/src/bin/windowmgr/e_policy.c:2344 #9 _e_policy_zone_cb_hook_client_new_client_post (d=0x235e508, ec=0x257ddd0) at /usr/src/debug/enlightenment-0.20.0-tz9_36.1.1.arm/src/bin/windowmgr/e_policy_zone.c:959 #10 0x00111776 in _e_client_hook_call (hookpoint=E_CLIENT_HOOK_NEW_CLIENT_POST, ec=0x257ddd0) at /usr/src/debug/enlightenment-0.20.0-tz9_36.1.1.arm/src/bin/core/e_client.c:325 Change-Id: I2b2ed84f25c0622eb4432488b0bfbf4cb7e89f37 --- src/bin/core/e_client.c | 50 ++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/src/bin/core/e_client.c b/src/bin/core/e_client.c index c7e3b78769..28c384789f 100644 --- a/src/bin/core/e_client.c +++ b/src/bin/core/e_client.c @@ -3524,31 +3524,35 @@ e_client_new(E_Pixmap *cp, int first_map, int internal) if (!ec->ignored) _e_client_event_add(ec); e_comp_object_client_add(ec); - if (ec->frame) + if (!ec->frame) { - _e_client_view_init(ec); - evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_SHOW, _e_client_cb_evas_show, ec); - evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_HIDE, _e_client_cb_evas_hide, ec); - evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_MOVE, _e_client_cb_evas_move, ec); - evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_RESIZE, _e_client_cb_evas_resize, ec); - evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_RESTACK, _e_client_cb_evas_restack, ec); + ERR("Failed to create frame object for ec(%p)", ec); + e_object_del(E_OBJECT(ec)); + return NULL; + } - if (e_input_thread_check_client_cloning_needed()) - { - Evas_Coord x, y, w, h; - E_Input_Thread_Request_EClient_Data ec_data; - memset(&ec_data, 0, sizeof(E_Input_Thread_Request_EClient_Data)); - e_view_client_geometry_get(PRI(ec)->view_client, &x, &y, &w, &h); - ec_data.ec = ec; - ec_data.eo_geometry.x = x; - ec_data.eo_geometry.y = y; - ec_data.eo_geometry.w = w; - ec_data.eo_geometry.h = h; - - ICINF("[%s] ec(%p), eo.x(%d), eo.y(%d), eo.w(%d), eo.h(%d)\n", __func__, ec, x, y, w, h); - - e_input_backend_thread_safe_call(_e_client_input_thread_eo_geometry_set, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data)); - } + _e_client_view_init(ec); + evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_SHOW, _e_client_cb_evas_show, ec); + evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_HIDE, _e_client_cb_evas_hide, ec); + evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_MOVE, _e_client_cb_evas_move, ec); + evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_RESIZE, _e_client_cb_evas_resize, ec); + evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_RESTACK, _e_client_cb_evas_restack, ec); + + if (e_input_thread_check_client_cloning_needed()) + { + Evas_Coord x, y, w, h; + E_Input_Thread_Request_EClient_Data ec_data; + memset(&ec_data, 0, sizeof(E_Input_Thread_Request_EClient_Data)); + e_view_client_geometry_get(PRI(ec)->view_client, &x, &y, &w, &h); + ec_data.ec = ec; + ec_data.eo_geometry.x = x; + ec_data.eo_geometry.y = y; + ec_data.eo_geometry.w = w; + ec_data.eo_geometry.h = h; + + ICINF("[%s] ec(%p), eo.x(%d), eo.y(%d), eo.w(%d), eo.h(%d)\n", __func__, ec, x, y, w, h); + + e_input_backend_thread_safe_call(_e_client_input_thread_eo_geometry_set, &ec_data, sizeof(E_Input_Thread_Request_EClient_Data)); } _e_client_hook_call(E_CLIENT_HOOK_NEW_CLIENT_POST, ec); -- 2.34.1