All of lore.kernel.org
 help / color / mirror / Atom feed
From: ebiederm@xmission.com (Eric W. Biederman)
To: Oleg Nesterov <oleg@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	David Howells <dhowells@redhat.com>,
	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/1] creds: kill __task_cred()->task_is_dead() validation
Date: Wed, 11 Apr 2012 03:09:27 -0700	[thread overview]
Message-ID: <m1obqyh960.fsf@fess.ebiederm.org> (raw)
In-Reply-To: <20120410194625.GB7196@redhat.com> (Oleg Nesterov's message of "Tue, 10 Apr 2012 21:46:25 +0200")

Oleg Nesterov <oleg@redhat.com> writes:

A small nit.  The subject should be:
"Remove task_is_dead from __task_cred() validation."
there is no method __task_cred()->task_is_dead().


> commit 8f92054e:
>
>     add the following validation condition:
>
>         task->exit_state >= 0
>
>     to permit the access if the target task is dead and therefore
>     unable to change its own credentials.
>
> OK, but afaics currently this can only help wait_task_zombie() which
> calls __task_cred() without rcu lock.
>
> Remove this validation and change wait_task_zombie() to use task_uid()
> instead. This means we do rcu_read_lock() only to shut up the lockdep,
> but we already do the same in, say, wait_task_stopped().
>
> task_is_dead() should die, task->exit_state != 0 means that this task
> has passed exit_notify(), only do_wait-like code paths should use this.
>
> Unfortunately, we can't kill task_is_dead() right now, it has already
> found the bugy users in drivers/staging/, the fix already exists.

I would say task_is_dead() has already acquired buggy users in
drivers/staging.

As for the patch itself, and the direction of removing task_is_dead().
It looks good from where I sit.

Reviewed-by: "Eric W. Biederman" <ebiederm@xmission.com>

Eric


> Signed-off-by: Oleg Nesterov <oleg@redhat.com>
> ---
>  include/linux/cred.h |   10 +++-------
>  kernel/exit.c        |    2 +-
>  2 files changed, 4 insertions(+), 8 deletions(-)
>
> diff --git a/include/linux/cred.h b/include/linux/cred.h
> index adadf71..1b64c72 100644
> --- a/include/linux/cred.h
> +++ b/include/linux/cred.h
> @@ -276,17 +276,13 @@ static inline void put_cred(const struct cred *_cred)
>   * @task: The task to query
>   *
>   * Access the objective credentials of a task.  The caller must hold the RCU
> - * readlock or the task must be dead and unable to change its own credentials.
> + * readlock.
>   *
>   * The result of this function should not be passed directly to get_cred();
>   * rather get_task_cred() should be used instead.
>   */
> -#define __task_cred(task)						\
> -	({								\
> -		const struct task_struct *__t = (task);			\
> -		rcu_dereference_check(__t->real_cred,			\
> -				      task_is_dead(__t));		\
> -	})
> +#define __task_cred(task)	\
> +	rcu_dereference((task)->real_cred)
>  
>  /**
>   * get_current_cred - Get the current task's subjective credentials
> diff --git a/kernel/exit.c b/kernel/exit.c
> index 4b4042f..7b36288 100644
> --- a/kernel/exit.c
> +++ b/kernel/exit.c
> @@ -1214,7 +1213,7 @@ static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p)
>  	unsigned long state;
>  	int retval, status, traced;
>  	pid_t pid = task_pid_vnr(p);
> -	uid_t uid = __task_cred(p)->uid;
> +	uid_t uid = task_uid(p);
>  	struct siginfo __user *infop;
>  
>  	if (!likely(wo->wo_flags & WEXITED))

  reply	other threads:[~2012-04-11 10:05 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-04-10 19:45 [PATCH 0/1] 3rd resend: kill __task_cred()->task_is_dead() Oleg Nesterov
2012-04-10 19:46 ` [PATCH 1/1] creds: kill __task_cred()->task_is_dead() validation Oleg Nesterov
2012-04-11 10:09   ` Eric W. Biederman [this message]
2012-04-11 18:52     ` Oleg Nesterov
2012-04-11 10:41 ` David Howells

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=m1obqyh960.fsf@fess.ebiederm.org \
    --to=ebiederm@xmission.com \
    --cc=akpm@linux-foundation.org \
    --cc=dhowells@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=oleg@redhat.com \
    --cc=paulmck@linux.vnet.ibm.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.