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

Commit bc452b4b authored by Djalal Harouni's avatar Djalal Harouni Committed by Linus Torvalds
Browse files

proc: do not allow negative offsets on /proc/<pid>/environ



__mem_open() which is called by both /proc/<pid>/environ and
/proc/<pid>/mem ->open() handlers will allow the use of negative offsets.
/proc/<pid>/mem has negative offsets but not /proc/<pid>/environ.

Clean this by moving the 'force FMODE_UNSIGNED_OFFSET flag' to mem_open()
to allow negative offsets only on /proc/<pid>/mem.

Signed-off-by: default avatarDjalal Harouni <tixxdz@opendz.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Brad Spengler <spender@grsecurity.net>
Acked-by: default avatarKees Cook <keescook@chromium.org>
Cc: David Rientjes <rientjes@google.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent e8905ec2
Loading
Loading
Loading
Loading
+6 −3
Original line number Original line Diff line number Diff line
@@ -695,8 +695,6 @@ static int __mem_open(struct inode *inode, struct file *file, unsigned int mode)
		mmput(mm);
		mmput(mm);
	}
	}


	/* OK to pass negative loff_t, we can catch out-of-range */
	file->f_mode |= FMODE_UNSIGNED_OFFSET;
	file->private_data = mm;
	file->private_data = mm;


	return 0;
	return 0;
@@ -704,7 +702,12 @@ static int __mem_open(struct inode *inode, struct file *file, unsigned int mode)


static int mem_open(struct inode *inode, struct file *file)
static int mem_open(struct inode *inode, struct file *file)
{
{
	return __mem_open(inode, file, PTRACE_MODE_ATTACH);
	int ret = __mem_open(inode, file, PTRACE_MODE_ATTACH);

	/* OK to pass negative loff_t, we can catch out-of-range */
	file->f_mode |= FMODE_UNSIGNED_OFFSET;

	return ret;
}
}


static ssize_t mem_rw(struct file *file, char __user *buf,
static ssize_t mem_rw(struct file *file, char __user *buf,