X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fbinfmt_som.c;h=b19f293da3429e2f19aa4c9c156ef8b68feb92bb;hb=refs%2Fheads%2Fvserver;hp=ac64fa5727df8eb815768c10032a07b8850a1ff2;hpb=a8e794ca871505c8ea96cc102f4ad555c5231d7f;p=linux-2.6.git diff --git a/fs/binfmt_som.c b/fs/binfmt_som.c index ac64fa572..b19f293da 100644 --- a/fs/binfmt_som.c +++ b/fs/binfmt_som.c @@ -28,11 +28,12 @@ #include #include #include +#include +#include #include #include -#include #include @@ -195,6 +196,7 @@ load_som_binary(struct linux_binprm * bprm, struct pt_regs * regs) unsigned long som_entry; struct som_hdr *som_ex; struct som_exec_auxhdr *hpuxhdr; + struct files_struct *files; /* Get the exec-header */ som_ex = (struct som_hdr *) bprm->buf; @@ -209,15 +211,27 @@ load_som_binary(struct linux_binprm * bprm, struct pt_regs * regs) size = som_ex->aux_header_size; if (size > SOM_PAGESIZE) goto out; - hpuxhdr = (struct som_exec_auxhdr *) kmalloc(size, GFP_KERNEL); + hpuxhdr = kmalloc(size, GFP_KERNEL); if (!hpuxhdr) goto out; retval = kernel_read(bprm->file, som_ex->aux_header_location, (char *) hpuxhdr, size); + if (retval != size) { + if (retval >= 0) + retval = -EIO; + goto out_free; + } + + files = current->files; /* Refcounted so ok */ + retval = unshare_files(); if (retval < 0) goto out_free; -#error "Fix security hole before enabling me" + if (files == current->files) { + put_files_struct(files); + files = NULL; + } + retval = get_unused_fd(); if (retval < 0) goto out_free; @@ -254,13 +268,11 @@ load_som_binary(struct linux_binprm * bprm, struct pt_regs * regs) set_binfmt(&som_format); compute_creds(bprm); - setup_arg_pages(bprm, EXSTACK_DEFAULT); + setup_arg_pages(bprm, STACK_TOP, EXSTACK_DEFAULT); create_som_tables(bprm); current->mm->start_stack = bprm->p; - // current->mm->rss = 0; - vx_rsspages_sub(current->mm, current->mm->rss); #if 0 printk("(start_brk) %08lx\n" , (unsigned long) current->mm->start_brk); @@ -274,8 +286,6 @@ load_som_binary(struct linux_binprm * bprm, struct pt_regs * regs) map_hpux_gateway_page(current,current->mm); start_thread_som(regs, som_entry, bprm->p); - if (current->ptrace & PT_PTRACED) - send_sig(SIGTRAP, current, 0); return 0; /* error cleanup */ @@ -306,5 +316,5 @@ static void __exit exit_som_binfmt(void) unregister_binfmt(&som_format); } -module_init(init_som_binfmt); +core_initcall(init_som_binfmt); module_exit(exit_som_binfmt);