From: James Pearson <james-p@moving-picture.com>
To: "H. Peter Anvin" <hpa@zytor.com>
Cc: Anton Arapov <aarapov@redhat.com>,
Guy Streeter <guy.streeter@gmail.com>,
linux-kernel@vger.kernel.org
Subject: Re: 4096 byte limit to /proc/PID/environ ?
Date: Wed, 05 Sep 2007 18:00:57 +0100 [thread overview]
Message-ID: <46DEE0C9.1000402@moving-picture.com> (raw)
In-Reply-To: <46DE6196.3050605@zytor.com>
H. Peter Anvin wrote:
> Anton Arapov wrote:
>
>> Hey guys, the future of this patch is important for me. What do you
>> think, has this patch any chances to be committed to upstream?
>>
>> James Pearson <james-p@moving-picture.com> writes:
>>
>>> H. Peter Anvin wrote:
>>> There isn't that much that is duplicated - and there are also bits of
>>> the /proc/PID/mem code that are not needed in this case, so I'm not
>>> really sure if it is worth doing.
>>>
>>> I did submit a patch a few months ago - see:
>>>
>>> <http://marc.info/?l=linux-kernel&m=117862109623007&w=2>
>>
>>
>
> Looks reasonable to me, except for the one overlong line.
>
OK, here is the patch (without the long line) against 2.6.23-rc5 - what
else needs to be done to get it committed?
James Pearson
--- ./fs/proc/base.c.dist 2007-09-01 07:08:24.000000000 +0100
+++ ./fs/proc/base.c 2007-09-05 14:08:15.762518000 +0100
@@ -199,27 +199,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;
@@ -658,6 +637,85 @@ 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_USER);
+ 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 (!ptrace_may_attach(task)) {
+ ret = -ESRCH;
+ break;
+ }
+
+ if (retval <= 0) {
+ ret = retval;
+ break;
+ }
+
+ if (copy_to_user(buf, page, retval)) {
+ ret = -EFAULT;
+ break;
+ }
+
+ ret += retval;
+ src += retval;
+ buf += retval;
+ count -= retval;
+ }
+ *ppos = src;
+
+ mmput(mm);
+out_free:
+ free_page((unsigned long) page);
+out:
+ put_task_struct(task);
+out_no_task:
+ return ret;
+}
+
+static const struct file_operations proc_environ_operations = {
+ .read = environ_read,
+};
+
static ssize_t oom_adjust_read(struct file *file, char __user *buf,
size_t count, loff_t *ppos)
{
@@ -2048,7 +2106,7 @@ static const struct pid_entry tgid_base_
DIR("task", S_IRUGO|S_IXUGO, task),
DIR("fd", S_IRUSR|S_IXUSR, fd),
DIR("fdinfo", S_IRUSR|S_IXUSR, fdinfo),
- INF("environ", S_IRUSR, pid_environ),
+ REG("environ", S_IRUSR, environ),
INF("auxv", S_IRUSR, pid_auxv),
INF("status", S_IRUGO, pid_status),
#ifdef CONFIG_SCHED_DEBUG
@@ -2335,7 +2393,7 @@ out_no_task:
static const struct pid_entry tid_base_stuff[] = {
DIR("fd", S_IRUSR|S_IXUSR, fd),
DIR("fdinfo", S_IRUSR|S_IXUSR, fdinfo),
- INF("environ", S_IRUSR, pid_environ),
+ REG("environ", S_IRUSR, environ),
INF("auxv", S_IRUSR, pid_auxv),
INF("status", S_IRUGO, pid_status),
#ifdef CONFIG_SCHED_DEBUG
next prev parent reply other threads:[~2007-09-05 17:01 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-05-24 19:45 4096 byte limit to /proc/PID/environ ? James Pearson
2006-05-24 20:29 ` H. Peter Anvin
[not found] ` <200605242029.k4OKTn9C031700@terminus.zytor.com>
2006-06-01 14:11 ` James Pearson
2007-08-15 16:54 ` Guy Streeter
2007-08-15 17:25 ` H. Peter Anvin
2007-08-21 14:40 ` Guy Streeter
2007-08-30 13:53 ` James Pearson
2007-09-03 8:17 ` Anton Arapov
2007-09-05 7:49 ` Anton Arapov
2007-09-05 7:58 ` H. Peter Anvin
2007-09-05 17:00 ` James Pearson [this message]
2007-09-05 17:18 ` Randy Dunlap
2007-09-06 9:23 ` James Pearson
2007-09-05 17:22 ` Alexey Dobriyan
2007-09-06 9:31 ` James Pearson
2007-09-06 12:31 ` Jan Engelhardt
2007-09-06 12:34 ` H. Peter Anvin
2007-09-06 12:34 ` Anton Arapov
-- strict thread matches above, loose matches on Subject: below --
2007-09-06 16:38 James Pearson
2007-09-18 14:09 ` Anton Arapov
2007-09-18 17:09 ` H. Peter Anvin
2006-05-24 15:54 James Pearson
2006-05-24 16:46 ` linux-os (Dick Johnson)
2006-05-24 16:59 ` James Pearson
2006-05-24 17:56 ` H. Peter Anvin
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=46DEE0C9.1000402@moving-picture.com \
--to=james-p@moving-picture.com \
--cc=aarapov@redhat.com \
--cc=guy.streeter@gmail.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
/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.