diff options
| author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2006-12-06 23:36:35 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.osdl.org> | 2006-12-07 11:39:33 -0500 |
| commit | 841d5fb7c75260f76ae682648b28a3dca724940d (patch) | |
| tree | 126dd9c646f384674c2cb99080c980fad209278b | |
| parent | fec1d0115240593b39898289e6e1413ea6e44a84 (diff) | |
[PATCH] binfmt: fix uaccess handling
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
| -rw-r--r-- | fs/binfmt_elf.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index b2efbaead6c3..68e20d5bfe1b 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c | |||
| @@ -243,8 +243,9 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec, | |||
| 243 | if (interp_aout) { | 243 | if (interp_aout) { |
| 244 | argv = sp + 2; | 244 | argv = sp + 2; |
| 245 | envp = argv + argc + 1; | 245 | envp = argv + argc + 1; |
| 246 | __put_user((elf_addr_t)(unsigned long)argv, sp++); | 246 | if (__put_user((elf_addr_t)(unsigned long)argv, sp++) || |
| 247 | __put_user((elf_addr_t)(unsigned long)envp, sp++); | 247 | __put_user((elf_addr_t)(unsigned long)envp, sp++)) |
| 248 | return -EFAULT; | ||
| 248 | } else { | 249 | } else { |
| 249 | argv = sp; | 250 | argv = sp; |
| 250 | envp = argv + argc + 1; | 251 | envp = argv + argc + 1; |
| @@ -254,7 +255,8 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec, | |||
| 254 | p = current->mm->arg_end = current->mm->arg_start; | 255 | p = current->mm->arg_end = current->mm->arg_start; |
| 255 | while (argc-- > 0) { | 256 | while (argc-- > 0) { |
| 256 | size_t len; | 257 | size_t len; |
| 257 | __put_user((elf_addr_t)p, argv++); | 258 | if (__put_user((elf_addr_t)p, argv++)) |
| 259 | return -EFAULT; | ||
| 258 | len = strnlen_user((void __user *)p, PAGE_SIZE*MAX_ARG_PAGES); | 260 | len = strnlen_user((void __user *)p, PAGE_SIZE*MAX_ARG_PAGES); |
| 259 | if (!len || len > PAGE_SIZE*MAX_ARG_PAGES) | 261 | if (!len || len > PAGE_SIZE*MAX_ARG_PAGES) |
| 260 | return 0; | 262 | return 0; |
| @@ -265,7 +267,8 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec, | |||
| 265 | current->mm->arg_end = current->mm->env_start = p; | 267 | current->mm->arg_end = current->mm->env_start = p; |
| 266 | while (envc-- > 0) { | 268 | while (envc-- > 0) { |
| 267 | size_t len; | 269 | size_t len; |
| 268 | __put_user((elf_addr_t)p, envp++); | 270 | if (__put_user((elf_addr_t)p, envp++)) |
| 271 | return -EFAULT; | ||
| 269 | len = strnlen_user((void __user *)p, PAGE_SIZE*MAX_ARG_PAGES); | 272 | len = strnlen_user((void __user *)p, PAGE_SIZE*MAX_ARG_PAGES); |
| 270 | if (!len || len > PAGE_SIZE*MAX_ARG_PAGES) | 273 | if (!len || len > PAGE_SIZE*MAX_ARG_PAGES) |
| 271 | return 0; | 274 | return 0; |
