fix incorrect wayland API calls 89/323589/2
authorJoonbum Ko <joonbum.ko@samsung.com>
Wed, 16 Apr 2025 07:55:06 +0000 (16:55 +0900)
committerJoonbum Ko <joonbum.ko@samsung.com>
Thu, 8 May 2025 04:33:46 +0000 (13:33 +0900)
 - Fixed potential memory leak in exception scenarios.
 - Removed unnecessary wl_display_dispatch_queue calls.
 - Removed unnecessary ecore_wl2_display_flush calls.

Change-Id: I4e7ff09a697120b9606dd66a354579c962f84d94
Signed-off-by: Joonbum Ko <joonbum.ko@samsung.com>
src/efl_util.c

index a4581c00ed931e792e34911164a87fa45cdc8ba5..1ac4e20e2536746e6ce14f16b7cba603082a2072 100644 (file)
@@ -346,10 +346,11 @@ _wl_init(void)
 {
    struct wl_display *display_wrapper = NULL;
    struct wl_registry *reg = NULL;
+   int ret = 0;
 
    if (_eflutil.wl.init) return EINA_TRUE;
 
-   ecore_wl2_init();
+   if (ecore_wl2_init() <= 0) return EINA_FALSE;
 
    _eflutil.wl.wl2_display = ecore_wl2_display_connect(NULL);
    EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.wl2_display, fail);
@@ -371,6 +372,11 @@ _wl_init(void)
 
    wl_registry_add_listener(reg, &_wl_reg_listener, NULL);
 
+   ret = wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+   EINA_SAFETY_ON_TRUE_GOTO(ret < 0, fail);
+
+   wl_registry_destroy(reg);
+
    _eflutil.wl.init = EINA_TRUE;
 
    return EINA_TRUE;
@@ -384,6 +390,9 @@ fail:
         _eflutil.wl.queue = NULL;
      }
 
+   if (reg)
+     wl_registry_destroy(reg);
+
    ecore_wl2_shutdown();
    return EINA_FALSE;
 }
