From d9391310735bf664a5af662d3e52ac824ad814e2 Mon Sep 17 00:00:00 2001 From: wangxiaoyao Date: Thu, 20 Jul 2023 14:09:58 +0800 Subject: [PATCH] [component/lwp] fix possible memory leak of posix timer on program exit Signed-off-by: Shell --- components/libc/compilers/common/ctime.c | 21 +++++++++++++++++++++ components/lwp/lwp.h | 4 ++++ components/lwp/lwp_pid.c | 2 ++ 3 files changed, 27 insertions(+) diff --git a/components/libc/compilers/common/ctime.c b/components/libc/compilers/common/ctime.c index 4f3e424f68c..6ab65ccb457 100644 --- a/components/libc/compilers/common/ctime.c +++ b/components/libc/compilers/common/ctime.c @@ -713,9 +713,11 @@ struct timer_obj rt_uint32_t status; int sigev_signo; clockid_t clockid; + timer_t timer_id; #ifdef RT_USING_SMART pid_t pid; struct rt_work *work; + rt_list_t lwp_node; #endif }; @@ -763,6 +765,17 @@ static void _lwp_timer_event_from_pid(struct rt_work *work, void *param) rt_free(work); } + +int timer_list_free(rt_list_t *timer_list) +{ + struct timer_obj *pos, *n; + rt_list_for_each_entry_safe(pos, n, timer_list, lwp_node) + { + timer_delete(pos->timer_id); + } + return 0; +} + #endif /* RT_USING_SMART */ static void rtthread_timer_wrapper(void *timerobj) @@ -881,6 +894,7 @@ int timer_create(clockid_t clockid, struct sigevent *evp, timer_t *timerid) if (lwp) { timer->pid = lwp_self()->pid; + rt_list_insert_after(&lwp->timer, &timer->lwp_node); } else { @@ -908,6 +922,8 @@ int timer_create(clockid_t clockid, struct sigevent *evp, timer_t *timerid) return -1; /* todo:memory leak */ } _g_timerid[_timerid] = timer; + + timer->timer_id = (timer_t)(rt_ubase_t)_timerid; *timerid = (timer_t)(rt_ubase_t)_timerid; return 0; @@ -953,6 +969,11 @@ int timer_delete(timer_t timerid) } rt_ktime_hrtimer_detach(&timer->hrtimer); +#ifdef RT_USING_SMART + if (timer->pid) + rt_list_remove(&timer->lwp_node); +#endif + rt_free(timer); return 0; } diff --git a/components/lwp/lwp.h b/components/lwp/lwp.h index b9cc9c7aae7..2924a99c819 100644 --- a/components/lwp/lwp.h +++ b/components/lwp/lwp.h @@ -106,6 +106,7 @@ struct rt_lwp pid_t tty_old_pgrp; pid_t session; rt_list_t t_grp; + rt_list_t timer; /* POSIX timer object binding to a process */ int leader; /*boolean value for session group_leader*/ struct dfs_fdtable fdt; @@ -165,6 +166,9 @@ void lwp_user_setting_save(rt_thread_t thread); void lwp_user_setting_restore(rt_thread_t thread); int lwp_setaffinity(pid_t pid, int cpu); +/* ctime lwp API */ +int timer_list_free(rt_list_t *timer_list); + #ifdef ARCH_MM_MMU struct __pthread { /* Part 1 -- these fields may be external or diff --git a/components/lwp/lwp_pid.c b/components/lwp/lwp_pid.c index 82d9c30570b..461ada6c368 100644 --- a/components/lwp/lwp_pid.c +++ b/components/lwp/lwp_pid.c @@ -327,6 +327,7 @@ struct rt_lwp* lwp_new(void) lwp->session = -1; lwp->tty = RT_NULL; rt_list_init(&lwp->t_grp); + rt_list_init(&lwp->timer); lwp_user_object_lock_init(lwp); lwp->address_search_head = RT_NULL; rt_wqueue_init(&lwp->wait_queue); @@ -502,6 +503,7 @@ void lwp_free(struct rt_lwp* lwp) } } + timer_list_free(&lwp->timer); lwp_pid_put(lwp_to_pid(lwp)); rt_hw_interrupt_enable(level); rt_free(lwp);