diff options
| -rw-r--r-- | fs/binfmt_som.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/fs/binfmt_som.c b/fs/binfmt_som.c index 32b5d625ce9c..5bcdaaf4eae0 100644 --- a/fs/binfmt_som.c +++ b/fs/binfmt_som.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | #include <linux/personality.h> | 29 | #include <linux/personality.h> |
| 30 | #include <linux/init.h> | 30 | #include <linux/init.h> |
| 31 | 31 | ||
| 32 | #include <asm/a.out.h> | ||
| 32 | #include <asm/uaccess.h> | 33 | #include <asm/uaccess.h> |
| 33 | #include <asm/pgtable.h> | 34 | #include <asm/pgtable.h> |
| 34 | 35 | ||
| @@ -194,6 +195,7 @@ load_som_binary(struct linux_binprm * bprm, struct pt_regs * regs) | |||
| 194 | unsigned long som_entry; | 195 | unsigned long som_entry; |
| 195 | struct som_hdr *som_ex; | 196 | struct som_hdr *som_ex; |
| 196 | struct som_exec_auxhdr *hpuxhdr; | 197 | struct som_exec_auxhdr *hpuxhdr; |
| 198 | struct files_struct *files; | ||
| 197 | 199 | ||
| 198 | /* Get the exec-header */ | 200 | /* Get the exec-header */ |
| 199 | som_ex = (struct som_hdr *) bprm->buf; | 201 | som_ex = (struct som_hdr *) bprm->buf; |
| @@ -208,15 +210,27 @@ load_som_binary(struct linux_binprm * bprm, struct pt_regs * regs) | |||
| 208 | size = som_ex->aux_header_size; | 210 | size = som_ex->aux_header_size; |
| 209 | if (size > SOM_PAGESIZE) | 211 | if (size > SOM_PAGESIZE) |
| 210 | goto out; | 212 | goto out; |
| 211 | hpuxhdr = (struct som_exec_auxhdr *) kmalloc(size, GFP_KERNEL); | 213 | hpuxhdr = kmalloc(size, GFP_KERNEL); |
| 212 | if (!hpuxhdr) | 214 | if (!hpuxhdr) |
| 213 | goto out; | 215 | goto out; |
| 214 | 216 | ||
| 215 | retval = kernel_read(bprm->file, som_ex->aux_header_location, | 217 | retval = kernel_read(bprm->file, som_ex->aux_header_location, |
| 216 | (char *) hpuxhdr, size); | 218 | (char *) hpuxhdr, size); |
| 219 | if (retval != size) { | ||
| 220 | if (retval >= 0) | ||
| 221 | retval = -EIO; | ||
| 222 | goto out_free; | ||
| 223 | } | ||
| 224 | |||
| 225 | files = current->files; /* Refcounted so ok */ | ||
| 226 | retval = unshare_files(); | ||
| 217 | if (retval < 0) | 227 | if (retval < 0) |
| 218 | goto out_free; | 228 | goto out_free; |
| 219 | #error "Fix security hole before enabling me" | 229 | if (files == current->files) { |
| 230 | put_files_struct(files); | ||
| 231 | files = NULL; | ||
| 232 | } | ||
| 233 | |||
| 220 | retval = get_unused_fd(); | 234 | retval = get_unused_fd(); |
| 221 | if (retval < 0) | 235 | if (retval < 0) |
| 222 | goto out_free; | 236 | goto out_free; |
