All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oleg Nesterov <oleg@redhat.com>
To: Richard Guy Briggs <rgb@redhat.com>
Cc: peterz@infradead.org, linux-kernel@vger.kernel.org,
	linux-audit@redhat.com,
	"Eric W. Biederman" <ebiederm@xmission.com>,
	akpm@linux-foundation.org
Subject: Re: [PATCH 4/7] pid: modify task_tgid_nr to work without task->tgid.
Date: Mon, 24 Feb 2014 19:40:13 +0100	[thread overview]
Message-ID: <20140224184013.GB21474@redhat.com> (raw)
In-Reply-To: <20140221204752.GF16640@madcap2.tricolour.ca>

On 02/21, Richard Guy Briggs wrote:
>
> On 14/02/20, Oleg Nesterov wrote:
> > On 01/23, Richard Guy Briggs wrote:
> > >
> > > task->tgid is an error prone construct and results in duplicate maintenance.
> > > Start it's demise by modifying task_tgid_nr to not use it.
> >
> > Well, I disagree.
> >
> > Yes I agree that ->tgid should probably die. But this change itself doesn't
> > help, it only makes task_tgid_nr() slower. We need to convert other users
> > first, then consider this change along with ->tgid removal.
>
> I thought I recently saw a statistic that there were only 7 instances of
> ->tgid, but a quick search comes up with >50 outside of audit!

Yes, so I don't think it makes sense to start from task_tgid_nr().

> > > -	return tsk->tgid;
> > > +	return pid_nr(task_tgid(tsk));
> > >  }
> >
> > And what protect task_tgid? This is racy.
> >
> > The race is very unlikely, pid_nr() will likely hit pid == NULL if tsk
> > exits. But still it can use the freed/unmapped/reused memory.
>
> So at the very least, I'd need
>
> static inline pid_t task_tgid_nr(struct task_struct *tsk)
> {
> 	return pid_nr(is_alive(tsk) ? task_tgid(tsk) : NULL);
> }
>
> And it sounds like I might even need this since the status of is_alive
> could change between the time I call it and the time I call task_tgid:
>
> static inline pid_t task_tgid_nr(struct task_struct *tsk)
> {
> 	pid_t pid;
>
> 	task_lock(&tsk);
> 	pid = pid_nr(is_alive(tsk) ? task_tgid(tsk) : NULL);
> 	task_unlock(&tsk);
> 	return pid;
> }
>
> Is task_lock() sufficient, or do I need the heavier
> read_lock(&tasklist_lock)?

You need rcu_read_lock(), I think. In any case task_lock() has nothing to
do with pids.

> > And even if we add rcu_read_lock() the patch will add the semantics change,
> > task_tgid_nr() can return 0 if tsk has already exited. At least this should
> > be documented, but you also need to audit the users.
>
> Basically check for an inline error return of 0 signalling a failure
> rather than the idle task.

Perhaps...

Oleg.

WARNING: multiple messages have this Message-ID (diff)
From: Oleg Nesterov <oleg@redhat.com>
To: Richard Guy Briggs <rgb@redhat.com>
Cc: linux-audit@redhat.com, linux-kernel@vger.kernel.org,
	eparis@redhat.com, sgrubb@redhat.com, akpm@linux-foundation.org,
	peterz@infradead.org, "Eric W. Biederman" <ebiederm@xmission.com>
Subject: Re: [PATCH 4/7] pid: modify task_tgid_nr to work without task->tgid.
Date: Mon, 24 Feb 2014 19:40:13 +0100	[thread overview]
Message-ID: <20140224184013.GB21474@redhat.com> (raw)
In-Reply-To: <20140221204752.GF16640@madcap2.tricolour.ca>

On 02/21, Richard Guy Briggs wrote:
>
> On 14/02/20, Oleg Nesterov wrote:
> > On 01/23, Richard Guy Briggs wrote:
> > >
> > > task->tgid is an error prone construct and results in duplicate maintenance.
> > > Start it's demise by modifying task_tgid_nr to not use it.
> >
> > Well, I disagree.
> >
> > Yes I agree that ->tgid should probably die. But this change itself doesn't
> > help, it only makes task_tgid_nr() slower. We need to convert other users
> > first, then consider this change along with ->tgid removal.
>
> I thought I recently saw a statistic that there were only 7 instances of
> ->tgid, but a quick search comes up with >50 outside of audit!

Yes, so I don't think it makes sense to start from task_tgid_nr().

