From 725636e73a91cc42478af997a2832d7fe5e822db Mon Sep 17 00:00:00 2001 From: Vyacheslav Cherkashin Date: Tue, 19 Apr 2016 17:51:36 +0300 Subject: [PATCH] [FIX] warning in ktd_exit() Set proc pointer to NULL before free Change-Id: I2fd81a84b55c9b8bdbfc7809e7ab5abfeb24aaf5 Signed-off-by: Vyacheslav Cherkashin --- us_manager/pf/pf_group.c | 1 - us_manager/sspt/sspt_proc.c | 15 +++++++++++++-- us_manager/sspt/sspt_proc.h | 1 - 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/us_manager/pf/pf_group.c b/us_manager/pf/pf_group.c index 4a81560..0850323 100644 --- a/us_manager/pf/pf_group.c +++ b/us_manager/pf/pf_group.c @@ -650,7 +650,6 @@ static void mmr_from_exit(struct sspt_proc *proc) uninstall_proc(proc); pfg_all_del_proc(proc); - sspt_reset_proc(proc->leader); } static void mmr_from_exec(struct sspt_proc *proc) diff --git a/us_manager/sspt/sspt_proc.c b/us_manager/sspt/sspt_proc.c index f5e2512..3b0b691 100644 --- a/us_manager/sspt/sspt_proc.c +++ b/us_manager/sspt/sspt_proc.c @@ -152,7 +152,7 @@ void sspt_change_leader(struct task_struct *prev, struct task_struct *next) spin_unlock(&prev_kproc->lock); } -void sspt_reset_proc(struct task_struct *task) +static void sspt_reset_proc(struct task_struct *task) { struct ktd_proc *kproc; @@ -197,6 +197,14 @@ static struct sspt_proc *sspt_proc_create(struct task_struct *leader) return proc; } +static void sspt_proc_free(struct sspt_proc *proc) +{ + put_task_struct(proc->leader); + free_sm_us(proc->sm); + sspt_destroy_feature(proc->feature); + kfree(proc); +} + /** * @brief Remove sspt_proc struct * @@ -221,6 +229,7 @@ void sspt_proc_cleanup(struct sspt_proc *proc) sspt_destroy_feature(proc->feature); free_sm_us(proc->sm); + sspt_reset_proc(proc->leader); sspt_proc_put(proc); } @@ -243,6 +252,8 @@ void sspt_proc_put(struct sspt_proc *proc) proc->__task = NULL; } + WARN_ON(kproc_by_task(proc->leader)->proc); + put_task_struct(proc->leader); kfree(proc); } @@ -334,7 +345,7 @@ struct sspt_proc *sspt_proc_get_by_task_or_new(struct task_struct *task) spin_unlock(&kproc->lock); if (proc) - sspt_proc_cleanup(proc); + sspt_proc_free(proc); out: return kproc->proc; diff --git a/us_manager/sspt/sspt_proc.h b/us_manager/sspt/sspt_proc.h index ec7a133..187e8c5 100644 --- a/us_manager/sspt/sspt_proc.h +++ b/us_manager/sspt/sspt_proc.h @@ -139,7 +139,6 @@ int sspt_proc_cb_set(struct sspt_proc_cb *cb); void sspt_proc_priv_create(struct sspt_proc *proc); void sspt_proc_priv_destroy(struct sspt_proc *proc); -void sspt_reset_proc(struct task_struct *task); void sspt_change_leader(struct task_struct *prev, struct task_struct *next); int sspt_proc_init(void); void sspt_proc_uninit(void); -- 2.7.4