mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
[PATCH] bacct_add_tsk: fix unsafe and wrong parent/group_leader dereference
1. ts = timespec_sub(uptime, current->group_leader->start_time); It is possible that current != tsk. Probably it was supposed to be 'tsk->group_leader->start_time. But why we are reading group_leader's start_time ? This accounting is per thread, not per procees, I changed this to 'tsk->start_time. Please corect me. 2. stats->ac_ppid = (tsk->parent) ? tsk->parent->pid : 0; tsk->parent never == NULL, and it is unsafe to dereference it. Both the task and it's parent may exit after the caller unlocks tasklist_lock, the memory could be unmapped (DEBUG_SLAB). (And we should use ->real_parent->tgid in fact). Q: I don't understand the 'if (thread_group_leader(tsk))' check. Why it is needed ? Signed-off-by: Oleg Nesterov <[email protected]> Cc: Shailabh Nagar <[email protected]> Cc: Balbir Singh <[email protected]> Acked-by: Jay Lan <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
fca178c0c6
commit
05d5bcd60e
1 changed files with 5 additions and 2 deletions
|
|
@ -36,7 +36,7 @@ void bacct_add_tsk(struct taskstats *stats, struct task_struct *tsk)
|
|||
|
||||
/* calculate task elapsed time in timespec */
|
||||
do_posix_clock_monotonic_gettime(&uptime);
|
||||
ts = timespec_sub(uptime, current->group_leader->start_time);
|
||||
ts = timespec_sub(uptime, tsk->start_time);
|
||||
/* rebase elapsed time to usec */
|
||||
ac_etime = timespec_to_ns(&ts);
|
||||
do_div(ac_etime, NSEC_PER_USEC);
|
||||
|
|
@ -58,7 +58,10 @@ void bacct_add_tsk(struct taskstats *stats, struct task_struct *tsk)
|
|||
stats->ac_uid = tsk->uid;
|
||||
stats->ac_gid = tsk->gid;
|
||||
stats->ac_pid = tsk->pid;
|
||||
stats->ac_ppid = (tsk->parent) ? tsk->parent->pid : 0;
|
||||
rcu_read_lock();
|
||||
stats->ac_ppid = pid_alive(tsk) ?
|
||||
rcu_dereference(tsk->real_parent)->tgid : 0;
|
||||
rcu_read_unlock();
|
||||
stats->ac_utime = cputime_to_msecs(tsk->utime) * USEC_PER_MSEC;
|
||||
stats->ac_stime = cputime_to_msecs(tsk->stime) * USEC_PER_MSEC;
|
||||
stats->ac_minflt = tsk->min_flt;
|
||||
|
|
|
|||
Loading…
Reference in a new issue