All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oleg Nesterov <oleg@redhat.com>
To: Cyrill Gorcunov <gorcunov@openvz.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
	Pavel Emelyanov <xemul@parallels.com>,
	Kees Cook <keescook@chromium.org>, Tejun Heo <tj@kernel.org>
Subject: Re: [RFC] c/r: prctl: Add ability to set new mm_struct::exe_file
Date: Wed, 29 Feb 2012 20:24:00 +0100	[thread overview]
Message-ID: <20120229192400.GA13194@redhat.com> (raw)
In-Reply-To: <20120229151634.GE4796@moon>

On 02/29, Cyrill Gorcunov wrote:
>
> +static int prctl_set_mm_exe_file(struct mm_struct *mm,
> +				 const void __user *path,
> +				 size_t size)
> +{
> +	struct file *new_exe_file;
> +	char *pathbuf;
> +	int ret = 0;
> +
> +	if (size >= PATH_MAX)
> +		return -EINVAL;
> +
> +	/*
> +	 * We allow to change only those exe's which
> +	 * are not mapped several times. This one
> +	 * is early test while mmap_sem is taken.
> +	 */
> +	if (mm->num_exe_file_vmas > 1)
> +		return -EBUSY;

I don't really understand this check, but it is racy. Another thread
can change ->num_exe_file_vmas right after the check.

> +       up_read(&mm->mmap_sem);

up? I do not see down...

> +	new_exe_file = open_exec(pathbuf);
> +	kfree(pathbuf);
> +
> +	down_read(&mm->mmap_sem);

probably you meant "up" here. OK, I am ignoring ->mmap_sem, I can't
understand what did you really mean ;)

> +	if (IS_ERR(new_exe_file))
> +		return PTR_ERR(new_exe_file);
> +
> +	/*
> +	 * We allow to change only those exe's which
> +	 * are not mapped several times.
> +	 */
> +	if (mm->num_exe_file_vmas < 2) {
> +		set_mm_exe_file(mm, new_exe_file);
> +		ret = 0;
> +	} else
> +		ret = -EBUSY;
> +
> +	return ret;

Both success/EBUSY leak new_exe_file. And I agree with Pavel,
prctl_set_mm_exe_file() should take fd, not filename.

I simply can't understand why set_mm_exe_file() is safe. What
if we race with another thread doing set_mm_exe_file() too?
Or it can race with added_exe_file_vma/removed_exe_file_vma.

And. set_mm_exe_file() sets ->num_exe_file_vmas = 0, this is
simply wrong? It should match the number of VM_EXECUTABLE
vmas.

In short, I do not understand the patch at all. It seems, you
only need to replace mm->exe_file under down_write(mmap_sem)
and nothing else.

Oleg.


  parent reply	other threads:[~2012-02-29 19:31 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-29 15:16 [RFC] c/r: prctl: Add ability to set new mm_struct::exe_file Cyrill Gorcunov
2012-02-29 15:23 ` Pavel Emelyanov
2012-02-29 15:31   ` Cyrill Gorcunov
2012-02-29 19:24 ` Oleg Nesterov [this message]
2012-02-29 20:01   ` Cyrill Gorcunov
2012-03-01 18:06     ` Oleg Nesterov
2012-03-01 19:17       ` Cyrill Gorcunov
2012-03-01 19:41         ` Oleg Nesterov
2012-03-01 20:00           ` Cyrill Gorcunov
2012-03-02 15:03             ` Oleg Nesterov
2012-03-02 14:26           ` Cyrill Gorcunov
2012-03-02 15:26             ` Oleg Nesterov
2012-03-02 16:12               ` Cyrill Gorcunov
2012-03-03 22:33                 ` Cyrill Gorcunov
2012-03-05 14:21                   ` Oleg Nesterov
2012-03-05 14:26                     ` Oleg Nesterov
2012-03-05 14:46                       ` Cyrill Gorcunov
2012-03-05 15:40                         ` Oleg Nesterov
2012-03-05 16:01                           ` Cyrill Gorcunov
2012-03-05 16:31                             ` Oleg Nesterov
2012-03-05 16:45                               ` Cyrill Gorcunov

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=20120229192400.GA13194@redhat.com \
    --to=oleg@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=gorcunov@openvz.org \
    --cc=keescook@chromium.org \
    --cc=kosaki.motohiro@jp.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tj@kernel.org \
    --cc=xemul@parallels.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.