All of lore.kernel.org
 help / color / mirror / Atom feed
From: James Pearson <james-p@moving-picture.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: linux-kernel@vger.kernel.org, aarapov@redhat.com, hpa@zytor.com,
	Mel Gorman <mel@csn.ul.ie>
Subject: Re: [PATCH -mm] Don't truncate /proc/PID/environ at 4096 characters
Date: Fri, 21 Sep 2007 10:41:14 +0100	[thread overview]
Message-ID: <46F391BA.2070906@moving-picture.com> (raw)
In-Reply-To: <20070920164632.fd440b78.akpm@linux-foundation.org>

Andrew Morton wrote:
> On Wed, 19 Sep 2007 14:35:29 +0100
> "James Pearson" <james-p@moving-picture.com> wrote:
> 
> 
>>From: James Pearson <james-p@moving-picture.com>
>>
>>/proc/PID/environ currently truncates at 4096 characters, patch based on 
>>the /proc/PID/mem code.
> 
> 
> patch needs to be carefully reviewed from the security POV (ie: permissions)
> as well as for correctness.  Does anyone have time to do that?
> 
> 
>>Signed-off-by: James Pearson <james-p@moving-picture.com>
>>
>>--- ./fs/proc/base.c.dist	2007-09-19 12:29:46.244929651 +0100
>>+++ ./fs/proc/base.c	2007-09-19 12:36:18.155648760 +0100
>>@@ -202,27 +202,6 @@ static int proc_root_link(struct inode *
>> 	 (task->state == TASK_STOPPED || task->state == TASK_TRACED) && \
>> 	 security_ptrace(current,task) == 0))
>> 
>>-static int proc_pid_environ(struct task_struct *task, char * buffer)
>>-{
>>-	int res = 0;
>>-	struct mm_struct *mm = get_task_mm(task);
>>-	if (mm) {
>>-		unsigned int len;
>>-
>>-		res = -ESRCH;
>>-		if (!ptrace_may_attach(task))
>>-			goto out;
>>-
>>-		len  = mm->env_end - mm->env_start;
>>-		if (len > PAGE_SIZE)
>>-			len = PAGE_SIZE;
>>-		res = access_process_vm(task, mm->env_start, buffer, len, 0);
>>-out:
>>-		mmput(mm);
>>-	}
>>-	return res;
>>-}
>>-
>> static int proc_pid_cmdline(struct task_struct *task, char * buffer)
>> {
>> 	int res = 0;
>>@@ -740,6 +719,79 @@ static const struct file_operations proc
>> 	.open		= mem_open,
>> };
>> 
>>+static ssize_t environ_read(struct file *file, char __user *buf,
>>+			size_t count, loff_t *ppos)
>>+{
>>+	struct task_struct *task = get_proc_task(file->f_dentry->d_inode);
>>+	char *page;
>>+	unsigned long src = *ppos;
>>+	int ret = -ESRCH;
>>+	struct mm_struct *mm;
>>+	size_t max_len;
>>+
>>+	if (!task)
>>+		goto out_no_task;
>>+
>>+	if (!ptrace_may_attach(task))
>>+		goto out;
>>+
>>+	ret = -ENOMEM;
>>+	page = (char *)__get_free_page(GFP_TEMPORARY);
> 
> 
> Now I wonder what inspired you to reach for GFP_TEMPORARY?  Perhaps the
> fact that it is crappily named and undocumented.
> 
> This should be GFP_KERNEL - the page you're allocating here is not
> reclaimable by the VM.

The code is based on mem_read() - and that is what mem_read() does in 
2.6.23rc6-mm1 - my previous patch for 2.6.23rc5 used GFP_USER, as that 
is what mem_read() does in 2.6.23rc5.

>>+	if (!page)
>>+		goto out;
>>+
>>+	ret = 0;
>>+
>>+	mm = get_task_mm(task);
>>+	if (!mm)
>>+		goto out_free;
>>+
>>+	max_len = (count > PAGE_SIZE) ? PAGE_SIZE : count;
>>+
>>+	while (count > 0) {
>>+		int this_len, retval;
>>+
>>+		this_len = mm->env_end - (mm->env_start + src);
>>+
>>+		if (this_len <= 0)
>>+			break;
>>+
>>+		if (this_len > max_len)
>>+			this_len = max_len;
>>+
>>+		retval = access_process_vm(task, (mm->env_start + src),
>>+			page, this_len, 0);
>>+
>>+		if (retval <= 0) {
>>+			ret = retval;
>>+			break;
>>+		}
>>+
>>+		if (copy_to_user(buf, page, retval)) {
>>+			ret = -EFAULT;
>>+			break;
>>+		}
>>+
>>+		ret += retval;
>>+		src += retval;
>>+		buf += retval;
>>+		count -= retval;
>>+	}
> 
> 
> Now that's a funky loop.  Someone please convince me that there is no way
> in which `count - retval' can ever go negative (ie: huge positive).

Again, this is exactly the same as in mem_read()

James Pearson


  reply	other threads:[~2007-09-21  9:41 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-09-19 13:35 [PATCH -mm] Don't truncate /proc/PID/environ at 4096 characters James Pearson
2007-09-20 23:46 ` Andrew Morton
2007-09-21  9:41   ` James Pearson [this message]
2007-09-21 10:00   ` Mel Gorman
2007-09-21  1:56 ` Arvin Moezzi
2007-09-21  9:47   ` James Pearson
2007-09-21 12:47     ` Arvin Moezzi
2007-09-21 13:47       ` James Pearson
  -- strict thread matches above, loose matches on Subject: below --
2007-09-19 14:54 Mikael Pettersson
2007-09-19 15:59 ` H. Peter Anvin
2007-09-19 18:35   ` Mikael Pettersson
2007-09-19 19:29     ` Hugh Dickins
2007-09-25 16:44 James Pearson

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=46F391BA.2070906@moving-picture.com \
    --to=james-p@moving-picture.com \
    --cc=aarapov@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mel@csn.ul.ie \
    /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.