Revert "make e_policy_client_unmap be static function" 21/324821/2
authorSeunghun Lee <shiin.lee@samsung.com>
Tue, 27 May 2025 07:38:46 +0000 (16:38 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Tue, 27 May 2025 09:35:41 +0000 (09:35 +0000)
This reverts 8079c6ec commit to prevent use-after-free.

e_policy_visibility_client_grab_cancel() may occur E_Client to be
deleted.

Change-Id: Ib306256f2bb148f378e7ba567dc59c6fbbdfd5ab

src/bin/server/e_comp_wl_shell.c
src/bin/windowmgr/e_policy.c

index 638bed71513f5416285ff7e30b9f709e490fb518..cb4a57acd4fb6d396575942cd4534eaaef9630dd 100644 (file)
@@ -10,6 +10,7 @@
 #include "e_config_intern.h"
 #include "e_view_intern.h"
 #include "e_view_client_intern.h"
+#include "e_policy_visibility_intern.h"
 
 #include <tizen-extension-server-protocol.h>
 
@@ -347,6 +348,13 @@ e_shell_e_client_destroy(E_Client *ec)
 
    _e_shell_e_client_shsurface_api_reset(ec);
 
+   if (e_policy_visibility_client_grab_cancel(ec))
+     {
+        ELOGF("POL_VIS", "CLIENT VIS ON(temp).", ec);
+        e_client_visibility_set(ec, E_VISIBILITY_UNOBSCURED),
+        ec->visibility.changed = 1;
+     }
+
    /* remove this 'ec' from parent's transients list */
    if (ec->parent)
      {
@@ -367,10 +375,9 @@ e_shell_e_client_destroy(E_Client *ec)
              ELOGF("SHELL", "Call shell.unmap by destroy surface", ec);
              e_client_shell_unmap(ec);
           }
+        e_client_unmap(ec);
      }
 
-   e_client_unmap(ec);
-
    if (ec->comp_data)
      ec->comp_data->shell.surface = NULL;
 }
index 26f956a69bbfed31ded9547f2406f1c3eac80c27..e4b945b6ebc42a5841f98008cccff145f6a3b28e 100644 (file)
@@ -2181,20 +2181,7 @@ _e_policy_client_cb_client_map_post(struct wl_listener *listener, void *data)
 static void
 _e_policy_client_cb_client_unmap(struct wl_listener *listener, void *data)
 {
-   E_Policy_Client *policy_client;
-   E_Client *ec;
-
-   policy_client = wl_container_of(listener, policy_client, client_unmap_listener);
-
-   ec = policy_client->ec;
-   EINA_SAFETY_ON_NULL_RETURN(ec);
-
-   if (e_policy_visibility_client_grab_cancel(ec))
-     {
-        ELOGF("POL_VIS", "CLIENT VIS ON(temp).", ec);
-        e_client_visibility_set(ec, E_VISIBILITY_UNOBSCURED),
-        ec->visibility.changed = 1;
-     }
+   E_Policy_Client *policy_client = wl_container_of(listener, policy_client, client_unmap_listener);
 
    _e_policy_client_unmap(policy_client->ec);
 }