Fix bugs for removing data in g_slist 12/232912/2
authorInkyun Kil <inkyun.kil@samsung.com>
Fri, 8 May 2020 08:43:10 +0000 (17:43 +0900)
committerInkyun Kil <inkyun.kil@samsung.com>
Fri, 8 May 2020 08:51:59 +0000 (17:51 +0900)
Change-Id: I6ba3c93578170b6ed8c3a5490943f2beb108d99b
Signed-off-by: Inkyun Kil <inkyun.kil@samsung.com>
include/alarm-internal.h
server/alarm-manager-dbus.c
server/alarm-manager-schedule.c
server/alarm-manager.c

index b95a43c..b9c6180 100644 (file)
@@ -160,7 +160,7 @@ typedef struct _bg_category_cb_info_t {
        bool has_bg;
 } bg_category_cb_info_t;
 
-void _release_alarm_info_t();
+void _release_alarm_info_t(__alarm_info_t *entry);
 
 void _alarm_set_next_duetime(__alarm_info_t *alarm_info);
 void _alarm_schedule();
index 66a1bb5..db290cc 100644 (file)
@@ -782,9 +782,11 @@ static void __on_bus_name_owner_changed(GDBusConnection  *connection,
        if (signal_name && strcmp(signal_name, "NameOwnerChanged") == 0) {
                g_variant_get(parameters, "(&sss)", &service_name, NULL, NULL);
 
-               for (entry = g_expired_alarm_list; entry; entry = entry->next) {
-                       if (entry->data) {
-                               expire_info = (__expired_alarm_t *) entry->data;
+               for (entry = g_expired_alarm_list; entry;) {
+                       expire_info = (__expired_alarm_t *) entry->data;
+                       entry = entry->next;
+
+                       if (expire_info) {
                                SECURE_LOGD("expired service(%s), owner changed service(%s)",
                                                expire_info->service_name, service_name);
 
@@ -797,7 +799,7 @@ static void __on_bus_name_owner_changed(GDBusConnection  *connection,
                                                        0,
                                                        expire_info->uid);
                                        g_expired_alarm_list =
-                                               g_slist_remove(g_expired_alarm_list, entry->data);
+                                               g_slist_remove(g_expired_alarm_list, (gpointer)expire_info);
                                        g_free(expire_info);
                                }
                        }
index d89e2c7..e454c85 100644 (file)
@@ -464,13 +464,12 @@ static bool __find_next_alarm_to_be_scheduled(time_t *min_due_time)
 
        time(&current_time);
 
-       for (iter = alarm_context.alarms; iter != NULL;
-                       iter = g_slist_next(iter)) {
+       for (iter = alarm_context.alarms; iter != NULL;) {
                entry = (__alarm_info_t *)iter->data;
                due_time = entry->due_time;
-
                double interval = 0;
 
+               iter = g_slist_next(iter);
                SECURE_LOGD("alarm[%d] with duetime(%ld) at current(%ld) - (%s) z:%d",
                                entry->alarm_id, due_time, current_time,
                                entry->app_unique_name, (int)entry->zombie_mode);
@@ -496,7 +495,7 @@ static bool __find_next_alarm_to_be_scheduled(time_t *min_due_time)
 
                                _save_alarm_info_log("AUTO_DELETE", entry);
 
-                               alarm_context.alarms = g_slist_remove(alarm_context.alarms, iter->data);
+                               alarm_context.alarms = g_slist_remove(alarm_context.alarms, (gpointer)entry);
                                _release_alarm_info_t(entry);
                                continue;
                        } else {
index f545ed5..4122372 100644 (file)
@@ -659,12 +659,12 @@ static void __alarm_update_due_time_of_all_items_in_list(time_t new_time, double
 
        time(&current_time);
 
-       for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) {
+       for (iter = alarm_context.alarms; iter != NULL;) {
                entry = (__alarm_info_t *)iter->data;
                due_time = entry->due_time;
 
                double interval = 0;
-
+               iter = g_slist_next(iter);
                LOGD("alarm[%d] with duetime(%ld) at current(%ld)", entry->alarm_id, due_time, current_time);
                if (due_time == 0) {    /* 0 means this alarm has been disabled */
                        continue;
@@ -686,7 +686,7 @@ static void __alarm_update_due_time_of_all_items_in_list(time_t new_time, double
 
                                _save_alarm_info_log("AUTO_DELETE", entry);
 
-                               alarm_context.alarms = g_slist_remove(alarm_context.alarms, iter->data);
+                               alarm_context.alarms = g_slist_remove(alarm_context.alarms, (gpointer)entry);
                                _release_alarm_info_t(entry);
                                continue;
                        } else {