@@ -393,6 +402,7 @@ _wl_init_default_queue(void)
 {
    struct wl_display *display_wrapper = NULL;
    struct wl_registry *reg = NULL;
+   int ret = 0;
 
    if (_eflutil_defaultqueue.wl.init) return EINA_TRUE;
 
@@ -413,10 +423,17 @@ _wl_init_default_queue(void)
 
    wl_registry_add_listener(reg, &_wl_default_queue_reg_listener, NULL);
 
+   ret = wl_display_roundtrip(_eflutil.wl.dpy);
+   EINA_SAFETY_ON_TRUE_GOTO(ret < 0, fail);
+
+   wl_registry_destroy(reg);
+
    _eflutil_defaultqueue.wl.init = EINA_TRUE;
 
    return EINA_TRUE;
 fail:
+   if (reg)
+     wl_registry_destroy(reg);
 
    ecore_wl2_shutdown();
    return EINA_FALSE;
@@ -516,7 +533,7 @@ _cb_wl_reg_global(void *data,
         _eflutil.wl.policy.proto = proto;
         _eflutil.wl.policy.id = id;
      }
-   else if (strcmp(interface, "wl_output") == 0)
+   else if (!strcmp(interface, "wl_output"))
      {
         Efl_Util_Wl_Output_Info *output = calloc(1, sizeof(Efl_Util_Wl_Output_Info));
         EINA_SAFETY_ON_NULL_RETURN(output);
@@ -788,8 +805,7 @@ efl_util_set_notification_window_level(Evas_Object *window,
                                         EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
      }
 
-   while (!_eflutil.wl.policy.proto && (ret_dispatch != -1))
-     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EFL_UTIL_ERROR_NOT_SUPPORTED);
 
    surface = ecore_wl2_window_surface_get(wlwin);
    EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
@@ -829,7 +845,6 @@ efl_util_set_notification_window_level(Evas_Object *window,
         ret_dispatch = 0;
         while (lv_info->wait_for_done && (count < NUM_EVENT_WAIT_DONE_COUNT) && (ret_dispatch != -1))
           {
-             ecore_wl2_display_flush(_eflutil.wl.wl2_display);
              ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
              count++;
           }
@@ -868,6 +883,7 @@ efl_util_get_notification_window_level(Evas_Object *window,
 
    res = _wl_init();
    EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EFL_UTIL_ERROR_NOT_SUPPORTED);
 
    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
    EINA_SAFETY_ON_NULL_RETURN_VAL(wlwin, EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
@@ -880,9 +896,6 @@ efl_util_get_notification_window_level(Evas_Object *window,
                                         EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
      }
 
-   while (!_eflutil.wl.policy.proto && (ret_dispatch != -1))
-     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
-
    surface = ecore_wl2_window_surface_get(wlwin);
    EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
                                   EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE);
@@ -896,7 +909,6 @@ efl_util_get_notification_window_level(Evas_Object *window,
              ret_dispatch = 0;
              while ((lv_info->wait_for_done) && (count < NUM_EVENT_WAIT_DONE_COUNT) && (ret_dispatch != -1))
                {
-                  ecore_wl2_display_flush(_eflutil.wl.wl2_display);
                   ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
                   count++;
                }
@@ -941,15 +953,9 @@ efl_util_set_window_opaque_state(Evas_Object *window,
 
    if (!_eflutil.wl.policy.proto)
      {
-        int ret = 0;
-
         res = _wl_init();
         EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
-
-        while (!_eflutil.wl.policy.proto && ret != -1)
-          ret = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
-
-        EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EFL_UTIL_ERROR_INVALID_PARAMETER);
+        EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EFL_UTIL_ERROR_NOT_SUPPORTED);
      }
 
    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
@@ -982,13 +988,11 @@ efl_util_set_window_screen_mode(Evas_Object *window,
 
    res = _wl_init();
    EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EFL_UTIL_ERROR_NOT_SUPPORTED);
 
    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
    if (wlwin)
      {
-        while (!_eflutil.wl.policy.proto && (ret_dispatch != -1))
-          ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
-
         surface = ecore_wl2_window_surface_get(wlwin);
         EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
                                        EFL_UTIL_ERROR_INVALID_PARAMETER);
@@ -1023,7 +1027,6 @@ efl_util_set_window_screen_mode(Evas_Object *window,
              ret_dispatch = 0;
              while (scr_mode_info->wait_for_done && (count < NUM_EVENT_WAIT_DONE_COUNT) && (ret_dispatch != -1))
                {
-                  ecore_wl2_display_flush(_eflutil.wl.wl2_display);
                   ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
                   count++;
                }
@@ -1062,13 +1065,11 @@ efl_util_get_window_screen_mode(Evas_Object *window,
 
    res = _wl_init();
    EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EFL_UTIL_ERROR_NOT_SUPPORTED);
 
    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
    if (wlwin)
      {
-        while (!_eflutil.wl.policy.proto && (ret_dispatch != -1))
-          ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
-
         surface = ecore_wl2_window_surface_get(wlwin);
         EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
                                        EFL_UTIL_ERROR_INVALID_PARAMETER);
@@ -1081,7 +1082,6 @@ efl_util_get_window_screen_mode(Evas_Object *window,
                   ret_dispatch = 0;
                   while (scr_mode_info->wait_for_done && (ret_dispatch != -1))
                     {
-                       ecore_wl2_display_flush(_eflutil.wl.wl2_display);
                        ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
                     }
                }
@@ -1119,13 +1119,11 @@ efl_util_set_window_brightness(Evas_Object *window, int brightness)
 
    res = _wl_init();
    EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.policy.proto, EFL_UTIL_ERROR_NOT_SUPPORTED);
 
    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
    if (wlwin)
      {
-        while (!_eflutil.wl.display_policy.proto  && (ret_dispatch != -1))
-          ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
-
         surface = ecore_wl2_window_surface_get(wlwin);
         EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
                                        EFL_UTIL_ERROR_INVALID_PARAMETER);
@@ -1160,7 +1158,6 @@ efl_util_set_window_brightness(Evas_Object *window, int brightness)
               ret_dispatch = 0;
               while (brightness_info->wait_for_done && (count < NUM_EVENT_WAIT_DONE_COUNT) && (ret_dispatch != -1))
                 {
-                   ecore_wl2_display_flush(_eflutil.wl.wl2_display);
                    ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
                    count++;
                 }
@@ -1197,13 +1194,11 @@ efl_util_get_window_brightness(Evas_Object *window, int *brightness)
 
    res = _wl_init();
    EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EFL_UTIL_ERROR_INVALID_PARAMETER);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(_eflutil.wl.display_policy.proto, EFL_UTIL_ERROR_NOT_SUPPORTED);
 
    wlwin = (Ecore_Wl2_Window *)elm_win_wl_window_get(window);
    if (!wlwin) return EFL_UTIL_ERROR_INVALID_PARAMETER;
 
-   while (!_eflutil.wl.display_policy.proto && (ret_dispatch != -1))
-     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
-
    surface = ecore_wl2_window_surface_get(wlwin);
    EINA_SAFETY_ON_NULL_RETURN_VAL(surface,
                                   EFL_UTIL_ERROR_INVALID_PARAMETER);
@@ -1216,7 +1211,6 @@ efl_util_get_window_brightness(Evas_Object *window, int *brightness)
              ret_dispatch = 0;
              while (brightness_info->wait_for_done && (ret_dispatch != -1))
                {
-                  ecore_wl2_display_flush(_eflutil.wl.wl2_display);
                   ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
                }
           }
