From: Jay Lan <jlan@sgi.com>
To: Oleg Nesterov <oleg@tv-sign.ru>
Cc: Andrew Morton <akpm@osdl.org>,
Shailabh Nagar <nagar@watson.ibm.com>,
Balbir Singh <balbir@in.ibm.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/6] bacct_add_tsk: fix unsafe and wrong parent/group_leader dereference
Date: Fri, 27 Oct 2006 10:40:53 -0700 [thread overview]
Message-ID: <454244A5.6030500@sgi.com> (raw)
In-Reply-To: <20061026232106.GA523@oleg>
Oleg Nesterov wrote:
> 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.
This is right. Thanks!
>
> 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 ?
The code was borrowed from kernel/acct.c. The CSA code was extended
from the BSD accounting, so we just borrowed the basic accounting
stuff from the code.
Thanks,
- jay
>
> Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
>
> --- STATS/kernel/tsacct.c~2_par_fix 2006-10-22 18:24:03.000000000 +0400
> +++ STATS/kernel/tsacct.c 2006-10-27 01:03:26.000000000 +0400
> @@ -36,7 +36,7 @@ void bacct_add_tsk(struct taskstats *sta
>
> /* 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 *sta
> 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;
>
prev parent reply other threads:[~2006-10-27 17:40 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-10-26 23:21 [PATCH 2/6] bacct_add_tsk: fix unsafe and wrong parent/group_leader dereference Oleg Nesterov
2006-10-27 17:40 ` Jay Lan [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=454244A5.6030500@sgi.com \
--to=jlan@sgi.com \
--cc=akpm@osdl.org \
--cc=balbir@in.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=nagar@watson.ibm.com \
--cc=oleg@tv-sign.ru \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox