power: Add handling code to safely manage power state waiting list 00/315900/3 accepted/tizen/8.0/unified/20240812.154114
authorYunhee Seo <yuni.seo@samsung.com>
Fri, 9 Aug 2024 05:45:44 +0000 (14:45 +0900)
committerYunhee Seo <yuni.seo@samsung.com>
Fri, 9 Aug 2024 08:26:13 +0000 (17:26 +0900)
While the power state is changing, power state change waiting list can be cleaned up.
However before cleaning up, if remove_change_state_wait() was called,
struct csw in the waiting list can be free twice.
To avoid double free problem, handling code is added.

Change-Id: Id4646b2656688c2f9e091033f7b6ab3e08c930fa
Signed-off-by: Yunhee Seo <yuni.seo@samsung.com>
src/power/power.c

index 98888b38be0fe38a2710e8310cd490e28206ef75..16a440e759b8458fe4d5e1edaee445fbb2f66248 100644 (file)
@@ -199,6 +199,22 @@ int add_change_state_wait(pid_t pid, guint64 state)
        return 0;
 }
 
+static void remove_csw_element_from_waiting_list(struct proc_info* pi, guint64 state)
+{
+       GList *iterator = transition_context.waitings;
+
+       while (iterator != NULL) {
+               struct change_state_wait *csw = (struct change_state_wait *)iterator->data;
+               if (csw->pi->pid == pi->pid && csw->state == state) {
+                       transition_context.waitings = g_list_remove_link(transition_context.waitings, iterator);
+                       free(g_steal_pointer(&iterator->data));
+                       g_list_free(iterator);
+                       return;
+               }
+               iterator = g_list_next(iterator);
+       }
+}
+
 void remove_change_state_wait(pid_t pid, guint64 state)
 {
        struct proc_info *pi = NULL;
@@ -216,6 +232,7 @@ void remove_change_state_wait(pid_t pid, guint64 state)
        _D("pid=%d(%s) removed csw for %#"PRIx64, pi->pid, pi->comm, state);
 
        pi->state_bitmap &= ~state;
+       remove_csw_element_from_waiting_list(pi, state);
        if (pi->state_bitmap == 0) {
                proc_list = g_list_remove_link(proc_list, l);
                free(g_steal_pointer(&l->data));