From: Yunhee Seo Date: Fri, 9 Aug 2024 05:45:44 +0000 (+0900) Subject: power: Add handling code to safely manage power state waiting list X-Git-Tag: accepted/tizen/8.0/unified/20240812.154114^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=97aa77393dda9f3113e7ab4e23f288a5a4ce3e7c;p=platform%2Fcore%2Fsystem%2Fdeviced.git power: Add handling code to safely manage power state waiting list 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 --- diff --git a/src/power/power.c b/src/power/power.c index 98888b38..16a440e7 100644 --- a/src/power/power.c +++ b/src/power/power.c @@ -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));