Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4229fb1d authored by Konstantin Khlebnikov's avatar Konstantin Khlebnikov Committed by Linus Torvalds
Browse files

c/r: prctl: less paranoid prctl_set_mm_exe_file()



"no other files mapped" requirement from my previous patch (c/r: prctl:
update prctl_set_mm_exe_file() after mm->num_exe_file_vmas removal) is too
paranoid, it forbids operation even if there mapped one shared-anon vma.

Let's check that current mm->exe_file already unmapped, in this case
exe_file symlink already outdated and its changing is reasonable.

Plus, this patch fixes exit code in case operation success.

Signed-off-by: default avatarKonstantin Khlebnikov <khlebnikov@openvz.org>
Reported-by: default avatarCyrill Gorcunov <gorcunov@openvz.org>
Tested-by: default avatarCyrill Gorcunov <gorcunov@openvz.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Matt Helsley <matthltc@us.ibm.com>
Cc: Kees Cook <keescook@chromium.org>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Pavel Emelyanov <xemul@parallels.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent a4e08d00
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -1788,7 +1788,6 @@ SYSCALL_DEFINE1(umask, int, mask)
#ifdef CONFIG_CHECKPOINT_RESTORE
static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd)
{
	struct vm_area_struct *vma;
	struct file *exe_file;
	struct dentry *dentry;
	int err;
@@ -1816,12 +1815,16 @@ static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd)
	down_write(&mm->mmap_sem);

	/*
	 * Forbid mm->exe_file change if there are mapped other files.
	 * Forbid mm->exe_file change if old file still mapped.
	 */
	err = -EBUSY;
	for (vma = mm->mmap; vma; vma = vma->vm_next) {
		if (vma->vm_file && !path_equal(&vma->vm_file->f_path,
						&exe_file->f_path))
	if (mm->exe_file) {
		struct vm_area_struct *vma;

		for (vma = mm->mmap; vma; vma = vma->vm_next)
			if (vma->vm_file &&
			    path_equal(&vma->vm_file->f_path,
				       &mm->exe_file->f_path))
				goto exit_unlock;
	}

@@ -1835,6 +1838,7 @@ static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd)
	if (test_and_set_bit(MMF_EXE_FILE_CHANGED, &mm->flags))
		goto exit_unlock;

	err = 0;
	set_mm_exe_file(mm, exe_file);
exit_unlock:
	up_write(&mm->mmap_sem);