> > > -	return tsk->tgid;
> > > +	return pid_nr(task_tgid(tsk));
> > >  }
> >
> > And what protect task_tgid? This is racy.
> >
> > The race is very unlikely, pid_nr() will likely hit pid == NULL if tsk
> > exits. But still it can use the freed/unmapped/reused memory.
>
> So at the very least, I'd need
>
> static inline pid_t task_tgid_nr(struct task_struct *tsk)
> {
> 	return pid_nr(is_alive(tsk) ? task_tgid(tsk) : NULL);
> }
>
> And it sounds like I might even need this since the status of is_alive
> could change between the time I call it and the time I call task_tgid:
>
> static inline pid_t task_tgid_nr(struct task_struct *tsk)
> {
> 	pid_t pid;
>
> 	task_lock(&tsk);
> 	pid = pid_nr(is_alive(tsk) ? task_tgid(tsk) : NULL);
> 	task_unlock(&tsk);
> 	return pid;
> }
>
> Is task_lock() sufficient, or do I need the heavier
> read_lock(&tasklist_lock)?

You need rcu_read_lock(), I think. In any case task_lock() has nothing to
do with pids.

> > And even if we add rcu_read_lock() the patch will add the semantics change,
> > task_tgid_nr() can return 0 if tsk has already exited. At least this should
> > be documented, but you also need to audit the users.
>
> Basically check for an inline error return of 0 signalling a failure
> rather than the idle task.

Perhaps...

Oleg.


  reply	other threads:[~2014-02-24 18:40 UTC|newest]

