e_client: Ensure E_Client has frame object 67/319167/1
authorSeunghun Lee <shiin.lee@samsung.com>
Mon, 3 Feb 2025 04:11:30 +0000 (13:11 +0900)
committerSeunghun Lee <shiin.lee@samsung.com>
Wed, 5 Feb 2025 01:11:35 +0000 (10:11 +0900)
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=<optimized out>) 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=<optimized out>) 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=<optimized out>) 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=<optimized out>) 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

index c7e3b78769340be36baba2c9f6eae5d716f29f76..28c384789fb26ccc61ac9d2531c00099ac52e39e 100644 (file)
@@ -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);