@@ -1321,8 +1315,6 @@ _efl_util_wl_inputgen_init()
    if (_wl_init() == EINA_FALSE)
      return EINA_FALSE;
 
-   wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
-
    display_wrapper = wl_proxy_create_wrapper(_eflutil.wl.dpy);
    EINA_SAFETY_ON_NULL_RETURN_VAL(display_wrapper, EINA_FALSE);
 
@@ -1507,14 +1499,12 @@ efl_util_input_set_touch_count(int max_count)
 static void
 _efl_util_wl_inputgen_deinit()
 {
-   struct wl_seat *proto;
+   struct wl_seat *seat;
    Eina_List *l;
 
-   EINA_LIST_FOREACH (_eflutil.wl.devmgr.seat_list, l, proto)
+   EINA_LIST_FOREACH (_eflutil.wl.devmgr.seat_list, l, seat)
      {
-        wl_seat_release(proto);
-
-        wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.devmgr.queue);
+        wl_seat_release(seat);
      }
    _eflutil.wl.devmgr.seat_list = eina_list_free(_eflutil.wl.devmgr.seat_list);
 
@@ -1522,10 +1512,10 @@ _efl_util_wl_inputgen_deinit()
      {
         tizen_input_device_manager_destroy(_eflutil.wl.devmgr.devicemgr);
         _eflutil.wl.devmgr.devicemgr = NULL;
-
-        wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.devmgr.queue);
      }
 
+   wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.devmgr.queue);
+
    if (_eflutil.wl.devmgr.queue)
      {
         wl_event_queue_destroy(_eflutil.wl.devmgr.queue);
@@ -1946,8 +1936,6 @@ _efl_util_wl_screenshooter_init()
    if (_wl_init() == EINA_FALSE)
      return EINA_FALSE;
 
-   wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
-
    display_wrapper = wl_proxy_create_wrapper(_eflutil.wl.dpy);
    EINA_SAFETY_ON_NULL_RETURN_VAL(display_wrapper, EINA_FALSE);
 
@@ -2008,6 +1996,8 @@ _efl_util_wl_screenshooter_deinit()
         _eflutil.wl.shot.tz_screenshooter = NULL;
      }
 
+   wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.shot.queue);
+
    if (_eflutil.wl.shot.queue)
      {
         wl_event_queue_destroy(_eflutil.wl.shot.queue);
@@ -2969,8 +2959,11 @@ efl_util_gesture_initialize(void)
         goto out; /* LCOV_EXCL_LINE */
      }
 
-   while (!_eflutil_defaultqueue.wl.gesture.proto)
-     wl_display_dispatch(_eflutil_defaultqueue.wl.dpy); /* LCOV_EXCL_LINE */
+   if (!_eflutil_defaultqueue.wl.gesture.proto)
+     {
+        set_last_result(EFL_UTIL_ERROR_NOT_SUPPORTED); /* LCOV_EXCL_LINE */
+        goto out; /* LCOV_EXCL_LINE */
+     }
 
    if (_eflutil_defaultqueue.wl.gesture.event_init <= 0)
      {
@@ -2992,6 +2985,13 @@ efl_util_gesture_initialize(void)
 
 out:
 /* LCOV_EXCL_START */
+   if (_eflutil_defaultqueue.wl.gesture.proto)
+     {
+        tizen_gesture_destroy(_eflutil_defaultqueue.wl.gesture.proto);
+        _eflutil_defaultqueue.wl.gesture.proto = NULL;
+        _eflutil_defaultqueue.wl.init = EINA_FALSE;
+     }
+
    if (gesture_h)
      {
         free(gesture_h);
@@ -3008,6 +3008,13 @@ efl_util_gesture_deinitialize(efl_util_gesture_h gesture_h)
    EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
    EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
 
+   if (_eflutil_defaultqueue.wl.gesture.proto)
+   {
+      tizen_gesture_destroy(_eflutil_defaultqueue.wl.gesture.proto);
+      _eflutil_defaultqueue.wl.gesture.proto = NULL;
+      _eflutil_defaultqueue.wl.init = EINA_FALSE;
+   }
+
    free(gesture_h);
    gesture_h = NULL;