Thread overview: 147+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-20 21:31 [PATCH 00/12] RFC: steps to make audit pid namespace-safe Richard Guy Briggs
2013-08-20 21:31 ` [PATCH 01/12] audit: Kill the unused struct audit_aux_data_capset Richard Guy Briggs
2013-08-20 21:31 ` [PATCH 02/12] audit: fix netlink portid naming and types Richard Guy Briggs
2013-08-20 21:31 ` [PATCH 03/12] pid: get ppid pid_t of task in init_pid_ns safely Richard Guy Briggs
2013-08-27 17:21   ` Oleg Nesterov
2013-08-30 19:56     ` Richard Guy Briggs
2013-08-30 19:56       ` Richard Guy Briggs
2013-08-30 20:37       ` John Johansen
2013-08-30 22:41         ` [PATCH 1/3] apparmor: fix capability to not use the current task, during reporting John Johansen
2013-08-30 22:42         ` [PATCH 2/3] apparmor: remove tsk field from the apparmor_audit_struct John Johansen
2013-08-30 22:43         ` [PATCH 03/3] apparmor: remove parent task info from audit logging John Johansen
2013-09-03 18:31         ` [PATCH 03/12] pid: get ppid pid_t of task in init_pid_ns safely Richard Guy Briggs
2013-09-03 18:31           ` Richard Guy Briggs
2013-12-11 14:47           ` Richard Guy Briggs
2013-12-11 16:44             ` John Johansen
2013-12-11 17:19               ` Richard Guy Briggs
2013-08-20 21:31 ` [PATCH 04/12] audit: convert PPIDs to the inital PID namespace Richard Guy Briggs
2013-08-20 21:31 ` [PATCH 05/12] pid: get pid_t of task in init_pid_ns correctly Richard Guy Briggs
2013-08-20 21:31 ` [PATCH 06/12] audit: Simplify and correct audit_log_capset Richard Guy Briggs
2013-08-20 21:31 ` [PATCH 07/12] audit: store audit_pid as a struct pid pointer Richard Guy Briggs
2013-08-20 21:32 ` [PATCH 08/12] audit: anchor all pid references in the initial pid namespace Richard Guy Briggs
2013-08-20 21:32 ` [PATCH 09/12] pid: modify task_pid_nr to work without task->pid Richard Guy Briggs
2013-12-16 21:03   ` [PATCH] pid: change task_struct::pid to read-only Richard Guy Briggs
2013-12-17  9:58     ` Peter Zijlstra
2013-12-20  4:48       ` Richard Guy Briggs
2013-12-20  8:58         ` Peter Zijlstra
2013-12-20 14:04           ` Richard Guy Briggs
2014-01-23 19:32             ` [PATCH 0/7][RFC] pid: changes to support audit Richard Guy Briggs
2014-01-23 19:32               ` Richard Guy Briggs
2014-01-23 19:32               ` [PATCH 1/7] pid: change task_struct::pid to read-only Richard Guy Briggs
2014-01-23 19:32               ` [PATCH 2/7] compiler: CONST_CAST makes writing const vars easier and obvious Richard Guy Briggs
2014-01-23 19:32                 ` Richard Guy Briggs
2014-01-23 19:32               ` [PATCH 3/7] pid: use the CONST_CAST macro instead to write to const task_struct::pid Richard Guy Briggs
2014-01-23 19:32                 ` Richard Guy Briggs
2014-01-23 19:32               ` [PATCH 4/7] pid: modify task_tgid_nr to work without task->tgid Richard Guy Briggs
2014-01-23 19:32                 ` Richard Guy Briggs
2014-02-20 18:35                 ` Oleg Nesterov
2014-02-21 20:47                   ` Richard Guy Briggs
2014-02-21 20:47                     ` Richard Guy Briggs
2014-02-24 18:40                     ` Oleg Nesterov [this message]
2014-02-24 18:40                       ` Oleg Nesterov
2014-01-23 19:32               ` [PATCH 5/7] pid: rewrite task helper function is_global_init() avoiding task->pid Richard Guy Briggs
2014-01-23 19:32                 ` Richard Guy Briggs
2014-02-20 18:39                 ` Oleg Nesterov
2014-02-20 18:39                   ` Oleg Nesterov
2014-02-21 16:10                   ` Richard Guy Briggs
2014-02-21 16:10                     ` Richard Guy Briggs
2014-01-23 19:32               ` [PATCH 6/7] pid: mark struct task const in helper functions Richard Guy Briggs
2014-01-23 19:32                 ` Richard Guy Briggs
2014-01-23 19:32               ` [PATCH 7/7] pid: get pid_t ppid of task in init_pid_ns Richard Guy Briggs
2014-02-20 19:01                 ` Oleg Nesterov
2014-02-20 19:01                   ` Oleg Nesterov
2014-02-21 18:10                   ` Richard Guy Briggs
2014-02-21 18:10                     ` Richard Guy Briggs
2014-02-24 18:32                     ` Oleg Nesterov
2014-02-24 18:32                       ` Oleg Nesterov
2014-03-17 20:14                 ` Tony Luck
2014-03-17 20:15                   ` Eric Paris
2014-01-23 21:25               ` [PATCH 0/7][RFC] pid: changes to support audit Peter Zijlstra
2014-01-24  6:14                 ` Richard Guy Briggs
2014-01-24  6:14                   ` Richard Guy Briggs
2014-01-24  8:52                   ` Peter Zijlstra
2014-01-24 14:31                     ` Richard Guy Briggs
2014-01-24 14:31                       ` Richard Guy Briggs
2014-02-19 16:18               ` Richard Guy Briggs
2014-02-19 17:47                 ` Oleg Nesterov
2014-02-19 18:15                   ` Richard Guy Briggs
2014-02-19 18:15                     ` Richard Guy Briggs
2014-02-20 19:08                     ` Oleg Nesterov
2013-12-20  4:48       ` [PATCH] pid: change task_struct::pid to read-only Richard Guy Briggs
2013-12-17  9:59     ` Peter Zijlstra
2013-12-17 15:36     ` Oleg Nesterov
2013-12-17 15:40       ` Oleg Nesterov
2013-12-20 19:01         ` Oleg Nesterov
2013-12-20 20:19           ` Richard Guy Briggs
2013-12-20 20:19           ` Richard Guy Briggs
2013-12-20 21:33           ` Peter Zijlstra
2013-12-22 16:03             ` Oleg Nesterov
2014-01-23 19:24               ` Richard Guy Briggs
2014-01-23 19:24                 ` Richard Guy Briggs
2013-08-20 21:32 ` [PATCH 10/12] pid: modify task_tgid_nr to work without task->tgid Richard Guy Briggs
2013-08-20 21:32 ` [PATCH 11/12] pid: rewrite task helper functions avoiding task->pid and task->tgid Richard Guy Briggs
2013-08-22 19:08   ` Oleg Nesterov
2013-08-26 22:07     ` Richard Guy Briggs
2013-08-26 22:07       ` Richard Guy Briggs
2013-08-27 16:15       ` Oleg Nesterov
2013-12-16 17:35       ` Richard Guy Briggs
2013-12-16 17:35         ` Richard Guy Briggs
2013-12-16 21:05         ` Oleg Nesterov
2013-12-16 22:20           ` Richard Guy Briggs
2013-12-16 22:20             ` Richard Guy Briggs
2013-12-17  9:34             ` Peter Zijlstra
2013-12-17  9:48               ` Peter Zijlstra
2013-12-20  4:54               ` Richard Guy Briggs
2013-12-20  4:54               ` Richard Guy Briggs
2013-08-22 20:05   ` Peter Zijlstra
2013-08-22 21:43     ` Richard Guy Briggs
2013-08-22 21:43       ` Richard Guy Briggs
2013-08-23  6:36       ` Peter Zijlstra
2013-08-27  2:37         ` Richard Guy Briggs
2013-08-27  2:37           ` Richard Guy Briggs
2013-08-27 12:11           ` Peter Zijlstra
2013-08-27 21:35             ` Eric W. Biederman
2013-08-28  8:16               ` Peter Zijlstra
2013-08-23 19:28       ` Oleg Nesterov
2013-08-27  3:04         ` Richard Guy Briggs
2013-08-27  3:04           ` Richard Guy Briggs
2013-08-27 17:11           ` Oleg Nesterov
2013-08-30 19:06             ` audit looks unmaintained? [was: Re: [PATCH 11/12] pid: rewrite task helper functions avoiding task->pid and task->tgid] Richard Guy Briggs
2013-08-30 19:54               ` Steve Grubb
2013-09-08 15:54                 ` Oleg Nesterov
2013-09-10 17:20                   ` Oleg Nesterov
2013-09-13 18:42                     ` Steve Grubb
2013-09-14 18:10                       ` Oleg Nesterov
2013-09-13 18:28                   ` Steve Grubb
2013-09-14 18:08                     ` Oleg Nesterov
2013-08-20 21:32 ` [PATCH 12/12] pid: mark struct task const in helper functions Richard Guy Briggs
2013-12-23 22:27 ` [PATCH 0/5][RFC][v2] steps to make audit pid namespace-safe Richard Guy Briggs
2013-12-23 22:27   ` Richard Guy Briggs
2013-12-23 22:27   ` [PATCH 1/5] pid: get pid_t ppid of task in init_pid_ns Richard Guy Briggs
2013-12-23 22:27     ` Richard Guy Briggs
2013-12-30 17:04     ` Oleg Nesterov
2013-12-23 22:27   ` [PATCH 2/5] audit: convert PPIDs to the inital PID namespace Richard Guy Briggs
2013-12-30 17:07     ` Oleg Nesterov
2013-12-23 22:27   ` [PATCH 3/5] audit: store audit_pid as a struct pid pointer Richard Guy Briggs
2013-12-23 22:27     ` Richard Guy Briggs
2013-12-30 17:51     ` Oleg Nesterov
2014-01-21 23:37       ` Richard Guy Briggs
2013-12-23 22:27   ` [PATCH 4/5] audit: anchor all pid references in the initial pid namespace Richard Guy Briggs
2013-12-23 22:27     ` Richard Guy Briggs
2013-12-30 18:06     ` Oleg Nesterov
2014-02-19 20:28       ` Richard Guy Briggs
2014-02-19 20:28         ` Richard Guy Briggs
2013-12-23 22:27   ` [PATCH 5/5] audit: allow user processes to log from another PID namespace Richard Guy Briggs
2013-12-23 22:27     ` Richard Guy Briggs
2014-02-19 20:57   ` [PATCH 0/5][RFC][v3] steps to make audit pid namespace-safe Richard Guy Briggs
2014-02-19 20:57     ` Richard Guy Briggs
2014-02-19 20:57     ` [PATCH 1/5] pid: get pid_t ppid of task in init_pid_ns Richard Guy Briggs
2014-02-19 20:57       ` Richard Guy Briggs
2014-02-19 20:57     ` [PATCH 2/5] audit: convert PPIDs to the inital PID namespace Richard Guy Briggs
2014-02-19 20:57       ` Richard Guy Briggs
2014-02-19 20:57     ` [PATCH 3/5] audit: store audit_pid as a struct pid pointer Richard Guy Briggs
2014-02-19 20:57       ` Richard Guy Briggs
2014-02-19 20:57     ` [PATCH 4/5] audit: anchor all pid references in the initial pid namespace Richard Guy Briggs
2014-02-19 20:57       ` Richard Guy Briggs
2014-02-19 20:57     ` [PATCH 5/5] audit: allow user processes to log from another PID namespace Richard Guy Briggs
2014-02-19 20:57       ` Richard Guy Briggs

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=20140224184013.GB21474@redhat.com \
    --to=oleg@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=ebiederm@xmission.com \
    --cc=linux-audit@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=peterz@infradead.org \
    --cc=rgb@redhat.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.