|
@@ -476,17 +476,25 @@ int get_cmdline(struct task_struct *task, char *buffer, int buflen)
|
|
|
int res = 0;
|
|
|
unsigned int len;
|
|
|
struct mm_struct *mm = get_task_mm(task);
|
|
|
+ unsigned long arg_start, arg_end, env_start, env_end;
|
|
|
if (!mm)
|
|
|
goto out;
|
|
|
if (!mm->arg_end)
|
|
|
goto out_mm; /* Shh! No looking before we're done */
|
|
|
|
|
|
- len = mm->arg_end - mm->arg_start;
|
|
|
+ down_read(&mm->mmap_sem);
|
|
|
+ arg_start = mm->arg_start;
|
|
|
+ arg_end = mm->arg_end;
|
|
|
+ env_start = mm->env_start;
|
|
|
+ env_end = mm->env_end;
|
|
|
+ up_read(&mm->mmap_sem);
|
|
|
+
|
|
|
+ len = arg_end - arg_start;
|
|
|
|
|
|
if (len > buflen)
|
|
|
len = buflen;
|
|
|
|
|
|
- res = access_process_vm(task, mm->arg_start, buffer, len, 0);
|
|
|
+ res = access_process_vm(task, arg_start, buffer, len, 0);
|
|
|
|
|
|
/*
|
|
|
* If the nul at the end of args has been overwritten, then
|
|
@@ -497,10 +505,10 @@ int get_cmdline(struct task_struct *task, char *buffer, int buflen)
|
|
|
if (len < res) {
|
|
|
res = len;
|
|
|
} else {
|
|
|
- len = mm->env_end - mm->env_start;
|
|
|
+ len = env_end - env_start;
|
|
|
if (len > buflen - res)
|
|
|
len = buflen - res;
|
|
|
- res += access_process_vm(task, mm->env_start,
|
|
|
+ res += access_process_vm(task, env_start,
|
|
|
buffer+res, len, 0);
|
|
|
res = strnlen(buffer, res);
|
|
|
}
|