Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751288AbWIUPzp (ORCPT ); Thu, 21 Sep 2006 11:55:45 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751289AbWIUPzp (ORCPT ); Thu, 21 Sep 2006 11:55:45 -0400 Received: from xenotime.net ([66.160.160.81]:20897 "HELO xenotime.net") by vger.kernel.org with SMTP id S1751288AbWIUPzn (ORCPT ); Thu, 21 Sep 2006 11:55:43 -0400 Date: Thu, 21 Sep 2006 08:56:49 -0700 From: "Randy.Dunlap" To: "Luke Yang" Cc: linux-kernel@vger.kernel.org, "Andrew Morton" Subject: Re: [PATCH 4/4] Blackfin: binfmt patch to enhance stacking checking Message-Id: <20060921085649.f8eeb0d1.rdunlap@xenotime.net> In-Reply-To: <489ecd0c0609210043i33195c2ds44e7a6bab11f82d1@mail.gmail.com> References: <489ecd0c0609202033l456d66ceq85ef69e7a4a4aa00@mail.gmail.com> <20060920230446.f6b825c6.rdunlap@xenotime.net> <489ecd0c0609210041t484296e5kf94203ecee13514a@mail.gmail.com> <489ecd0c0609210043i33195c2ds44e7a6bab11f82d1@mail.gmail.com> Organization: YPO4 X-Mailer: Sylpheed version 2.2.7 (GTK+ 2.8.10; x86_64-unknown-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 29844 Lines: 740 On Thu, 21 Sep 2006 15:43:22 +0800 Luke Yang wrote: > Please discuss about the patch first and I'll resend a renewed patch > as attachment. Much better, thanks. Reviewed-by: Randy Dunlap > On 9/21/06, Luke Yang wrote: > > Hi Randy, > > > > Thanks. Fixed the issues. > > > > Signed-off-by: Luke Yang > > > > fs/binfmt_elf_fdpic.c | 7 +- > > fs/binfmt_flat.c | 144 ++++++++++++++++++++++++++++---------------- > > include/asm-arm/mmu.h | 1 > > include/asm-frv/mmu.h | 1 > > include/asm-h8300/mmu.h | 1 > > include/asm-m32r/mmu.h | 1 > > include/asm-m68knommu/mmu.h | 1 > > include/asm-sh/mmu.h | 1 > > include/asm-v850/mmu.h | 1 > > include/linux/flat.h | 13 ++- > > 10 files changed, 112 insertions(+), 59 deletions(-) > > > > diff -urN linux-2.6.18.patch2/fs/binfmt_elf_fdpic.c > > linux-2.6.18.patch3/fs/binfmt_elf_fdpic.c > > --- linux-2.6.18.patch2/fs/binfmt_elf_fdpic.c 2006-09-21 > > 09:37:18.000000000 +0800 > > +++ linux-2.6.18.patch3/fs/binfmt_elf_fdpic.c 2006-09-21 > > 11:17:49.000000000 +0800 > > @@ -170,7 +170,7 @@ > > { > > struct elf_fdpic_params exec_params, interp_params; > > struct elf_phdr *phdr; > > - unsigned long stack_size, entryaddr; > > + unsigned long stack_size, entryaddr, requested_stack_size; > > #ifndef CONFIG_MMU > > unsigned long fullsize; > > #endif > > @@ -361,6 +361,7 @@ > > * - the stack starts at the top and works down > > */ > > stack_size = (stack_size + PAGE_SIZE - 1) & PAGE_MASK; > > + requested_stack_size = stack_size; > > if (stack_size < PAGE_SIZE * 2) > > stack_size = PAGE_SIZE * 2; > > > > @@ -388,6 +389,8 @@ > > current->mm->context.end_brk = current->mm->start_brk; > > current->mm->context.end_brk += > > (stack_size > PAGE_SIZE) ? (stack_size - PAGE_SIZE) : 0; > > + current->mm->context.stack_start = > > + current->mm->start_brk + stack_size - requested_stack_size; > > current->mm->start_stack = current->mm->start_brk + stack_size; > > #endif > > > > @@ -959,6 +962,8 @@ > > } > > #endif > > > > +extern void *safe_dma_memcpy(void *, const void *, size_t); > > + > > /*****************************************************************************/ > > /* > > * map a binary by direct mmap() of the individual PT_LOAD segments > > diff -urN linux-2.6.18.patch2/fs/binfmt_flat.c > > linux-2.6.18.patch3/fs/binfmt_flat.c > > --- linux-2.6.18.patch2/fs/binfmt_flat.c 2006-09-21 09:37:18.000000000 +0800 > > +++ linux-2.6.18.patch3/fs/binfmt_flat.c 2006-09-21 15:32:40.000000000 +0800 > > @@ -35,13 +35,13 @@ > > #include > > #include > > #include > > -#include > > > > #include > > #include > > #include > > #include > > #include > > +#include > > > > /****************************************************************************/ > > > > @@ -77,6 +77,8 @@ > > static int load_flat_binary(struct linux_binprm *, struct pt_regs * regs); > > static int flat_core_dump(long signr, struct pt_regs * regs, struct > > file *file); > > > > +extern void dump_thread(struct pt_regs *, struct user *); > > + > > static struct linux_binfmt flat_format = { > > .module = THIS_MODULE, > > .load_binary = load_flat_binary, > > @@ -413,7 +415,9 @@ > > /****************************************************************************/ > > > > static int load_flat_file(struct linux_binprm * bprm, > > - struct lib_info *libinfo, int id, unsigned long *extra_stack) > > + struct lib_info *libinfo, int id, > > + unsigned long *extra_stack, > > + unsigned long *stack_base) > > { > > struct flat_hdr * hdr; > > unsigned long textpos = 0, datapos = 0, result; > > @@ -426,7 +430,6 @@ > > int i, rev, relocs = 0; > > loff_t fpos; > > unsigned long start_code, end_code; > > - int ret; > > > > hdr = ((struct flat_hdr *) bprm->buf); /* exec-header */ > > inode = bprm->file->f_dentry->d_inode; > > @@ -451,24 +454,26 @@ > > */ > > if (strncmp(hdr->magic, "#!", 2)) > > printk("BINFMT_FLAT: bad header magic\n"); > > - ret = -ENOEXEC; > > + result = -ENOEXEC; > > goto err; > > } > > - > > +#ifdef DEBUG > > + flags |= FLAT_FLAG_KTRACE; > > +#endif > > if (flags & FLAT_FLAG_KTRACE) > > printk("BINFMT_FLAT: Loading file: %s\n", bprm->filename); > > > > if (rev != FLAT_VERSION && rev != OLD_FLAT_VERSION) { > > printk("BINFMT_FLAT: bad flat file version 0x%x (supported 0x%x and > > 0x%x)\n", rev, FLAT_VERSION, OLD_FLAT_VERSION); > > - ret = -ENOEXEC; > > + result = -ENOEXEC; > > goto err; > > } > > - > > + > > /* Don't allow old format executables to use shared libraries */ > > if (rev == OLD_FLAT_VERSION && id != 0) { > > printk("BINFMT_FLAT: shared libraries are not available before rev 0x%x\n", > > (int) FLAT_VERSION); > > - ret = -ENOEXEC; > > + result = -ENOEXEC; > > goto err; > > } > > > > @@ -482,7 +487,7 @@ > > #ifndef CONFIG_BINFMT_ZFLAT > > if (flags & (FLAT_FLAG_GZIP|FLAT_FLAG_GZDATA)) { > > printk("Support for ZFLAT executables is not enabled.\n"); > > - ret = -ENOEXEC; > > + result = -ENOEXEC; > > goto err; > > } > > #endif > > @@ -496,17 +501,28 @@ > > if (rlim >= RLIM_INFINITY) > > rlim = ~0; > > if (data_len + bss_len > rlim) { > > - ret = -ENOMEM; > > + result = -ENOMEM; > > goto err; > > } > > > > + if (flags & FLAT_FLAG_L1STK) { > > + if (stack_base == 0) { > > + result = -ENOEXEC; > > + goto err; > > + } > > + stack_len = alloc_l1stack(stack_len, stack_base); > > + if (stack_len == 0) { > > + result = -ENOEXEC; > > + goto err; > > + } > > + *extra_stack = stack_len; > > + } > > + > > /* Flush all traces of the currently running executable */ > > if (id == 0) { > > result = flush_old_exec(bprm); > > - if (result) { > > - ret = result; > > - goto err; > > - } > > + if (result) > > + goto out_fail; > > > > /* OK, This is the point of no return */ > > set_personality(PER_LINUX_32BIT); > > @@ -536,14 +552,17 @@ > > if (!textpos) > > textpos = (unsigned long) -ENOMEM; > > printk("Unable to mmap process text, errno %d\n", (int)-textpos); > > - ret = textpos; > > - goto err; > > + result = textpos; > > + goto out_fail; > > } > > > > down_write(¤t->mm->mmap_sem); > > realdatastart = do_mmap(0, 0, data_len + extra + > > MAX_SHARED_LIBS * sizeof(unsigned long), > > PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 0); > > + do_mremap(realdatastart, data_len + extra + > > + MAX_SHARED_LIBS * sizeof(unsigned long), > > + ksize((void *)realdatastart), 0, 0); > > up_write(¤t->mm->mmap_sem); > > > > if (realdatastart == 0 || realdatastart >= (unsigned long)-4096) { > > @@ -552,8 +571,8 @@ > > printk("Unable to allocate RAM for process data, errno %d\n", > > (int)-datapos); > > do_munmap(current->mm, textpos, text_len); > > - ret = realdatastart; > > - goto err; > > + result = realdatastart; > > + goto out_fail; > > } > > datapos = realdatastart + MAX_SHARED_LIBS * sizeof(unsigned long); > > > > @@ -575,8 +594,7 @@ > > printk("Unable to read data+bss, errno %d\n", (int)-result); > > do_munmap(current->mm, textpos, text_len); > > do_munmap(current->mm, realdatastart, data_len + extra); > > - ret = result; > > - goto err; > > + goto out_fail; > > } > > > > reloc = (unsigned long *) (datapos+(ntohl(hdr->reloc_start)-text_len)); > > @@ -588,15 +606,19 @@ > > textpos = do_mmap(0, 0, text_len + data_len + extra + > > MAX_SHARED_LIBS * sizeof(unsigned long), > > PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE, 0); > > - up_write(¤t->mm->mmap_sem); > > if (!textpos || textpos >= (unsigned long) -4096) { > > + up_write(¤t->mm->mmap_sem); > > if (!textpos) > > textpos = (unsigned long) -ENOMEM; > > printk("Unable to allocate RAM for process text/data, errno %d\n", > > (int)-textpos); > > - ret = textpos; > > - goto err; > > + result = textpos; > > + goto out_fail; > > } > > + do_mremap(textpos, text_len + data_len + extra + > > + MAX_SHARED_LIBS * sizeof(unsigned long), > > + ksize((void *)textpos), 0, 0); > > + up_write(¤t->mm->mmap_sem); > > > > realdatastart = textpos + ntohl(hdr->data_start); > > datapos = realdatastart + MAX_SHARED_LIBS * sizeof(unsigned long); > > @@ -640,8 +662,7 @@ > > printk("Unable to read code+data+bss, errno %d\n",(int)-result); > > do_munmap(current->mm, textpos, text_len + data_len + extra + > > MAX_SHARED_LIBS * sizeof(unsigned long)); > > - ret = result; > > - goto err; > > + goto out_fail; > > } > > } > > > > @@ -665,6 +686,7 @@ > > current->mm->start_brk = datapos + data_len + bss_len; > > current->mm->brk = (current->mm->start_brk + 3) & ~3; > > current->mm->context.end_brk = memp + ksize((void *) memp) - stack_len; > > + current->mm->context.stack_start = current->mm->context.end_brk; > > } > > > > if (flags & FLAT_FLAG_KTRACE) > > @@ -686,7 +708,7 @@ > > libinfo->lib_list[id].loaded = 1; > > libinfo->lib_list[id].entry = (0x00ffffff & ntohl(hdr->entry)) + textpos; > > libinfo->lib_list[id].build_date = ntohl(hdr->build_date); > > - > > + > > /* > > * We just load the allocations into some temporary memory to > > * help simplify all this mumbo jumbo > > @@ -705,8 +727,8 @@ > > if (*rp) { > > addr = calc_reloc(*rp, libinfo, id, 0); > > if (addr == RELOC_FAILED) { > > - ret = -ENOEXEC; > > - goto err; > > + result = -ENOEXEC; > > + goto out_fail; > > } > > *rp = addr; > > } > > @@ -725,6 +747,7 @@ > > * __start to address 4 so that is okay). > > */ > > if (rev > OLD_FLAT_VERSION) { > > + unsigned long persistent = 0; > > for (i=0; i < relocs; i++) { > > unsigned long addr, relval; > > > > @@ -732,16 +755,20 @@ > > relocated (of course, the address has to be > > relocated first). */ > > relval = ntohl(reloc[i]); > > + if (flat_set_persistent (relval, &persistent)) > > + continue; > > addr = flat_get_relocate_addr(relval); > > rp = (unsigned long *) calc_reloc(addr, libinfo, id, 1); > > if (rp == (unsigned long *)RELOC_FAILED) { > > - ret = -ENOEXEC; > > - goto err; > > + result = -ENOEXEC; > > + goto out_fail; > > } > > > > /* Get the pointer's value. */ > > - addr = flat_get_addr_from_rp(rp, relval, flags); > > - if (addr != 0) { > > + addr = flat_get_addr_from_rp(rp, relval, flags, &persistent); > > + if (addr == 0) > > + continue; > > + if (! flat_addr_absolute (relval)) { > > /* > > * Do the relocation. PIC relocs in the data section are > > * already in target order > > @@ -750,30 +777,32 @@ > > addr = ntohl(addr); > > addr = calc_reloc(addr, libinfo, id, 0); > > if (addr == RELOC_FAILED) { > > - ret = -ENOEXEC; > > - goto err; > > + result = -ENOEXEC; > > + goto out_fail; > > } > > - > > - /* Write back the relocated pointer. */ > > - flat_put_addr_at_rp(rp, addr, relval); > > } > > + /* Write back the relocated pointer. */ > > + flat_put_addr_at_rp(rp, addr, relval); > > } > > } else { > > for (i=0; i < relocs; i++) > > old_reloc(ntohl(reloc[i])); > > } > > - > > + > > flush_icache_range(start_code, end_code); > > > > /* zero the BSS, BRK and stack areas */ > > - memset((void*)(datapos + data_len), 0, bss_len + > > + memset((void*)(datapos + data_len), 0, bss_len + > > (memp + ksize((void *) memp) - stack_len - /* end brk */ > > libinfo->lib_list[id].start_brk) + /* start brk */ > > stack_len); > > > > return 0; > > -err: > > - return ret; > > + out_fail: > > + if (flags & FLAT_FLAG_L1STK) > > + free_l1stack(); > > + err: > > + return result; > > } > > > > > > @@ -804,7 +833,7 @@ > > res = prepare_binprm(&bprm); > > > > if (res <= (unsigned long)-4096) > > - res = load_flat_file(&bprm, libs, id, NULL); > > + res = load_flat_file(&bprm, libs, id, NULL, NULL); > > if (bprm.file) { > > allow_write_access(bprm.file); > > fput(bprm.file); > > @@ -827,6 +856,7 @@ > > unsigned long p = bprm->p; > > unsigned long stack_len; > > unsigned long start_addr; > > + unsigned long l1stack_base, ramstack_top; > > unsigned long *sp; > > int res; > > int i, j; > > @@ -844,11 +874,11 @@ > > stack_len += (bprm->argc + 1) * sizeof(char *); /* the argv array */ > > stack_len += (bprm->envc + 1) * sizeof(char *); /* the envp array */ > > > > - > > - res = load_flat_file(bprm, &libinfo, 0, &stack_len); > > + l1stack_base = 0; > > + res = load_flat_file(bprm, &libinfo, 0, &stack_len, &l1stack_base); > > if (res > (unsigned long)-4096) > > return res; > > - > > + > > /* Update data segment pointers for all libraries */ > > for (i=0; i > if (libinfo.lib_list[i].loaded) > > @@ -863,6 +893,7 @@ > > set_binfmt(&flat_format); > > > > p = ((current->mm->context.end_brk + stack_len + 3) & ~3) - 4; > > + ramstack_top = p; > > DBG_FLT("p=%x\n", (int)p); > > > > /* copy the arg pages onto the stack, this could be more efficient :-) */ > > @@ -871,7 +902,7 @@ > > ((char *) page_address(bprm->page[i/PAGE_SIZE]))[i % PAGE_SIZE]; > > > > sp = (unsigned long *) create_flat_tables(p, bprm); > > - > > + > > /* Fake some return addresses to ensure the call chain will > > * initialise library in order for us. We are required to call > > * lib 1 first, then 2, ... and finally the main program (id 0). > > @@ -887,15 +918,24 @@ > > } > > } > > #endif > > - > > + > > /* Stash our initial stack pointer into the mm structure */ > > current->mm->start_stack = (unsigned long )sp; > > > > - > > - DBG_FLT("start_thread(regs=0x%x, entry=0x%x, start_stack=0x%x)\n", > > - (int)regs, (int)start_addr, (int)current->mm->start_stack); > > - > > - start_thread(regs, start_addr, current->mm->start_stack); > > + if (l1stack_base) { > > + /* Find L1 stack pointer corresponding to the current bottom > > + of the stack in normal RAM. */ > > + l1stack_base += stack_len - (ramstack_top - (unsigned long)sp); > > + if (!activate_l1stack(current->mm, ramstack_top - stack_len)) > > + l1stack_base = 0; > > + } > > + > > + DBG_FLT("start_thread(regs=0x%x, entry=0x%x, start_stack=0x%x, > > l1stk=0x%x, len 0x%x)\n", > > + (int)regs, (int)start_addr, (int)current->mm->start_stack, l1stack_base, > > + stack_len); > > + > > + start_thread(regs, start_addr, > > + l1stack_base ? l1stack_base : current->mm->start_stack); > > > > if (current->ptrace & PT_PTRACED) > > send_sig(SIGTRAP, current, 0); > > diff -urN linux-2.6.18.patch2/include/asm-arm/mmu.h > > linux-2.6.18.patch3/include/asm-arm/mmu.h > > --- linux-2.6.18.patch2/include/asm-arm/mmu.h 2006-09-21 > > 09:37:24.000000000 +0800 > > +++ linux-2.6.18.patch3/include/asm-arm/mmu.h 2006-09-21 > > 09:52:02.000000000 +0800 > > @@ -26,6 +26,7 @@ > > typedef struct { > > struct vm_list_struct *vmlist; > > unsigned long end_brk; > > + unsigned long stack_start; > > } mm_context_t; > > > > #endif > > diff -urN linux-2.6.18.patch2/include/asm-frv/mmu.h > > linux-2.6.18.patch3/include/asm-frv/mmu.h > > --- linux-2.6.18.patch2/include/asm-frv/mmu.h 2006-09-21 > > 09:37:25.000000000 +0800 > > +++ linux-2.6.18.patch3/include/asm-frv/mmu.h 2006-09-21 > > 09:52:02.000000000 +0800 > > @@ -24,6 +24,7 @@ > > #else > > struct vm_list_struct *vmlist; > > unsigned long end_brk; > > + unsigned long stack_start; > > > > #endif > > > > diff -urN linux-2.6.18.patch2/include/asm-h8300/mmu.h > > linux-2.6.18.patch3/include/asm-h8300/mmu.h > > --- linux-2.6.18.patch2/include/asm-h8300/mmu.h 2006-09-21 > > 09:37:26.000000000 +0800 > > +++ linux-2.6.18.patch3/include/asm-h8300/mmu.h 2006-09-21 > > 09:52:02.000000000 +0800 > > @@ -6,6 +6,7 @@ > > typedef struct { > > struct vm_list_struct *vmlist; > > unsigned long end_brk; > > + unsigned long stack_start; > > } mm_context_t; > > > > #endif > > diff -urN linux-2.6.18.patch2/include/asm-m32r/mmu.h > > linux-2.6.18.patch3/include/asm-m32r/mmu.h > > --- linux-2.6.18.patch2/include/asm-m32r/mmu.h 2006-09-21 > > 09:37:26.000000000 +0800 > > +++ linux-2.6.18.patch3/include/asm-m32r/mmu.h 2006-09-21 > > 09:52:02.000000000 +0800 > > @@ -6,6 +6,7 @@ > > typedef struct { > > struct vm_list_struct *vmlist; > > unsigned long end_brk; > > + unsigned long stack_start; > > } mm_context_t; > > #else > > > > diff -urN linux-2.6.18.patch2/include/asm-m68knommu/mmu.h > > linux-2.6.18.patch3/include/asm-m68knommu/mmu.h > > --- linux-2.6.18.patch2/include/asm-m68knommu/mmu.h 2006-09-21 > > 09:37:26.000000000 +0800 > > +++ linux-2.6.18.patch3/include/asm-m68knommu/mmu.h 2006-09-21 > > 09:52:02.000000000 +0800 > > @@ -6,6 +6,7 @@ > > typedef struct { > > struct vm_list_struct *vmlist; > > unsigned long end_brk; > > + unsigned long stack_start; > > } mm_context_t; > > > > #endif /* __M68KNOMMU_MMU_H */ > > diff -urN linux-2.6.18.patch2/include/asm-sh/mmu.h > > linux-2.6.18.patch3/include/asm-sh/mmu.h > > --- linux-2.6.18.patch2/include/asm-sh/mmu.h 2006-09-21 09:37:26.000000000 +0800 > > +++ linux-2.6.18.patch3/include/asm-sh/mmu.h 2006-09-21 09:52:02.000000000 +0800 > > @@ -17,6 +17,7 @@ > > typedef struct { > > struct mm_tblock_struct tblock; > > unsigned long end_brk; > > + unsigned long stack_start; > > } mm_context_t; > > > > #else > > diff -urN linux-2.6.18.patch2/include/asm-v850/mmu.h > > linux-2.6.18.patch3/include/asm-v850/mmu.h > > --- linux-2.6.18.patch2/include/asm-v850/mmu.h 2006-09-21 > > 09:37:27.000000000 +0800 > > +++ linux-2.6.18.patch3/include/asm-v850/mmu.h 2006-09-21 > > 09:52:02.000000000 +0800 > > @@ -6,6 +6,7 @@ > > typedef struct { > > struct vm_list_struct *vmlist; > > unsigned long end_brk; > > + unsigned long stack_start; > > } mm_context_t; > > > > #endif /* __V850_MMU_H__ */ > > diff -urN linux-2.6.18.patch2/include/linux/flat.h > > linux-2.6.18.patch3/include/linux/flat.h > > --- linux-2.6.18.patch2/include/linux/flat.h 2006-09-21 09:37:27.000000000 +0800 > > +++ linux-2.6.18.patch3/include/linux/flat.h 2006-09-21 09:52:02.000000000 +0800 > > @@ -10,6 +10,13 @@ > > #ifndef _LINUX_FLAT_H > > #define _LINUX_FLAT_H > > > > +#define FLAT_FLAG_RAM 0x0001 /* load program entirely into RAM */ > > +#define FLAT_FLAG_GOTPIC 0x0002 /* program is PIC with GOT */ > > +#define FLAT_FLAG_GZIP 0x0004 /* all but the header is compressed */ > > +#define FLAT_FLAG_GZDATA 0x0008 /* only data/relocs are compressed (for XIP) */ > > +#define FLAT_FLAG_KTRACE 0x0010 /* output useful kernel trace for debugging */ > > +#define FLAT_FLAG_L1STK 0x0020 /* use a 4k stack in L1 scratch memory. */ > > + > > #ifdef __KERNEL__ > > #include > > #endif > > @@ -50,12 +57,6 @@ > > unsigned long filler[5]; /* Reservered, set to zero */ > > }; > > > > -#define FLAT_FLAG_RAM 0x0001 /* load program entirely into RAM */ > > -#define FLAT_FLAG_GOTPIC 0x0002 /* program is PIC with GOT */ > > -#define FLAT_FLAG_GZIP 0x0004 /* all but the header is compressed */ > > -#define FLAT_FLAG_GZDATA 0x0008 /* only data/relocs are compressed (for XIP) */ > > -#define FLAT_FLAG_KTRACE 0x0010 /* output useful kernel trace for debugging */ > > - > > > > #ifdef __KERNEL__ /* so systems without linux headers can compile the apps */ > > /* > > > > > > On 9/21/06, Randy.Dunlap wrote: > > > On Thu, 21 Sep 2006 11:33:20 +0800 Luke Yang wrote: > > > > > > > Hi all, > > > > > > Patch is malformed due to format=flowed. > > > > > > > fs/binfmt_elf_fdpic.c | 7 +- > > > > fs/binfmt_flat.c | 150 ++++++++++++++++++++++++++------------------ > > > > include/asm-arm/mmu.h | 1 > > > > include/asm-frv/mmu.h | 1 > > > > include/asm-h8300/mmu.h | 1 > > > > include/asm-m32r/mmu.h | 1 > > > > include/asm-m68knommu/mmu.h | 1 > > > > include/asm-sh/mmu.h | 1 > > > > include/asm-v850/mmu.h | 1 > > > > include/linux/flat.h | 13 ++- > > > > 10 files changed, 112 insertions(+), 65 deletions(-) > > > > > > > diff -urN linux-2.6.18.patch2/fs/binfmt_flat.c > > > > linux-2.6.18.patch3/fs/binfmt_flat.c > > > > --- linux-2.6.18.patch2/fs/binfmt_flat.c 2006-09-21 09:37:18.000000000 +0800 > > > > +++ linux-2.6.18.patch3/fs/binfmt_flat.c 2006-09-21 09:52:02.000000000 +0800 > > > > @@ -16,6 +16,7 @@ > > > > */ > > > > > > > > #include > > > > +#include > > > > > > Don't add config.h at all. > > > > > > > #include > > > > #include > > > > #include > > > > > > > @@ -413,7 +416,9 @@ > > > > /****************************************************************************/ > > > > > > > > static int load_flat_file(struct linux_binprm * bprm, > > > > - struct lib_info *libinfo, int id, unsigned long *extra_stack) > > > > + struct lib_info *libinfo, int id, > > > > + unsigned long *extra_stack, > > > > + unsigned long *stack_base) > > > > { > > > > struct flat_hdr * hdr; > > > > unsigned long textpos = 0, datapos = 0, result; > > > > @@ -426,7 +431,6 @@ > > > > int i, rev, relocs = 0; > > > > loff_t fpos; > > > > unsigned long start_code, end_code; > > > > - int ret; > > > > > > > > hdr = ((struct flat_hdr *) bprm->buf); /* exec-header */ > > > > inode = bprm->file->f_dentry->d_inode; > > > > @@ -451,25 +455,24 @@ > > > > */ > > > > if (strncmp(hdr->magic, "#!", 2)) > > > > printk("BINFMT_FLAT: bad header magic\n"); > > > > - ret = -ENOEXEC; > > > > - goto err; > > > > + return -ENOEXEC; > > > > > > Some of us actually prefer to have one exit path per function, > > > not multiple ones. It can help with debugging... > > > > > > and it would be Good to describe such a change in the > > > patch description too, but I'd prefer not to see that > > > particular change. > > > > > > > > > > } > > > > - > > > > +#ifdef DEBUG > > > > + flags |= FLAT_FLAG_KTRACE; > > > > +#endif > > > > if (flags & FLAT_FLAG_KTRACE) > > > > printk("BINFMT_FLAT: Loading file: %s\n", bprm->filename); > > > > > > > > if (rev != FLAT_VERSION && rev != OLD_FLAT_VERSION) { > > > > printk("BINFMT_FLAT: bad flat file version 0x%x (supported 0x%x and > > > > 0x%x)\n", rev, FLAT_VERSION, OLD_FLAT_VERSION); > > > > - ret = -ENOEXEC; > > > > - goto err; > > > > + return -ENOEXEC; > > > > } > > > > - > > > > + > > > > /* Don't allow old format executables to use shared libraries */ > > > > if (rev == OLD_FLAT_VERSION && id != 0) { > > > > printk("BINFMT_FLAT: shared libraries are not available before rev 0x%x\n", > > > > (int) FLAT_VERSION); > > > > - ret = -ENOEXEC; > > > > - goto err; > > > > + return -ENOEXEC; > > > > } > > > > > > > > /* > > > > @@ -482,8 +485,7 @@ > > > > #ifndef CONFIG_BINFMT_ZFLAT > > > > if (flags & (FLAT_FLAG_GZIP|FLAT_FLAG_GZDATA)) { > > > > printk("Support for ZFLAT executables is not enabled.\n"); > > > > - ret = -ENOEXEC; > > > > - goto err; > > > > + return -ENOEXEC; > > > > } > > > > #endif > > > > > > > > @@ -495,18 +497,27 @@ > > > > rlim = current->signal->rlim[RLIMIT_DATA].rlim_cur; > > > > if (rlim >= RLIM_INFINITY) > > > > rlim = ~0; > > > > - if (data_len + bss_len > rlim) { > > > > - ret = -ENOMEM; > > > > - goto err; > > > > + if (data_len + bss_len > rlim) > > > > + return -ENOMEM; > > > > + > > > > + if (flags & FLAT_FLAG_L1STK) { > > > > + if (stack_base == 0) { > > > > + printk ("BINFMT_FLAT: requesting L1 stack for shared library\n"); > > > > > > No space between printk and '('. > > > Use a printk level, like KERN_DEBUG (or drop this printk call > > > completely :). > > > > > > > + return -ENOEXEC; > > > > + } > > > > > > --- > > > ~Randy > > > > > > > > > -- > > Best regards, > > Luke Yang > > luke.adi@gmail.com > > > > > -- > Best regards, > Luke Yang > luke.adi@gmail.com > - > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ > --- ~Randy - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/