Fix memory management issues 52/301152/4 accepted/tizen/unified/20231121.180408
authorArtur Świgoń <a.swigon@samsung.com>
Thu, 9 Nov 2023 15:41:42 +0000 (16:41 +0100)
committerArtur Świgoń <a.swigon@samsung.com>
Tue, 14 Nov 2023 18:05:18 +0000 (19:05 +0100)
Change-Id: Ic276eb376e9d5246c3f366c6c57449e47cfce840

src/window_tracker.c

index 2741dbb1b90e5d2e7626e669a713871542224fcf..e2aa7c4155b89992d0b8190d8f7685d25e3578a5 100644 (file)
@@ -196,6 +196,11 @@ static uint32_t _window_resource_id_get(AtspiAccessible *window)
 static void _window_append(WindowTrackerData *wtd, AtspiAccessible *window, Eina_Bool view_change_need,
                                                   Eina_Bool keyboard_window_is, WindowActivateInfoType window_activate_info_type)
 {
+       // Increase reference count immediately to guard against g_object_unref() in the loop below.
+       // This is a danger only if 'window == wi->window', which is a stricter condition than
+       // atspi_accessible_is_equal(window, wi->window), which can be true even if 'window != wi->window'.
+       g_object_ref(window);
+
        _purge_windows_list(wtd);
        /* Remove window first if it exists already */
        WindowInfo *wi;
@@ -213,9 +218,10 @@ static void _window_append(WindowTrackerData *wtd, AtspiAccessible *window, Eina
        wi = g_malloc0(sizeof(WindowInfo));
        if (!wi) {
                DEBUG("Memory allocation by g_malloc0 is failed");
+               g_object_unref(window);
                return;
        }
-       wi->window = g_object_ref(window);
+       wi->window = window;
        wi->keyboard_window_is = keyboard_window_is;
        wi->view_change_need = view_change_need;
        wi->window_activate_info_type = window_activate_info_type;
@@ -315,8 +321,11 @@ static void _window_remove(WindowTrackerData *wtd, AtspiAccessible *window)
                                gchar *id = atspi_accessible_get_unique_id(wi->window, NULL);
                                DEBUG("Check upper window: %s, keyboard window: %d", id, wi->keyboard_window_is);
                                g_free(id);
-                               if (wi->keyboard_window_is)
+                               if (wi->keyboard_window_is) {
                                        wtd->window_infos = eina_list_remove(wtd->window_infos, wi);
+                                       g_object_unref(wi->window);
+                                       g_free(wi);
+                               }
                        } else
                                DEBUG("Current window info list is emtpy");
                }
@@ -424,7 +433,7 @@ _remove_window_under_bus(WindowTrackerData *wtd, const char *bus)
                g_free(bus_name);
        }
 
-       EINA_LIST_FOREACH(window_list, l, window) {
+       EINA_LIST_FREE(window_list, window) {
                _window_remove(wtd, window);
                g_object_unref(window);
        }