diff options
-rw-r--r-- | fs/proc/base.c | 36 |
1 files changed, 2 insertions, 34 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index 03c8d747be48..cfd178dc76b2 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -200,41 +200,9 @@ static int proc_root_link(struct dentry *dentry, struct path *path) | |||
200 | return result; | 200 | return result; |
201 | } | 201 | } |
202 | 202 | ||
203 | static int proc_pid_cmdline(struct task_struct *task, char * buffer) | 203 | static int proc_pid_cmdline(struct task_struct *task, char *buffer) |
204 | { | 204 | { |
205 | int res = 0; | 205 | return get_cmdline(task, buffer, PAGE_SIZE); |
206 | unsigned int len; | ||
207 | struct mm_struct *mm = get_task_mm(task); | ||
208 | if (!mm) | ||
209 | goto out; | ||
210 | if (!mm->arg_end) | ||
211 | goto out_mm; /* Shh! No looking before we're done */ | ||
212 | |||
213 | len = mm->arg_end - mm->arg_start; | ||
214 | |||
215 | if (len > PAGE_SIZE) | ||
216 | len = PAGE_SIZE; | ||
217 | |||
218 | res = access_process_vm(task, mm->arg_start, buffer, len, 0); | ||
219 | |||
220 | // If the nul at the end of args has been overwritten, then | ||
221 | // assume application is using setproctitle(3). | ||
222 | if (res > 0 && buffer[res-1] != '\0' && len < PAGE_SIZE) { | ||
223 | len = strnlen(buffer, res); | ||
224 | if (len < res) { | ||
225 | res = len; | ||
226 | } else { | ||
227 | len = mm->env_end - mm->env_start; | ||
228 | if (len > PAGE_SIZE - res) | ||
229 | len = PAGE_SIZE - res; | ||
230 | res += access_process_vm(task, mm->env_start, buffer+res, len, 0); | ||
231 | res = strnlen(buffer, res); | ||
232 | } | ||
233 | } | ||
234 | out_mm: | ||
235 | mmput(mm); | ||
236 | out: | ||
237 | return res; | ||
238 | } | 206 | } |
239 | 207 | ||
240 | static int proc_pid_auxv(struct task_struct *task, char *buffer) | 208 | static int proc_pid_auxv(struct task_struct *task, char *buffer) |