]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/binfmt_elf.c
[XFRM]: Fix protocol field value for outgoing IPv6 GSO packets
[linux-2.6-omap-h63xx.git] / fs / binfmt_elf.c
index 451c04fecb4310b11fd803763637e722265809ea..672a3b90bc556628874d5ab1494b654dc486a74b 100644 (file)
@@ -84,7 +84,7 @@ static struct linux_binfmt elf_format = {
                .min_coredump   = ELF_EXEC_PAGESIZE
 };
 
-#define BAD_ADDR(x) ((unsigned long)(x) > TASK_SIZE)
+#define BAD_ADDR(x) ((unsigned long)(x) >= TASK_SIZE)
 
 static int set_brk(unsigned long start, unsigned long end)
 {
@@ -177,10 +177,11 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec,
        }
 
        /* Create the ELF interpreter info */
-       elf_info = (elf_addr_t *) current->mm->saved_auxv;
+       elf_info = (elf_addr_t *)current->mm->saved_auxv;
 #define NEW_AUX_ENT(id, val) \
        do { \
-               elf_info[ei_index++] = id; elf_info[ei_index++] = val; \
+               elf_info[ei_index++] = id; \
+               elf_info[ei_index++] = val; \
        } while (0)
 
 #ifdef ARCH_DLINFO
@@ -199,17 +200,17 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec,
        NEW_AUX_ENT(AT_BASE, interp_load_addr);
        NEW_AUX_ENT(AT_FLAGS, 0);
        NEW_AUX_ENT(AT_ENTRY, exec->e_entry);
-       NEW_AUX_ENT(AT_UID, (elf_addr_t)tsk->uid);
-       NEW_AUX_ENT(AT_EUID, (elf_addr_t)tsk->euid);
-       NEW_AUX_ENT(AT_GID, (elf_addr_t)tsk->gid);
-       NEW_AUX_ENT(AT_EGID, (elf_addr_t)tsk->egid);
-       NEW_AUX_ENT(AT_SECURE, (elf_addr_t)security_bprm_secureexec(bprm));
+       NEW_AUX_ENT(AT_UID, tsk->uid);
+       NEW_AUX_ENT(AT_EUID, tsk->euid);
+       NEW_AUX_ENT(AT_GID, tsk->gid);
+       NEW_AUX_ENT(AT_EGID, tsk->egid);
+       NEW_AUX_ENT(AT_SECURE, security_bprm_secureexec(bprm));
        if (k_platform) {
                NEW_AUX_ENT(AT_PLATFORM,
-                       (elf_addr_t)(unsigned long)u_platform);
+                           (elf_addr_t)(unsigned long)u_platform);
        }
        if (bprm->interp_flags & BINPRM_FLAGS_EXECFD) {
-               NEW_AUX_ENT(AT_EXECFD, (elf_addr_t)bprm->interp_data);
+               NEW_AUX_ENT(AT_EXECFD, bprm->interp_data);
        }
 #undef NEW_AUX_ENT
        /* AT_NULL is zero; clear the rest too */
@@ -393,7 +394,7 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
                         * <= p_memsize so it's only necessary to check p_memsz.
                         */
                        k = load_addr + eppnt->p_vaddr;
-                       if (k > TASK_SIZE ||
+                       if (BAD_ADDR(k) ||
                            eppnt->p_filesz > eppnt->p_memsz ||
                            eppnt->p_memsz > TASK_SIZE ||
                            TASK_SIZE - eppnt->p_memsz < k) {
@@ -886,7 +887,7 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs)
                 * allowed task size. Note that p_filesz must always be
                 * <= p_memsz so it is only necessary to check p_memsz.
                 */
-               if (k > TASK_SIZE || elf_ppnt->p_filesz > elf_ppnt->p_memsz ||
+               if (BAD_ADDR(k) || elf_ppnt->p_filesz > elf_ppnt->p_memsz ||
                    elf_ppnt->p_memsz > TASK_SIZE ||
                    TASK_SIZE - elf_ppnt->p_memsz < k) {
                        /* set_brk can never work. Avoid overflows. */
@@ -940,10 +941,9 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs)
                                                    interpreter,
                                                    &interp_load_addr);
                if (BAD_ADDR(elf_entry)) {
-                       printk(KERN_ERR "Unable to load interpreter %.128s\n",
-                               elf_interpreter);
                        force_sig(SIGSEGV, current);
-                       retval = -ENOEXEC; /* Nobody gets to see this, but.. */
+                       retval = IS_ERR((void *)elf_entry) ?
+                                       (int)elf_entry : -EINVAL;
                        goto out_free_dentry;
                }
                reloc_func_desc = interp_load_addr;
@@ -954,8 +954,8 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs)
        } else {
                elf_entry = loc->elf_ex.e_entry;
                if (BAD_ADDR(elf_entry)) {
-                       send_sig(SIGSEGV, current, 0);
-                       retval = -ENOEXEC; /* Nobody gets to see this, but.. */
+                       force_sig(SIGSEGV, current);
+                       retval = -EINVAL;
                        goto out_free_dentry;
                }
        }
@@ -1185,8 +1185,6 @@ static int maydump(struct vm_area_struct *vma)
        return 1;
 }
 
-#define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
-
 /* An ELF note in memory */
 struct memelfnote
 {