linux/fs/binfmt_elf.c
<<
>>
Prefs
   1/*
   2 * linux/fs/binfmt_elf.c
   3 *
   4 * These are the functions used to load ELF format executables as used
   5 * on SVr4 machines.  Information on the format may be found in the book
   6 * "UNIX SYSTEM V RELEASE 4 Programmers Guide: Ansi C and Programming Support
   7 * Tools".
   8 *
   9 * Copyright 1993, 1994: Eric Youngdale (ericy@cais.com).
  10 */
  11
  12#include <linux/module.h>
  13#include <linux/kernel.h>
  14#include <linux/fs.h>
  15#include <linux/mm.h>
  16#include <linux/mman.h>
  17#include <linux/errno.h>
  18#include <linux/signal.h>
  19#include <linux/binfmts.h>
  20#include <linux/string.h>
  21#include <linux/file.h>
  22#include <linux/slab.h>
  23#include <linux/personality.h>
  24#include <linux/elfcore.h>
  25#include <linux/init.h>
  26#include <linux/highuid.h>
  27#include <linux/compiler.h>
  28#include <linux/highmem.h>
  29#include <linux/pagemap.h>
  30#include <linux/security.h>
  31#include <linux/random.h>
  32#include <linux/elf.h>
  33#include <linux/utsname.h>
  34#include <asm/uaccess.h>
  35#include <asm/param.h>
  36#include <asm/page.h>
  37
  38static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs);
  39static int load_elf_library(struct file *);
  40static unsigned long elf_map(struct file *, unsigned long, struct elf_phdr *,
  41                                int, int, unsigned long);
  42
  43/*
  44 * If we don't support core dumping, then supply a NULL so we
  45 * don't even try.
  46 */
  47#ifdef CONFIG_ELF_CORE
  48static int elf_core_dump(struct coredump_params *cprm);
  49#else
  50#define elf_core_dump   NULL
  51#endif
  52
  53#if ELF_EXEC_PAGESIZE > PAGE_SIZE
  54#define ELF_MIN_ALIGN   ELF_EXEC_PAGESIZE
  55#else
  56#define ELF_MIN_ALIGN   PAGE_SIZE
  57#endif
  58
  59#ifndef ELF_CORE_EFLAGS
  60#define ELF_CORE_EFLAGS 0
  61#endif
  62
  63#define ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(ELF_MIN_ALIGN-1))
  64#define ELF_PAGEOFFSET(_v) ((_v) & (ELF_MIN_ALIGN-1))
  65#define ELF_PAGEALIGN(_v) (((_v) + ELF_MIN_ALIGN - 1) & ~(ELF_MIN_ALIGN - 1))
  66
  67static struct linux_binfmt elf_format = {
  68                .module         = THIS_MODULE,
  69                .load_binary    = load_elf_binary,
  70                .load_shlib     = load_elf_library,
  71                .core_dump      = elf_core_dump,
  72                .min_coredump   = ELF_EXEC_PAGESIZE,
  73                .hasvdso        = 1
  74};
  75
  76#define BAD_ADDR(x) ((unsigned long)(x) >= TASK_SIZE)
  77
  78static int set_brk(unsigned long start, unsigned long end)
  79{
  80        start = ELF_PAGEALIGN(start);
  81        end = ELF_PAGEALIGN(end);
  82        if (end > start) {
  83                unsigned long addr;
  84                down_write(&current->mm->mmap_sem);
  85                addr = do_brk(start, end - start);
  86                up_write(&current->mm->mmap_sem);
  87                if (BAD_ADDR(addr))
  88                        return addr;
  89        }
  90        current->mm->start_brk = current->mm->brk = end;
  91        return 0;
  92}
  93
  94/* We need to explicitly zero any fractional pages
  95   after the data section (i.e. bss).  This would
  96   contain the junk from the file that should not
  97   be in memory
  98 */
  99static int padzero(unsigned long elf_bss)
 100{
 101        unsigned long nbyte;
 102
 103        nbyte = ELF_PAGEOFFSET(elf_bss);
 104        if (nbyte) {
 105                nbyte = ELF_MIN_ALIGN - nbyte;
 106                if (clear_user((void __user *) elf_bss, nbyte))
 107                        return -EFAULT;
 108        }
 109        return 0;
 110}
 111
 112/* Let's use some macros to make this stack manipulation a little clearer */
 113#ifdef CONFIG_STACK_GROWSUP
 114#define STACK_ADD(sp, items) ((elf_addr_t __user *)(sp) + (items))
 115#define STACK_ROUND(sp, items) \
 116        ((15 + (unsigned long) ((sp) + (items))) &~ 15UL)
 117#define STACK_ALLOC(sp, len) ({ \
 118        elf_addr_t __user *old_sp = (elf_addr_t __user *)sp; sp += len; \
 119        old_sp; })
 120#else
 121#define STACK_ADD(sp, items) ((elf_addr_t __user *)(sp) - (items))
 122#define STACK_ROUND(sp, items) \
 123        (((unsigned long) (sp - items)) &~ 15UL)
 124#define STACK_ALLOC(sp, len) ({ sp -= len ; sp; })
 125#endif
 126
 127#ifndef ELF_BASE_PLATFORM
 128/*
 129 * AT_BASE_PLATFORM indicates the "real" hardware/microarchitecture.
 130 * If the arch defines ELF_BASE_PLATFORM (in asm/elf.h), the value
 131 * will be copied to the user stack in the same manner as AT_PLATFORM.
 132 */
 133#define ELF_BASE_PLATFORM NULL
 134#endif
 135
 136static int
 137create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec,
 138                unsigned long load_addr, unsigned long interp_load_addr)
 139{
 140        unsigned long p = bprm->p;
 141        int argc = bprm->argc;
 142        int envc = bprm->envc;
 143        elf_addr_t __user *argv;
 144        elf_addr_t __user *envp;
 145        elf_addr_t __user *sp;
 146        elf_addr_t __user *u_platform;
 147        elf_addr_t __user *u_base_platform;
 148        elf_addr_t __user *u_rand_bytes;
 149        const char *k_platform = ELF_PLATFORM;
 150        const char *k_base_platform = ELF_BASE_PLATFORM;
 151        unsigned char k_rand_bytes[16];
 152        int items;
 153        elf_addr_t *elf_info;
 154        int ei_index = 0;
 155        const struct cred *cred = current_cred();
 156        struct vm_area_struct *vma;
 157
 158        /*
 159         * In some cases (e.g. Hyper-Threading), we want to avoid L1
 160         * evictions by the processes running on the same package. One
 161         * thing we can do is to shuffle the initial stack for them.
 162         */
 163
 164        p = arch_align_stack(p);
 165
 166        /*
 167         * If this architecture has a platform capability string, copy it
 168         * to userspace.  In some cases (Sparc), this info is impossible
 169         * for userspace to get any other way, in others (i386) it is
 170         * merely difficult.
 171         */
 172        u_platform = NULL;
 173        if (k_platform) {
 174                size_t len = strlen(k_platform) + 1;
 175
 176                u_platform = (elf_addr_t __user *)STACK_ALLOC(p, len);
 177                if (__copy_to_user(u_platform, k_platform, len))
 178                        return -EFAULT;
 179        }
 180
 181        /*
 182         * If this architecture has a "base" platform capability
 183         * string, copy it to userspace.
 184         */
 185        u_base_platform = NULL;
 186        if (k_base_platform) {
 187                size_t len = strlen(k_base_platform) + 1;
 188
 189                u_base_platform = (elf_addr_t __user *)STACK_ALLOC(p, len);
 190                if (__copy_to_user(u_base_platform, k_base_platform, len))
 191                        return -EFAULT;
 192        }
 193
 194        /*
 195         * Generate 16 random bytes for userspace PRNG seeding.
 196         */
 197        get_random_bytes(k_rand_bytes, sizeof(k_rand_bytes));
 198        u_rand_bytes = (elf_addr_t __user *)
 199                       STACK_ALLOC(p, sizeof(k_rand_bytes));
 200        if (__copy_to_user(u_rand_bytes, k_rand_bytes, sizeof(k_rand_bytes)))
 201                return -EFAULT;
 202
 203        /* Create the ELF interpreter info */
 204        elf_info = (elf_addr_t *)current->mm->saved_auxv;
 205        /* update AT_VECTOR_SIZE_BASE if the number of NEW_AUX_ENT() changes */
 206#define NEW_AUX_ENT(id, val) \
 207        do { \
 208                elf_info[ei_index++] = id; \
 209                elf_info[ei_index++] = val; \
 210        } while (0)
 211
 212#ifdef ARCH_DLINFO
 213        /* 
 214         * ARCH_DLINFO must come first so PPC can do its special alignment of
 215         * AUXV.
 216         * update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT() in
 217         * ARCH_DLINFO changes
 218         */
 219        ARCH_DLINFO;
 220#endif
 221        NEW_AUX_ENT(AT_HWCAP, ELF_HWCAP);
 222        NEW_AUX_ENT(AT_PAGESZ, ELF_EXEC_PAGESIZE);
 223        NEW_AUX_ENT(AT_CLKTCK, CLOCKS_PER_SEC);
 224        NEW_AUX_ENT(AT_PHDR, load_addr + exec->e_phoff);
 225        NEW_AUX_ENT(AT_PHENT, sizeof(struct elf_phdr));
 226        NEW_AUX_ENT(AT_PHNUM, exec->e_phnum);
 227        NEW_AUX_ENT(AT_BASE, interp_load_addr);
 228        NEW_AUX_ENT(AT_FLAGS, 0);
 229        NEW_AUX_ENT(AT_ENTRY, exec->e_entry);
 230        NEW_AUX_ENT(AT_UID, cred->uid);
 231        NEW_AUX_ENT(AT_EUID, cred->euid);
 232        NEW_AUX_ENT(AT_GID, cred->gid);
 233        NEW_AUX_ENT(AT_EGID, cred->egid);
 234        NEW_AUX_ENT(AT_SECURE, security_bprm_secureexec(bprm));
 235        NEW_AUX_ENT(AT_RANDOM, (elf_addr_t)(unsigned long)u_rand_bytes);
 236        NEW_AUX_ENT(AT_EXECFN, bprm->exec);
 237        if (k_platform) {
 238                NEW_AUX_ENT(AT_PLATFORM,
 239                            (elf_addr_t)(unsigned long)u_platform);
 240        }
 241        if (k_base_platform) {
 242                NEW_AUX_ENT(AT_BASE_PLATFORM,
 243                            (elf_addr_t)(unsigned long)u_base_platform);
 244        }
 245        if (bprm->interp_flags & BINPRM_FLAGS_EXECFD) {
 246                NEW_AUX_ENT(AT_EXECFD, bprm->interp_data);
 247        }
 248#undef NEW_AUX_ENT
 249        /* AT_NULL is zero; clear the rest too */
 250        memset(&elf_info[ei_index], 0,
 251               sizeof current->mm->saved_auxv - ei_index * sizeof elf_info[0]);
 252
 253        /* And advance past the AT_NULL entry.  */
 254        ei_index += 2;
 255
 256        sp = STACK_ADD(p, ei_index);
 257
 258        items = (argc + 1) + (envc + 1) + 1;
 259        bprm->p = STACK_ROUND(sp, items);
 260
 261        /* Point sp at the lowest address on the stack */
 262#ifdef CONFIG_STACK_GROWSUP
 263        sp = (elf_addr_t __user *)bprm->p - items - ei_index;
 264        bprm->exec = (unsigned long)sp; /* XXX: PARISC HACK */
 265#else
 266        sp = (elf_addr_t __user *)bprm->p;
 267#endif
 268
 269
 270        /*
 271         * Grow the stack manually; some architectures have a limit on how
 272         * far ahead a user-space access may be in order to grow the stack.
 273         */
 274        vma = find_extend_vma(current->mm, bprm->p);
 275        if (!vma)
 276                return -EFAULT;
 277
 278        /* Now, let's put argc (and argv, envp if appropriate) on the stack */
 279        if (__put_user(argc, sp++))
 280                return -EFAULT;
 281        argv = sp;
 282        envp = argv + argc + 1;
 283
 284        /* Populate argv and envp */
 285        p = current->mm->arg_end = current->mm->arg_start;
 286        while (argc-- > 0) {
 287                size_t len;
 288                if (__put_user((elf_addr_t)p, argv++))
 289                        return -EFAULT;
 290                len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);
 291                if (!len || len > MAX_ARG_STRLEN)
 292                        return -EINVAL;
 293                p += len;
 294        }
 295        if (__put_user(0, argv))
 296                return -EFAULT;
 297        current->mm->arg_end = current->mm->env_start = p;
 298        while (envc-- > 0) {
 299                size_t len;
 300                if (__put_user((elf_addr_t)p, envp++))
 301                        return -EFAULT;
 302                len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);
 303                if (!len || len > MAX_ARG_STRLEN)
 304                        return -EINVAL;
 305                p += len;
 306        }
 307        if (__put_user(0, envp))
 308                return -EFAULT;
 309        current->mm->env_end = p;
 310
 311        /* Put the elf_info on the stack in the right place.  */
 312        sp = (elf_addr_t __user *)envp + 1;
 313        if (copy_to_user(sp, elf_info, ei_index * sizeof(elf_addr_t)))
 314                return -EFAULT;
 315        return 0;
 316}
 317
 318#ifndef elf_map
 319
 320static unsigned long elf_map(struct file *filep, unsigned long addr,
 321                struct elf_phdr *eppnt, int prot, int type,
 322                unsigned long total_size)
 323{
 324        unsigned long map_addr;
 325        unsigned long size = eppnt->p_filesz + ELF_PAGEOFFSET(eppnt->p_vaddr);
 326        unsigned long off = eppnt->p_offset - ELF_PAGEOFFSET(eppnt->p_vaddr);
 327        addr = ELF_PAGESTART(addr);
 328        size = ELF_PAGEALIGN(size);
 329
 330        /* mmap() will return -EINVAL if given a zero size, but a
 331         * segment with zero filesize is perfectly valid */
 332        if (!size)
 333                return addr;
 334
 335        down_write(&current->mm->mmap_sem);
 336        /*
 337        * total_size is the size of the ELF (interpreter) image.
 338        * The _first_ mmap needs to know the full size, otherwise
 339        * randomization might put this image into an overlapping
 340        * position with the ELF binary image. (since size < total_size)
 341        * So we first map the 'big' image - and unmap the remainder at
 342        * the end. (which unmap is needed for ELF images with holes.)
 343        */
 344        if (total_size) {
 345                total_size = ELF_PAGEALIGN(total_size);
 346                map_addr = do_mmap(filep, addr, total_size, prot, type, off);
 347                if (!BAD_ADDR(map_addr))
 348                        do_munmap(current->mm, map_addr+size, total_size-size);
 349        } else
 350                map_addr = do_mmap(filep, addr, size, prot, type, off);
 351
 352        up_write(&current->mm->mmap_sem);
 353        return(map_addr);
 354}
 355
 356#endif /* !elf_map */
 357
 358static unsigned long total_mapping_size(struct elf_phdr *cmds, int nr)
 359{
 360        int i, first_idx = -1, last_idx = -1;
 361
 362        for (i = 0; i < nr; i++) {
 363                if (cmds[i].p_type == PT_LOAD) {
 364                        last_idx = i;
 365                        if (first_idx == -1)
 366                                first_idx = i;
 367                }
 368        }
 369        if (first_idx == -1)
 370                return 0;
 371
 372        return cmds[last_idx].p_vaddr + cmds[last_idx].p_memsz -
 373                                ELF_PAGESTART(cmds[first_idx].p_vaddr);
 374}
 375
 376
 377/* This is much more generalized than the library routine read function,
 378   so we keep this separate.  Technically the library read function
 379   is only provided so that we can read a.out libraries that have
 380   an ELF header */
 381
 382static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
 383                struct file *interpreter, unsigned long *interp_map_addr,
 384                unsigned long no_base)
 385{
 386        struct elf_phdr *elf_phdata;
 387        struct elf_phdr *eppnt;
 388        unsigned long load_addr = 0;
 389        int load_addr_set = 0;
 390        unsigned long last_bss = 0, elf_bss = 0;
 391        unsigned long error = ~0UL;
 392        unsigned long total_size;
 393        int retval, i, size;
 394
 395        /* First of all, some simple consistency checks */
 396        if (interp_elf_ex->e_type != ET_EXEC &&
 397            interp_elf_ex->e_type != ET_DYN)
 398                goto out;
 399        if (!elf_check_arch(interp_elf_ex))
 400                goto out;
 401        if (!interpreter->f_op || !interpreter->f_op->mmap)
 402                goto out;
 403
 404        /*
 405         * If the size of this structure has changed, then punt, since
 406         * we will be doing the wrong thing.
 407         */
 408        if (interp_elf_ex->e_phentsize != sizeof(struct elf_phdr))
 409                goto out;
 410        if (interp_elf_ex->e_phnum < 1 ||
 411                interp_elf_ex->e_phnum > 65536U / sizeof(struct elf_phdr))
 412                goto out;
 413
 414        /* Now read in all of the header information */
 415        size = sizeof(struct elf_phdr) * interp_elf_ex->e_phnum;
 416        if (size > ELF_MIN_ALIGN)
 417                goto out;
 418        elf_phdata = kmalloc(size, GFP_KERNEL);
 419        if (!elf_phdata)
 420                goto out;
 421
 422        retval = kernel_read(interpreter, interp_elf_ex->e_phoff,
 423                             (char *)elf_phdata,size);
 424        error = -EIO;
 425        if (retval != size) {
 426                if (retval < 0)
 427                        error = retval; 
 428                goto out_close;
 429        }
 430
 431        total_size = total_mapping_size(elf_phdata, interp_elf_ex->e_phnum);
 432        if (!total_size) {
 433                error = -EINVAL;
 434                goto out_close;
 435        }
 436
 437        eppnt = elf_phdata;
 438        for (i = 0; i < interp_elf_ex->e_phnum; i++, eppnt++) {
 439                if (eppnt->p_type == PT_LOAD) {
 440                        int elf_type = MAP_PRIVATE | MAP_DENYWRITE;
 441                        int elf_prot = 0;
 442                        unsigned long vaddr = 0;
 443                        unsigned long k, map_addr;
 444
 445                        if (eppnt->p_flags & PF_R)
 446                                elf_prot = PROT_READ;
 447                        if (eppnt->p_flags & PF_W)
 448                                elf_prot |= PROT_WRITE;
 449                        if (eppnt->p_flags & PF_X)
 450                                elf_prot |= PROT_EXEC;
 451                        vaddr = eppnt->p_vaddr;
 452                        if (interp_elf_ex->e_type == ET_EXEC || load_addr_set)
 453                                elf_type |= MAP_FIXED;
 454                        else if (no_base && interp_elf_ex->e_type == ET_DYN)
 455                                load_addr = -vaddr;
 456
 457                        map_addr = elf_map(interpreter, load_addr + vaddr,
 458                                        eppnt, elf_prot, elf_type, total_size);
 459                        total_size = 0;
 460                        if (!*interp_map_addr)
 461                                *interp_map_addr = map_addr;
 462                        error = map_addr;
 463                        if (BAD_ADDR(map_addr))
 464                                goto out_close;
 465
 466                        if (!load_addr_set &&
 467                            interp_elf_ex->e_type == ET_DYN) {
 468                                load_addr = map_addr - ELF_PAGESTART(vaddr);
 469                                load_addr_set = 1;
 470                        }
 471
 472                        /*
 473                         * Check to see if the section's size will overflow the
 474                         * allowed task size. Note that p_filesz must always be
 475                         * <= p_memsize so it's only necessary to check p_memsz.
 476                         */
 477                        k = load_addr + eppnt->p_vaddr;
 478                        if (BAD_ADDR(k) ||
 479                            eppnt->p_filesz > eppnt->p_memsz ||
 480                            eppnt->p_memsz > TASK_SIZE ||
 481                            TASK_SIZE - eppnt->p_memsz < k) {
 482                                error = -ENOMEM;
 483                                goto out_close;
 484                        }
 485
 486                        /*
 487                         * Find the end of the file mapping for this phdr, and
 488                         * keep track of the largest address we see for this.
 489                         */
 490                        k = load_addr + eppnt->p_vaddr + eppnt->p_filesz;
 491                        if (k > elf_bss)
 492                                elf_bss = k;
 493
 494                        /*
 495                         * Do the same thing for the memory mapping - between
 496                         * elf_bss and last_bss is the bss section.
 497                         */
 498                        k = load_addr + eppnt->p_memsz + eppnt->p_vaddr;
 499                        if (k > last_bss)
 500                                last_bss = k;
 501                }
 502        }
 503
 504        if (last_bss > elf_bss) {
 505                /*
 506                 * Now fill out the bss section.  First pad the last page up
 507                 * to the page boundary, and then perform a mmap to make sure
 508                 * that there are zero-mapped pages up to and including the
 509                 * last bss page.
 510                 */
 511                if (padzero(elf_bss)) {
 512                        error = -EFAULT;
 513                        goto out_close;
 514                }
 515
 516                /* What we have mapped so far */
 517                elf_bss = ELF_PAGESTART(elf_bss + ELF_MIN_ALIGN - 1);
 518
 519                /* Map the last of the bss segment */
 520                down_write(&current->mm->mmap_sem);
 521                error = do_brk(elf_bss, last_bss - elf_bss);
 522                up_write(&current->mm->mmap_sem);
 523                if (BAD_ADDR(error))
 524                        goto out_close;
 525        }
 526
 527        error = load_addr;
 528
 529out_close:
 530        kfree(elf_phdata);
 531out:
 532        return error;
 533}
 534
 535/*
 536 * These are the functions used to load ELF style executables and shared
 537 * libraries.  There is no binary dependent code anywhere else.
 538 */
 539
 540#define INTERPRETER_NONE 0
 541#define INTERPRETER_ELF 2
 542
 543#ifndef STACK_RND_MASK
 544#define STACK_RND_MASK (0x7ff >> (PAGE_SHIFT - 12))     /* 8MB of VA */
 545#endif
 546
 547static unsigned long randomize_stack_top(unsigned long stack_top)
 548{
 549        unsigned int random_variable = 0;
 550
 551        if ((current->flags & PF_RANDOMIZE) &&
 552                !(current->personality & ADDR_NO_RANDOMIZE)) {
 553                random_variable = get_random_int() & STACK_RND_MASK;
 554                random_variable <<= PAGE_SHIFT;
 555        }
 556#ifdef CONFIG_STACK_GROWSUP
 557        return PAGE_ALIGN(stack_top) + random_variable;
 558#else
 559        return PAGE_ALIGN(stack_top) - random_variable;
 560#endif
 561}
 562
 563static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs)
 564{
 565        struct file *interpreter = NULL; /* to shut gcc up */
 566        unsigned long load_addr = 0, load_bias = 0;
 567        int load_addr_set = 0;
 568        char * elf_interpreter = NULL;
 569        unsigned long error;
 570        struct elf_phdr *elf_ppnt, *elf_phdata;
 571        unsigned long elf_bss, elf_brk;
 572        int retval, i;
 573        unsigned int size;
 574        unsigned long elf_entry;
 575        unsigned long interp_load_addr = 0;
 576        unsigned long start_code, end_code, start_data, end_data;
 577        unsigned long reloc_func_desc = 0;
 578        int executable_stack = EXSTACK_DEFAULT;
 579        unsigned long def_flags = 0;
 580        struct {
 581                struct elfhdr elf_ex;
 582                struct elfhdr interp_elf_ex;
 583        } *loc;
 584
 585        loc = kmalloc(sizeof(*loc), GFP_KERNEL);
 586        if (!loc) {
 587                retval = -ENOMEM;
 588                goto out_ret;
 589        }
 590        
 591        /* Get the exec-header */
 592        loc->elf_ex = *((struct elfhdr *)bprm->buf);
 593
 594        retval = -ENOEXEC;
 595        /* First of all, some simple consistency checks */
 596        if (memcmp(loc->elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
 597                goto out;
 598
 599        if (loc->elf_ex.e_type != ET_EXEC && loc->elf_ex.e_type != ET_DYN)
 600                goto out;
 601        if (!elf_check_arch(&loc->elf_ex))
 602                goto out;
 603        if (!bprm->file->f_op||!bprm->file->f_op->mmap)
 604                goto out;
 605
 606        /* Now read in all of the header information */
 607        if (loc->elf_ex.e_phentsize != sizeof(struct elf_phdr))
 608                goto out;
 609        if (loc->elf_ex.e_phnum < 1 ||
 610                loc->elf_ex.e_phnum > 65536U / sizeof(struct elf_phdr))
 611                goto out;
 612        size = loc->elf_ex.e_phnum * sizeof(struct elf_phdr);
 613        retval = -ENOMEM;
 614        elf_phdata = kmalloc(size, GFP_KERNEL);
 615        if (!elf_phdata)
 616                goto out;
 617
 618        retval = kernel_read(bprm->file, loc->elf_ex.e_phoff,
 619                             (char *)elf_phdata, size);
 620        if (retval != size) {
 621                if (retval >= 0)
 622                        retval = -EIO;
 623                goto out_free_ph;
 624        }
 625
 626        elf_ppnt = elf_phdata;
 627        elf_bss = 0;
 628        elf_brk = 0;
 629
 630        start_code = ~0UL;
 631        end_code = 0;
 632        start_data = 0;
 633        end_data = 0;
 634
 635        for (i = 0; i < loc->elf_ex.e_phnum; i++) {
 636                if (elf_ppnt->p_type == PT_INTERP) {
 637                        /* This is the program interpreter used for
 638                         * shared libraries - for now assume that this
 639                         * is an a.out format binary
 640                         */
 641                        retval = -ENOEXEC;
 642                        if (elf_ppnt->p_filesz > PATH_MAX || 
 643                            elf_ppnt->p_filesz < 2)
 644                                goto out_free_ph;
 645
 646                        retval = -ENOMEM;
 647                        elf_interpreter = kmalloc(elf_ppnt->p_filesz,
 648                                                  GFP_KERNEL);
 649                        if (!elf_interpreter)
 650                                goto out_free_ph;
 651
 652                        retval = kernel_read(bprm->file, elf_ppnt->p_offset,
 653                                             elf_interpreter,
 654                                             elf_ppnt->p_filesz);
 655                        if (retval != elf_ppnt->p_filesz) {
 656                                if (retval >= 0)
 657                                        retval = -EIO;
 658                                goto out_free_interp;
 659                        }
 660                        /* make sure path is NULL terminated */
 661                        retval = -ENOEXEC;
 662                        if (elf_interpreter[elf_ppnt->p_filesz - 1] != '\0')
 663                                goto out_free_interp;
 664
 665                        interpreter = open_exec(elf_interpreter);
 666                        retval = PTR_ERR(interpreter);
 667                        if (IS_ERR(interpreter))
 668                                goto out_free_interp;
 669
 670                        /*
 671                         * If the binary is not readable then enforce
 672                         * mm->dumpable = 0 regardless of the interpreter's
 673                         * permissions.
 674                         */
 675                        if (file_permission(interpreter, MAY_READ) < 0)
 676                                bprm->interp_flags |= BINPRM_FLAGS_ENFORCE_NONDUMP;
 677
 678                        retval = kernel_read(interpreter, 0, bprm->buf,
 679                                             BINPRM_BUF_SIZE);
 680                        if (retval != BINPRM_BUF_SIZE) {
 681                                if (retval >= 0)
 682                                        retval = -EIO;
 683                                goto out_free_dentry;
 684                        }
 685
 686                        /* Get the exec headers */
 687                        loc->interp_elf_ex = *((struct elfhdr *)bprm->buf);
 688                        break;
 689                }
 690                elf_ppnt++;
 691        }
 692
 693        elf_ppnt = elf_phdata;
 694        for (i = 0; i < loc->elf_ex.e_phnum; i++, elf_ppnt++)
 695                if (elf_ppnt->p_type == PT_GNU_STACK) {
 696                        if (elf_ppnt->p_flags & PF_X)
 697                                executable_stack = EXSTACK_ENABLE_X;
 698                        else
 699                                executable_stack = EXSTACK_DISABLE_X;
 700                        break;
 701                }
 702
 703        /* Some simple consistency checks for the interpreter */
 704        if (elf_interpreter) {
 705                retval = -ELIBBAD;
 706                /* Not an ELF interpreter */
 707                if (memcmp(loc->interp_elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
 708                        goto out_free_dentry;
 709                /* Verify the interpreter has a valid arch */
 710                if (!elf_check_arch(&loc->interp_elf_ex))
 711                        goto out_free_dentry;
 712        }
 713
 714        /* Flush all traces of the currently running executable */
 715        retval = flush_old_exec(bprm);
 716        if (retval)
 717                goto out_free_dentry;
 718
 719        /* OK, This is the point of no return */
 720        current->flags &= ~PF_FORKNOEXEC;
 721        current->mm->def_flags = def_flags;
 722
 723        /* Do this immediately, since STACK_TOP as used in setup_arg_pages
 724           may depend on the personality.  */
 725        SET_PERSONALITY(loc->elf_ex);
 726        if (elf_read_implies_exec(loc->elf_ex, executable_stack))
 727                current->personality |= READ_IMPLIES_EXEC;
 728
 729        if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
 730                current->flags |= PF_RANDOMIZE;
 731
 732        setup_new_exec(bprm);
 733
 734        /* Do this so that we can load the interpreter, if need be.  We will
 735           change some of these later */
 736        current->mm->free_area_cache = current->mm->mmap_base;
 737        current->mm->cached_hole_size = 0;
 738        retval = setup_arg_pages(bprm, randomize_stack_top(STACK_TOP),
 739                                 executable_stack);
 740        if (retval < 0) {
 741                send_sig(SIGKILL, current, 0);
 742                goto out_free_dentry;
 743        }
 744        
 745        current->mm->start_stack = bprm->p;
 746
 747        /* Now we do a little grungy work by mmapping the ELF image into
 748           the correct location in memory. */
 749        for(i = 0, elf_ppnt = elf_phdata;
 750            i < loc->elf_ex.e_phnum; i++, elf_ppnt++) {
 751                int elf_prot = 0, elf_flags;
 752                unsigned long k, vaddr;
 753
 754                if (elf_ppnt->p_type != PT_LOAD)
 755                        continue;
 756
 757                if (unlikely (elf_brk > elf_bss)) {
 758                        unsigned long nbyte;
 759                    
 760                        /* There was a PT_LOAD segment with p_memsz > p_filesz
 761                           before this one. Map anonymous pages, if needed,
 762                           and clear the area.  */
 763                        retval = set_brk (elf_bss + load_bias,
 764                                          elf_brk + load_bias);
 765                        if (retval) {
 766                                send_sig(SIGKILL, current, 0);
 767                                goto out_free_dentry;
 768                        }
 769                        nbyte = ELF_PAGEOFFSET(elf_bss);
 770                        if (nbyte) {
 771                                nbyte = ELF_MIN_ALIGN - nbyte;
 772                                if (nbyte > elf_brk - elf_bss)
 773                                        nbyte = elf_brk - elf_bss;
 774                                if (clear_user((void __user *)elf_bss +
 775                                                        load_bias, nbyte)) {
 776                                        /*
 777                                         * This bss-zeroing can fail if the ELF
 778                                         * file specifies odd protections. So
 779                                         * we don't check the return value
 780                                         */
 781                                }
 782                        }
 783                }
 784
 785                if (elf_ppnt->p_flags & PF_R)
 786                        elf_prot |= PROT_READ;
 787                if (elf_ppnt->p_flags & PF_W)
 788                        elf_prot |= PROT_WRITE;
 789                if (elf_ppnt->p_flags & PF_X)
 790                        elf_prot |= PROT_EXEC;
 791
 792                elf_flags = MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE;
 793
 794                vaddr = elf_ppnt->p_vaddr;
 795                if (loc->elf_ex.e_type == ET_EXEC || load_addr_set) {
 796                        elf_flags |= MAP_FIXED;
 797                } else if (loc->elf_ex.e_type == ET_DYN) {
 798                        /* Try and get dynamic programs out of the way of the
 799                         * default mmap base, as well as whatever program they
 800                         * might try to exec.  This is because the brk will
 801                         * follow the loader, and is not movable.  */
 802#ifdef CONFIG_X86
 803                        load_bias = 0;
 804#else
 805                        load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr);
 806#endif
 807                }
 808
 809                error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt,
 810                                elf_prot, elf_flags, 0);
 811                if (BAD_ADDR(error)) {
 812                        send_sig(SIGKILL, current, 0);
 813                        retval = IS_ERR((void *)error) ?
 814                                PTR_ERR((void*)error) : -EINVAL;
 815                        goto out_free_dentry;
 816                }
 817
 818                if (!load_addr_set) {
 819                        load_addr_set = 1;
 820                        load_addr = (elf_ppnt->p_vaddr - elf_ppnt->p_offset);
 821                        if (loc->elf_ex.e_type == ET_DYN) {
 822                                load_bias += error -
 823                                             ELF_PAGESTART(load_bias + vaddr);
 824                                load_addr += load_bias;
 825                                reloc_func_desc = load_bias;
 826                        }
 827                }
 828                k = elf_ppnt->p_vaddr;
 829                if (k < start_code)
 830                        start_code = k;
 831                if (start_data < k)
 832                        start_data = k;
 833
 834                /*
 835                 * Check to see if the section's size will overflow the
 836                 * allowed task size. Note that p_filesz must always be
 837                 * <= p_memsz so it is only necessary to check p_memsz.
 838                 */
 839                if (BAD_ADDR(k) || elf_ppnt->p_filesz > elf_ppnt->p_memsz ||
 840                    elf_ppnt->p_memsz > TASK_SIZE ||
 841                    TASK_SIZE - elf_ppnt->p_memsz < k) {
 842                        /* set_brk can never work. Avoid overflows. */
 843                        send_sig(SIGKILL, current, 0);
 844                        retval = -EINVAL;
 845                        goto out_free_dentry;
 846                }
 847
 848                k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz;
 849
 850                if (k > elf_bss)
 851                        elf_bss = k;
 852                if ((elf_ppnt->p_flags & PF_X) && end_code < k)
 853                        end_code = k;
 854                if (end_data < k)
 855                        end_data = k;
 856                k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz;
 857                if (k > elf_brk)
 858                        elf_brk = k;
 859        }
 860
 861        loc->elf_ex.e_entry += load_bias;
 862        elf_bss += load_bias;
 863        elf_brk += load_bias;
 864        start_code += load_bias;
 865        end_code += load_bias;
 866        start_data += load_bias;
 867        end_data += load_bias;
 868
 869        /* Calling set_brk effectively mmaps the pages that we need
 870         * for the bss and break sections.  We must do this before
 871         * mapping in the interpreter, to make sure it doesn't wind
 872         * up getting placed where the bss needs to go.
 873         */
 874        retval = set_brk(elf_bss, elf_brk);
 875        if (retval) {
 876                send_sig(SIGKILL, current, 0);
 877                goto out_free_dentry;
 878        }
 879        if (likely(elf_bss != elf_brk) && unlikely(padzero(elf_bss))) {
 880                send_sig(SIGSEGV, current, 0);
 881                retval = -EFAULT; /* Nobody gets to see this, but.. */
 882                goto out_free_dentry;
 883        }
 884
 885        if (elf_interpreter) {
 886                unsigned long uninitialized_var(interp_map_addr);
 887
 888                elf_entry = load_elf_interp(&loc->interp_elf_ex,
 889                                            interpreter,
 890                                            &interp_map_addr,
 891                                            load_bias);
 892                if (!IS_ERR((void *)elf_entry)) {
 893                        /*
 894                         * load_elf_interp() returns relocation
 895                         * adjustment
 896                         */
 897                        interp_load_addr = elf_entry;
 898                        elf_entry += loc->interp_elf_ex.e_entry;
 899                }
 900                if (BAD_ADDR(elf_entry)) {
 901                        force_sig(SIGSEGV, current);
 902                        retval = IS_ERR((void *)elf_entry) ?
 903                                        (int)elf_entry : -EINVAL;
 904                        goto out_free_dentry;
 905                }
 906                reloc_func_desc = interp_load_addr;
 907
 908                allow_write_access(interpreter);
 909                fput(interpreter);
 910                kfree(elf_interpreter);
 911        } else {
 912                elf_entry = loc->elf_ex.e_entry;
 913                if (BAD_ADDR(elf_entry)) {
 914                        force_sig(SIGSEGV, current);
 915                        retval = -EINVAL;
 916                        goto out_free_dentry;
 917                }
 918        }
 919
 920        kfree(elf_phdata);
 921
 922        set_binfmt(&elf_format);
 923
 924#ifdef ARCH_HAS_SETUP_ADDITIONAL_PAGES
 925        retval = arch_setup_additional_pages(bprm, !!elf_interpreter);
 926        if (retval < 0) {
 927                send_sig(SIGKILL, current, 0);
 928                goto out;
 929        }
 930#endif /* ARCH_HAS_SETUP_ADDITIONAL_PAGES */
 931
 932        install_exec_creds(bprm);
 933        current->flags &= ~PF_FORKNOEXEC;
 934        retval = create_elf_tables(bprm, &loc->elf_ex,
 935                          load_addr, interp_load_addr);
 936        if (retval < 0) {
 937                send_sig(SIGKILL, current, 0);
 938                goto out;
 939        }
 940        /* N.B. passed_fileno might not be initialized? */
 941        current->mm->end_code = end_code;
 942        current->mm->start_code = start_code;
 943        current->mm->start_data = start_data;
 944        current->mm->end_data = end_data;
 945        current->mm->start_stack = bprm->p;
 946
 947#ifdef arch_randomize_brk
 948        if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1))
 949                current->mm->brk = current->mm->start_brk =
 950                        arch_randomize_brk(current->mm);
 951#endif
 952
 953        if (current->personality & MMAP_PAGE_ZERO) {
 954                /* Why this, you ask???  Well SVr4 maps page 0 as read-only,
 955                   and some applications "depend" upon this behavior.
 956                   Since we do not have the power to recompile these, we
 957                   emulate the SVr4 behavior. Sigh. */
 958                down_write(&current->mm->mmap_sem);
 959                error = do_mmap(NULL, 0, PAGE_SIZE, PROT_READ | PROT_EXEC,
 960                                MAP_FIXED | MAP_PRIVATE, 0);
 961                up_write(&current->mm->mmap_sem);
 962        }
 963
 964#ifdef ELF_PLAT_INIT
 965        /*
 966         * The ABI may specify that certain registers be set up in special
 967         * ways (on i386 %edx is the address of a DT_FINI function, for
 968         * example.  In addition, it may also specify (eg, PowerPC64 ELF)
 969         * that the e_entry field is the address of the function descriptor
 970         * for the startup routine, rather than the address of the startup
 971         * routine itself.  This macro performs whatever initialization to
 972         * the regs structure is required as well as any relocations to the
 973         * function descriptor entries when executing dynamically links apps.
 974         */
 975        ELF_PLAT_INIT(regs, reloc_func_desc);
 976#endif
 977
 978        start_thread(regs, elf_entry, bprm->p);
 979        retval = 0;
 980out:
 981        kfree(loc);
 982out_ret:
 983        return retval;
 984
 985        /* error cleanup */
 986out_free_dentry:
 987        allow_write_access(interpreter);
 988        if (interpreter)
 989                fput(interpreter);
 990out_free_interp:
 991        kfree(elf_interpreter);
 992out_free_ph:
 993        kfree(elf_phdata);
 994        goto out;
 995}
 996
 997/* This is really simpleminded and specialized - we are loading an
 998   a.out library that is given an ELF header. */
 999static int load_elf_library(struct file *file)
1000{
1001        struct elf_phdr *elf_phdata;
1002        struct elf_phdr *eppnt;
1003        unsigned long elf_bss, bss, len;
1004        int retval, error, i, j;
1005        struct elfhdr elf_ex;
1006
1007        error = -ENOEXEC;
1008        retval = kernel_read(file, 0, (char *)&elf_ex, sizeof(elf_ex));
1009        if (retval != sizeof(elf_ex))
1010                goto out;
1011
1012        if (memcmp(elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
1013                goto out;
1014
1015        /* First of all, some simple consistency checks */
1016        if (elf_ex.e_type != ET_EXEC || elf_ex.e_phnum > 2 ||
1017            !elf_check_arch(&elf_ex) || !file->f_op || !file->f_op->mmap)
1018                goto out;
1019
1020        /* Now read in all of the header information */
1021
1022        j = sizeof(struct elf_phdr) * elf_ex.e_phnum;
1023        /* j < ELF_MIN_ALIGN because elf_ex.e_phnum <= 2 */
1024
1025        error = -ENOMEM;
1026        elf_phdata = kmalloc(j, GFP_KERNEL);
1027        if (!elf_phdata)
1028                goto out;
1029
1030        eppnt = elf_phdata;
1031        error = -ENOEXEC;
1032        retval = kernel_read(file, elf_ex.e_phoff, (char *)eppnt, j);
1033        if (retval != j)
1034                goto out_free_ph;
1035
1036        for (j = 0, i = 0; i<elf_ex.e_phnum; i++)
1037                if ((eppnt + i)->p_type == PT_LOAD)
1038                        j++;
1039        if (j != 1)
1040                goto out_free_ph;
1041
1042        while (eppnt->p_type != PT_LOAD)
1043                eppnt++;
1044
1045        /* Now use mmap to map the library into memory. */
1046        down_write(&current->mm->mmap_sem);
1047        error = do_mmap(file,
1048                        ELF_PAGESTART(eppnt->p_vaddr),
1049                        (eppnt->p_filesz +
1050                         ELF_PAGEOFFSET(eppnt->p_vaddr)),
1051                        PROT_READ | PROT_WRITE | PROT_EXEC,
1052                        MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE,
1053                        (eppnt->p_offset -
1054                         ELF_PAGEOFFSET(eppnt->p_vaddr)));
1055        up_write(&current->mm->mmap_sem);
1056        if (error != ELF_PAGESTART(eppnt->p_vaddr))
1057                goto out_free_ph;
1058
1059        elf_bss = eppnt->p_vaddr + eppnt->p_filesz;
1060        if (padzero(elf_bss)) {
1061                error = -EFAULT;
1062                goto out_free_ph;
1063        }
1064
1065        len = ELF_PAGESTART(eppnt->p_filesz + eppnt->p_vaddr +
1066                            ELF_MIN_ALIGN - 1);
1067        bss = eppnt->p_memsz + eppnt->p_vaddr;
1068        if (bss > len) {
1069                down_write(&current->mm->mmap_sem);
1070                do_brk(len, bss - len);
1071                up_write(&current->mm->mmap_sem);
1072        }
1073        error = 0;
1074
1075out_free_ph:
1076        kfree(elf_phdata);
1077out:
1078        return error;
1079}
1080
1081#ifdef CONFIG_ELF_CORE
1082/*
1083 * ELF core dumper
1084 *
1085 * Modelled on fs/exec.c:aout_core_dump()
1086 * Jeremy Fitzhardinge <jeremy@sw.oz.au>
1087 */
1088/*
1089 * These are the only things you should do on a core-file: use only these
1090 * functions to write out all the necessary info.
1091 */
1092static int dump_write(struct file *file, const void *addr, int nr)
1093{
1094        return file->f_op->write(file, addr, nr, &file->f_pos) == nr;
1095}
1096
1097static int dump_seek(struct file *file, loff_t off)
1098{
1099        if (file->f_op->llseek && file->f_op->llseek != no_llseek) {
1100                if (file->f_op->llseek(file, off, SEEK_CUR) < 0)
1101                        return 0;
1102        } else {
1103                char *buf = (char *)get_zeroed_page(GFP_KERNEL);
1104                if (!buf)
1105                        return 0;
1106                while (off > 0) {
1107                        unsigned long n = off;
1108                        if (n > PAGE_SIZE)
1109                                n = PAGE_SIZE;
1110                        if (!dump_write(file, buf, n))
1111                                return 0;
1112                        off -= n;
1113                }
1114                free_page((unsigned long)buf);
1115        }
1116        return 1;
1117}
1118
1119/*
1120 * Decide what to dump of a segment, part, all or none.
1121 */
1122static unsigned long vma_dump_size(struct vm_area_struct *vma,
1123                                   unsigned long mm_flags)
1124{
1125#define FILTER(type)    (mm_flags & (1UL << MMF_DUMP_##type))
1126
1127        /* The vma can be set up to tell us the answer directly.  */
1128        if (vma->vm_flags & VM_ALWAYSDUMP)
1129                goto whole;
1130
1131        /* Hugetlb memory check */
1132        if (vma->vm_flags & VM_HUGETLB) {
1133                if ((vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_SHARED))
1134                        goto whole;
1135                if (!(vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_PRIVATE))
1136                        goto whole;
1137        }
1138
1139        /* Do not dump I/O mapped devices or special mappings */
1140        if (vma->vm_flags & (VM_IO | VM_RESERVED))
1141                return 0;
1142
1143        /* By default, dump shared memory if mapped from an anonymous file. */
1144        if (vma->vm_flags & VM_SHARED) {
1145                if (vma->vm_file->f_path.dentry->d_inode->i_nlink == 0 ?
1146                    FILTER(ANON_SHARED) : FILTER(MAPPED_SHARED))
1147                        goto whole;
1148                return 0;
1149        }
1150
1151        /* Dump segments that have been written to.  */
1152        if (vma->anon_vma && FILTER(ANON_PRIVATE))
1153                goto whole;
1154        if (vma->vm_file == NULL)
1155                return 0;
1156
1157        if (FILTER(MAPPED_PRIVATE))
1158                goto whole;
1159
1160        /*
1161         * If this looks like the beginning of a DSO or executable mapping,
1162         * check for an ELF header.  If we find one, dump the first page to
1163         * aid in determining what was mapped here.
1164         */
1165        if (FILTER(ELF_HEADERS) &&
1166            vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) {
1167                u32 __user *header = (u32 __user *) vma->vm_start;
1168                u32 word;
1169                mm_segment_t fs = get_fs();
1170                /*
1171                 * Doing it this way gets the constant folded by GCC.
1172                 */
1173                union {
1174                        u32 cmp;
1175                        char elfmag[SELFMAG];
1176                } magic;
1177                BUILD_BUG_ON(SELFMAG != sizeof word);
1178                magic.elfmag[EI_MAG0] = ELFMAG0;
1179                magic.elfmag[EI_MAG1] = ELFMAG1;
1180                magic.elfmag[EI_MAG2] = ELFMAG2;
1181                magic.elfmag[EI_MAG3] = ELFMAG3;
1182                /*
1183                 * Switch to the user "segment" for get_user(),
1184                 * then put back what elf_core_dump() had in place.
1185                 */
1186                set_fs(USER_DS);
1187                if (unlikely(get_user(word, header)))
1188                        word = 0;
1189                set_fs(fs);
1190                if (word == magic.cmp)
1191                        return PAGE_SIZE;
1192        }
1193
1194#undef  FILTER
1195
1196        return 0;
1197
1198whole:
1199        return vma->vm_end - vma->vm_start;
1200}
1201
1202/* An ELF note in memory */
1203struct memelfnote
1204{
1205        const char *name;
1206        int type;
1207        unsigned int datasz;
1208        void *data;
1209};
1210
1211static int notesize(struct memelfnote *en)
1212{
1213        int sz;
1214
1215        sz = sizeof(struct elf_note);
1216        sz += roundup(strlen(en->name) + 1, 4);
1217        sz += roundup(en->datasz, 4);
1218
1219        return sz;
1220}
1221
1222#define DUMP_WRITE(addr, nr, foffset)   \
1223        do { if (!dump_write(file, (addr), (nr))) return 0; *foffset += (nr); } while(0)
1224
1225static int alignfile(struct file *file, loff_t *foffset)
1226{
1227        static const char buf[4] = { 0, };
1228        DUMP_WRITE(buf, roundup(*foffset, 4) - *foffset, foffset);
1229        return 1;
1230}
1231
1232static int writenote(struct memelfnote *men, struct file *file,
1233                        loff_t *foffset)
1234{
1235        struct elf_note en;
1236        en.n_namesz = strlen(men->name) + 1;
1237        en.n_descsz = men->datasz;
1238        en.n_type = men->type;
1239
1240        DUMP_WRITE(&en, sizeof(en), foffset);
1241        DUMP_WRITE(men->name, en.n_namesz, foffset);
1242        if (!alignfile(file, foffset))
1243                return 0;
1244        DUMP_WRITE(men->data, men->datasz, foffset);
1245        if (!alignfile(file, foffset))
1246                return 0;
1247
1248        return 1;
1249}
1250#undef DUMP_WRITE
1251
1252#define DUMP_WRITE(addr, nr)                            \
1253        if ((size += (nr)) > cprm->limit ||             \
1254            !dump_write(cprm->file, (addr), (nr)))      \
1255                goto end_coredump;
1256
1257static void fill_elf_header(struct elfhdr *elf, int segs,
1258                            u16 machine, u32 flags, u8 osabi)
1259{
1260        memset(elf, 0, sizeof(*elf));
1261
1262        memcpy(elf->e_ident, ELFMAG, SELFMAG);
1263        elf->e_ident[EI_CLASS] = ELF_CLASS;
1264        elf->e_ident[EI_DATA] = ELF_DATA;
1265        elf->e_ident[EI_VERSION] = EV_CURRENT;
1266        elf->e_ident[EI_OSABI] = ELF_OSABI;
1267
1268        elf->e_type = ET_CORE;
1269        elf->e_machine = machine;
1270        elf->e_version = EV_CURRENT;
1271        elf->e_phoff = sizeof(struct elfhdr);
1272        elf->e_flags = flags;
1273        elf->e_ehsize = sizeof(struct elfhdr);
1274        elf->e_phentsize = sizeof(struct elf_phdr);
1275        elf->e_phnum = segs;
1276
1277        return;
1278}
1279
1280static void fill_elf_note_phdr(struct elf_phdr *phdr, int sz, loff_t offset)
1281{
1282        phdr->p_type = PT_NOTE;
1283        phdr->p_offset = offset;
1284        phdr->p_vaddr = 0;
1285        phdr->p_paddr = 0;
1286        phdr->p_filesz = sz;
1287        phdr->p_memsz = 0;
1288        phdr->p_flags = 0;
1289        phdr->p_align = 0;
1290        return;
1291}
1292
1293static void fill_note(struct memelfnote *note, const char *name, int type, 
1294                unsigned int sz, void *data)
1295{
1296        note->name = name;
1297        note->type = type;
1298        note->datasz = sz;
1299        note->data = data;
1300        return;
1301}
1302
1303/*
1304 * fill up all the fields in prstatus from the given task struct, except
1305 * registers which need to be filled up separately.
1306 */
1307static void fill_prstatus(struct elf_prstatus *prstatus,
1308                struct task_struct *p, long signr)
1309{
1310        prstatus->pr_info.si_signo = prstatus->pr_cursig = signr;
1311        prstatus->pr_sigpend = p->pending.signal.sig[0];
1312        prstatus->pr_sighold = p->blocked.sig[0];
1313        rcu_read_lock();
1314        prstatus->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1315        rcu_read_unlock();
1316        prstatus->pr_pid = task_pid_vnr(p);
1317        prstatus->pr_pgrp = task_pgrp_vnr(p);
1318        prstatus->pr_sid = task_session_vnr(p);
1319        if (thread_group_leader(p)) {
1320                struct task_cputime cputime;
1321
1322                /*
1323                 * This is the record for the group leader.  It shows the
1324                 * group-wide total, not its individual thread total.
1325                 */
1326                thread_group_cputime(p, &cputime);
1327                cputime_to_timeval(cputime.utime, &prstatus->pr_utime);
1328                cputime_to_timeval(cputime.stime, &prstatus->pr_stime);
1329        } else {
1330                cputime_to_timeval(p->utime, &prstatus->pr_utime);
1331                cputime_to_timeval(p->stime, &prstatus->pr_stime);
1332        }
1333        cputime_to_timeval(p->signal->cutime, &prstatus->pr_cutime);
1334        cputime_to_timeval(p->signal->cstime, &prstatus->pr_cstime);
1335}
1336
1337static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p,
1338                       struct mm_struct *mm)
1339{
1340        const struct cred *cred;
1341        unsigned int i, len;
1342        
1343        /* first copy the parameters from user space */
1344        memset(psinfo, 0, sizeof(struct elf_prpsinfo));
1345
1346        len = mm->arg_end - mm->arg_start;
1347        if (len >= ELF_PRARGSZ)
1348                len = ELF_PRARGSZ-1;
1349        if (copy_from_user(&psinfo->pr_psargs,
1350                           (const char __user *)mm->arg_start, len))
1351                return -EFAULT;
1352        for(i = 0; i < len; i++)
1353                if (psinfo->pr_psargs[i] == 0)
1354                        psinfo->pr_psargs[i] = ' ';
1355        psinfo->pr_psargs[len] = 0;
1356
1357        rcu_read_lock();
1358        psinfo->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1359        rcu_read_unlock();
1360        psinfo->pr_pid = task_pid_vnr(p);
1361        psinfo->pr_pgrp = task_pgrp_vnr(p);
1362        psinfo->pr_sid = task_session_vnr(p);
1363
1364        i = p->state ? ffz(~p->state) + 1 : 0;
1365        psinfo->pr_state = i;
1366        psinfo->pr_sname = (i > 5) ? '.' : "RSDTZW"[i];
1367        psinfo->pr_zomb = psinfo->pr_sname == 'Z';
1368        psinfo->pr_nice = task_nice(p);
1369        psinfo->pr_flag = p->flags;
1370        rcu_read_lock();
1371        cred = __task_cred(p);
1372        SET_UID(psinfo->pr_uid, cred->uid);
1373        SET_GID(psinfo->pr_gid, cred->gid);
1374        rcu_read_unlock();
1375        strncpy(psinfo->pr_fname, p->comm, sizeof(psinfo->pr_fname));
1376        
1377        return 0;
1378}
1379
1380static void fill_auxv_note(struct memelfnote *note, struct mm_struct *mm)
1381{
1382        elf_addr_t *auxv = (elf_addr_t *) mm->saved_auxv;
1383        int i = 0;
1384        do
1385                i += 2;
1386        while (auxv[i - 2] != AT_NULL);
1387        fill_note(note, "CORE", NT_AUXV, i * sizeof(elf_addr_t), auxv);
1388}
1389
1390#ifdef CORE_DUMP_USE_REGSET
1391#include <linux/regset.h>
1392
1393struct elf_thread_core_info {
1394        struct elf_thread_core_info *next;
1395        struct task_struct *task;
1396        struct elf_prstatus prstatus;
1397        struct memelfnote notes[0];
1398};
1399
1400struct elf_note_info {
1401        struct elf_thread_core_info *thread;
1402        struct memelfnote psinfo;
1403        struct memelfnote auxv;
1404        size_t size;
1405        int thread_notes;
1406};
1407
1408/*
1409 * When a regset has a writeback hook, we call it on each thread before
1410 * dumping user memory.  On register window machines, this makes sure the
1411 * user memory backing the register data is up to date before we read it.
1412 */
1413static void do_thread_regset_writeback(struct task_struct *task,
1414                                       const struct user_regset *regset)
1415{
1416        if (regset->writeback)
1417                regset->writeback(task, regset, 1);
1418}
1419
1420static int fill_thread_core_info(struct elf_thread_core_info *t,
1421                                 const struct user_regset_view *view,
1422                                 long signr, size_t *total)
1423{
1424        unsigned int i;
1425
1426        /*
1427         * NT_PRSTATUS is the one special case, because the regset data
1428         * goes into the pr_reg field inside the note contents, rather
1429         * than being the whole note contents.  We fill the reset in here.
1430         * We assume that regset 0 is NT_PRSTATUS.
1431         */
1432        fill_prstatus(&t->prstatus, t->task, signr);
1433        (void) view->regsets[0].get(t->task, &view->regsets[0],
1434                                    0, sizeof(t->prstatus.pr_reg),
1435                                    &t->prstatus.pr_reg, NULL);
1436
1437        fill_note(&t->notes[0], "CORE", NT_PRSTATUS,
1438                  sizeof(t->prstatus), &t->prstatus);
1439        *total += notesize(&t->notes[0]);
1440
1441        do_thread_regset_writeback(t->task, &view->regsets[0]);
1442
1443        /*
1444         * Each other regset might generate a note too.  For each regset
1445         * that has no core_note_type or is inactive, we leave t->notes[i]
1446         * all zero and we'll know to skip writing it later.
1447         */
1448        for (i = 1; i < view->n; ++i) {
1449                const struct user_regset *regset = &view->regsets[i];
1450                do_thread_regset_writeback(t->task, regset);
1451                if (regset->core_note_type &&
1452                    (!regset->active || regset->active(t->task, regset))) {
1453                        int ret;
1454                        size_t size = regset->n * regset->size;
1455                        void *data = kmalloc(size, GFP_KERNEL);
1456                        if (unlikely(!data))
1457                                return 0;
1458                        ret = regset->get(t->task, regset,
1459                                          0, size, data, NULL);
1460                        if (unlikely(ret))
1461                                kfree(data);
1462                        else {
1463                                if (regset->core_note_type != NT_PRFPREG)
1464                                        fill_note(&t->notes[i], "LINUX",
1465                                                  regset->core_note_type,
1466                                                  size, data);
1467                                else {
1468                                        t->prstatus.pr_fpvalid = 1;
1469                                        fill_note(&t->notes[i], "CORE",
1470                                                  NT_PRFPREG, size, data);
1471                                }
1472                                *total += notesize(&t->notes[i]);
1473                        }
1474                }
1475        }
1476
1477        return 1;
1478}
1479
1480static int fill_note_info(struct elfhdr *elf, int phdrs,
1481                          struct elf_note_info *info,
1482                          long signr, struct pt_regs *regs)
1483{
1484        struct task_struct *dump_task = current;
1485        const struct user_regset_view *view = task_user_regset_view(dump_task);
1486        struct elf_thread_core_info *t;
1487        struct elf_prpsinfo *psinfo;
1488        struct core_thread *ct;
1489        unsigned int i;
1490
1491        info->size = 0;
1492        info->thread = NULL;
1493
1494        psinfo = kmalloc(sizeof(*psinfo), GFP_KERNEL);
1495        if (psinfo == NULL)
1496                return 0;
1497
1498        fill_note(&info->psinfo, "CORE", NT_PRPSINFO, sizeof(*psinfo), psinfo);
1499
1500        /*
1501         * Figure out how many notes we're going to need for each thread.
1502         */
1503        info->thread_notes = 0;
1504        for (i = 0; i < view->n; ++i)
1505                if (view->regsets[i].core_note_type != 0)
1506                        ++info->thread_notes;
1507
1508        /*
1509         * Sanity check.  We rely on regset 0 being in NT_PRSTATUS,
1510         * since it is our one special case.
1511         */
1512        if (unlikely(info->thread_notes == 0) ||
1513            unlikely(view->regsets[0].core_note_type != NT_PRSTATUS)) {
1514                WARN_ON(1);
1515                return 0;
1516        }
1517
1518        /*
1519         * Initialize the ELF file header.
1520         */
1521        fill_elf_header(elf, phdrs,
1522                        view->e_machine, view->e_flags, view->ei_osabi);
1523
1524        /*
1525         * Allocate a structure for each thread.
1526         */
1527        for (ct = &dump_task->mm->core_state->dumper; ct; ct = ct->next) {
1528                t = kzalloc(offsetof(struct elf_thread_core_info,
1529                                     notes[info->thread_notes]),
1530                            GFP_KERNEL);
1531                if (unlikely(!t))
1532                        return 0;
1533
1534                t->task = ct->task;
1535                if (ct->task == dump_task || !info->thread) {
1536                        t->next = info->thread;
1537                        info->thread = t;
1538                } else {
1539                        /*
1540                         * Make sure to keep the original task at
1541                         * the head of the list.
1542                         */
1543                        t->next = info->thread->next;
1544                        info->thread->next = t;
1545                }
1546        }
1547
1548        /*
1549         * Now fill in each thread's information.
1550         */
1551        for (t = info->thread; t != NULL; t = t->next)
1552                if (!fill_thread_core_info(t, view, signr, &info->size))
1553                        return 0;
1554
1555        /*
1556         * Fill in the two process-wide notes.
1557         */
1558        fill_psinfo(psinfo, dump_task->group_leader, dump_task->mm);
1559        info->size += notesize(&info->psinfo);
1560
1561        fill_auxv_note(&info->auxv, current->mm);
1562        info->size += notesize(&info->auxv);
1563
1564        return 1;
1565}
1566
1567static size_t get_note_info_size(struct elf_note_info *info)
1568{
1569        return info->size;
1570}
1571
1572/*
1573 * Write all the notes for each thread.  When writing the first thread, the
1574 * process-wide notes are interleaved after the first thread-specific note.
1575 */
1576static int write_note_info(struct elf_note_info *info,
1577                           struct file *file, loff_t *foffset)
1578{
1579        bool first = 1;
1580        struct elf_thread_core_info *t = info->thread;
1581
1582        do {
1583                int i;
1584
1585                if (!writenote(&t->notes[0], file, foffset))
1586                        return 0;
1587
1588                if (first && !writenote(&info->psinfo, file, foffset))
1589                        return 0;
1590                if (first && !writenote(&info->auxv, file, foffset))
1591                        return 0;
1592
1593                for (i = 1; i < info->thread_notes; ++i)
1594                        if (t->notes[i].data &&
1595                            !writenote(&t->notes[i], file, foffset))
1596                                return 0;
1597
1598                first = 0;
1599                t = t->next;
1600        } while (t);
1601
1602        return 1;
1603}
1604
1605static void free_note_info(struct elf_note_info *info)
1606{
1607        struct elf_thread_core_info *threads = info->thread;
1608        while (threads) {
1609                unsigned int i;
1610                struct elf_thread_core_info *t = threads;
1611                threads = t->next;
1612                WARN_ON(t->notes[0].data && t->notes[0].data != &t->prstatus);
1613                for (i = 1; i < info->thread_notes; ++i)
1614                        kfree(t->notes[i].data);
1615                kfree(t);
1616        }
1617        kfree(info->psinfo.data);
1618}
1619
1620#else
1621
1622/* Here is the structure in which status of each thread is captured. */
1623struct elf_thread_status
1624{
1625        struct list_head list;
1626        struct elf_prstatus prstatus;   /* NT_PRSTATUS */
1627        elf_fpregset_t fpu;             /* NT_PRFPREG */
1628        struct task_struct *thread;
1629#ifdef ELF_CORE_COPY_XFPREGS
1630        elf_fpxregset_t xfpu;           /* ELF_CORE_XFPREG_TYPE */
1631#endif
1632        struct memelfnote notes[3];
1633        int num_notes;
1634};
1635
1636/*
1637 * In order to add the specific thread information for the elf file format,
1638 * we need to keep a linked list of every threads pr_status and then create
1639 * a single section for them in the final core file.
1640 */
1641static int elf_dump_thread_status(long signr, struct elf_thread_status *t)
1642{
1643        int sz = 0;
1644        struct task_struct *p = t->thread;
1645        t->num_notes = 0;
1646
1647        fill_prstatus(&t->prstatus, p, signr);
1648        elf_core_copy_task_regs(p, &t->prstatus.pr_reg);        
1649        
1650        fill_note(&t->notes[0], "CORE", NT_PRSTATUS, sizeof(t->prstatus),
1651                  &(t->prstatus));
1652        t->num_notes++;
1653        sz += notesize(&t->notes[0]);
1654
1655        if ((t->prstatus.pr_fpvalid = elf_core_copy_task_fpregs(p, NULL,
1656                                                                &t->fpu))) {
1657                fill_note(&t->notes[1], "CORE", NT_PRFPREG, sizeof(t->fpu),
1658                          &(t->fpu));
1659                t->num_notes++;
1660                sz += notesize(&t->notes[1]);
1661        }
1662
1663#ifdef ELF_CORE_COPY_XFPREGS
1664        if (elf_core_copy_task_xfpregs(p, &t->xfpu)) {
1665                fill_note(&t->notes[2], "LINUX", ELF_CORE_XFPREG_TYPE,
1666                          sizeof(t->xfpu), &t->xfpu);
1667                t->num_notes++;
1668                sz += notesize(&t->notes[2]);
1669        }
1670#endif  
1671        return sz;
1672}
1673
1674struct elf_note_info {
1675        struct memelfnote *notes;
1676        struct elf_prstatus *prstatus;  /* NT_PRSTATUS */
1677        struct elf_prpsinfo *psinfo;    /* NT_PRPSINFO */
1678        struct list_head thread_list;
1679        elf_fpregset_t *fpu;
1680#ifdef ELF_CORE_COPY_XFPREGS
1681        elf_fpxregset_t *xfpu;
1682#endif
1683        int thread_status_size;
1684        int numnote;
1685};
1686
1687static int elf_note_info_init(struct elf_note_info *info)
1688{
1689        memset(info, 0, sizeof(*info));
1690        INIT_LIST_HEAD(&info->thread_list);
1691
1692        /* Allocate space for six ELF notes */
1693        info->notes = kmalloc(6 * sizeof(struct memelfnote), GFP_KERNEL);
1694        if (!info->notes)
1695                return 0;
1696        info->psinfo = kmalloc(sizeof(*info->psinfo), GFP_KERNEL);
1697        if (!info->psinfo)
1698                goto notes_free;
1699        info->prstatus = kmalloc(sizeof(*info->prstatus), GFP_KERNEL);
1700        if (!info->prstatus)
1701                goto psinfo_free;
1702        info->fpu = kmalloc(sizeof(*info->fpu), GFP_KERNEL);
1703        if (!info->fpu)
1704                goto prstatus_free;
1705#ifdef ELF_CORE_COPY_XFPREGS
1706        info->xfpu = kmalloc(sizeof(*info->xfpu), GFP_KERNEL);
1707        if (!info->xfpu)
1708                goto fpu_free;
1709#endif
1710        return 1;
1711#ifdef ELF_CORE_COPY_XFPREGS
1712 fpu_free:
1713        kfree(info->fpu);
1714#endif
1715 prstatus_free:
1716        kfree(info->prstatus);
1717 psinfo_free:
1718        kfree(info->psinfo);
1719 notes_free:
1720        kfree(info->notes);
1721        return 0;
1722}
1723
1724static int fill_note_info(struct elfhdr *elf, int phdrs,
1725                          struct elf_note_info *info,
1726                          long signr, struct pt_regs *regs)
1727{
1728        struct list_head *t;
1729
1730        if (!elf_note_info_init(info))
1731                return 0;
1732
1733        if (signr) {
1734                struct core_thread *ct;
1735                struct elf_thread_status *ets;
1736
1737                for (ct = current->mm->core_state->dumper.next;
1738                                                ct; ct = ct->next) {
1739                        ets = kzalloc(sizeof(*ets), GFP_KERNEL);
1740                        if (!ets)
1741                                return 0;
1742
1743                        ets->thread = ct->task;
1744                        list_add(&ets->list, &info->thread_list);
1745                }
1746
1747                list_for_each(t, &info->thread_list) {
1748                        int sz;
1749
1750                        ets = list_entry(t, struct elf_thread_status, list);
1751                        sz = elf_dump_thread_status(signr, ets);
1752                        info->thread_status_size += sz;
1753                }
1754        }
1755        /* now collect the dump for the current */
1756        memset(info->prstatus, 0, sizeof(*info->prstatus));
1757        fill_prstatus(info->prstatus, current, signr);
1758        elf_core_copy_regs(&info->prstatus->pr_reg, regs);
1759
1760        /* Set up header */
1761        fill_elf_header(elf, phdrs, ELF_ARCH, ELF_CORE_EFLAGS, ELF_OSABI);
1762
1763        /*
1764         * Set up the notes in similar form to SVR4 core dumps made
1765         * with info from their /proc.
1766         */
1767
1768        fill_note(info->notes + 0, "CORE", NT_PRSTATUS,
1769                  sizeof(*info->prstatus), info->prstatus);
1770        fill_psinfo(info->psinfo, current->group_leader, current->mm);
1771        fill_note(info->notes + 1, "CORE", NT_PRPSINFO,
1772                  sizeof(*info->psinfo), info->psinfo);
1773
1774        info->numnote = 2;
1775
1776        fill_auxv_note(&info->notes[info->numnote++], current->mm);
1777
1778        /* Try to dump the FPU. */
1779        info->prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, regs,
1780                                                               info->fpu);
1781        if (info->prstatus->pr_fpvalid)
1782                fill_note(info->notes + info->numnote++,
1783                          "CORE", NT_PRFPREG, sizeof(*info->fpu), info->fpu);
1784#ifdef ELF_CORE_COPY_XFPREGS
1785        if (elf_core_copy_task_xfpregs(current, info->xfpu))
1786                fill_note(info->notes + info->numnote++,
1787                          "LINUX", ELF_CORE_XFPREG_TYPE,
1788                          sizeof(*info->xfpu), info->xfpu);
1789#endif
1790
1791        return 1;
1792}
1793
1794static size_t get_note_info_size(struct elf_note_info *info)
1795{
1796        int sz = 0;
1797        int i;
1798
1799        for (i = 0; i < info->numnote; i++)
1800                sz += notesize(info->notes + i);
1801
1802        sz += info->thread_status_size;
1803
1804        return sz;
1805}
1806
1807static int write_note_info(struct elf_note_info *info,
1808                           struct file *file, loff_t *foffset)
1809{
1810        int i;
1811        struct list_head *t;
1812
1813        for (i = 0; i < info->numnote; i++)
1814                if (!writenote(info->notes + i, file, foffset))
1815                        return 0;
1816
1817        /* write out the thread status notes section */
1818        list_for_each(t, &info->thread_list) {
1819                struct elf_thread_status *tmp =
1820                                list_entry(t, struct elf_thread_status, list);
1821
1822                for (i = 0; i < tmp->num_notes; i++)
1823                        if (!writenote(&tmp->notes[i], file, foffset))
1824                                return 0;
1825        }
1826
1827        return 1;
1828}
1829
1830static void free_note_info(struct elf_note_info *info)
1831{
1832        while (!list_empty(&info->thread_list)) {
1833                struct list_head *tmp = info->thread_list.next;
1834                list_del(tmp);
1835                kfree(list_entry(tmp, struct elf_thread_status, list));
1836        }
1837
1838        kfree(info->prstatus);
1839        kfree(info->psinfo);
1840        kfree(info->notes);
1841        kfree(info->fpu);
1842#ifdef ELF_CORE_COPY_XFPREGS
1843        kfree(info->xfpu);
1844#endif
1845}
1846
1847#endif
1848
1849static struct vm_area_struct *first_vma(struct task_struct *tsk,
1850                                        struct vm_area_struct *gate_vma)
1851{
1852        struct vm_area_struct *ret = tsk->mm->mmap;
1853
1854        if (ret)
1855                return ret;
1856        return gate_vma;
1857}
1858/*
1859 * Helper function for iterating across a vma list.  It ensures that the caller
1860 * will visit `gate_vma' prior to terminating the search.
1861 */
1862static struct vm_area_struct *next_vma(struct vm_area_struct *this_vma,
1863                                        struct vm_area_struct *gate_vma)
1864{
1865        struct vm_area_struct *ret;
1866
1867        ret = this_vma->vm_next;
1868        if (ret)
1869                return ret;
1870        if (this_vma == gate_vma)
1871                return NULL;
1872        return gate_vma;
1873}
1874
1875/*
1876 * Actual dumper
1877 *
1878 * This is a two-pass process; first we find the offsets of the bits,
1879 * and then they are actually written out.  If we run out of core limit
1880 * we just truncate.
1881 */
1882static int elf_core_dump(struct coredump_params *cprm)
1883{
1884        int has_dumped = 0;
1885        mm_segment_t fs;
1886        int segs;
1887        size_t size = 0;
1888        struct vm_area_struct *vma, *gate_vma;
1889        struct elfhdr *elf = NULL;
1890        loff_t offset = 0, dataoff, foffset;
1891        unsigned long mm_flags;
1892        struct elf_note_info info;
1893
1894        /*
1895         * We no longer stop all VM operations.
1896         * 
1897         * This is because those proceses that could possibly change map_count
1898         * or the mmap / vma pages are now blocked in do_exit on current
1899         * finishing this core dump.
1900         *
1901         * Only ptrace can touch these memory addresses, but it doesn't change
1902         * the map_count or the pages allocated. So no possibility of crashing
1903         * exists while dumping the mm->vm_next areas to the core file.
1904         */
1905  
1906        /* alloc memory for large data structures: too large to be on stack */
1907        elf = kmalloc(sizeof(*elf), GFP_KERNEL);
1908        if (!elf)
1909                goto out;
1910        /*
1911         * The number of segs are recored into ELF header as 16bit value.
1912         * Please check DEFAULT_MAX_MAP_COUNT definition when you modify here.
1913         */
1914        segs = current->mm->map_count;
1915#ifdef ELF_CORE_EXTRA_PHDRS
1916        segs += ELF_CORE_EXTRA_PHDRS;
1917#endif
1918
1919        gate_vma = get_gate_vma(current);
1920        if (gate_vma != NULL)
1921                segs++;
1922
1923        /*
1924         * Collect all the non-memory information about the process for the
1925         * notes.  This also sets up the file header.
1926         */
1927        if (!fill_note_info(elf, segs + 1, /* including notes section */
1928                            &info, cprm->signr, cprm->regs))
1929                goto cleanup;
1930
1931        has_dumped = 1;
1932        current->flags |= PF_DUMPCORE;
1933  
1934        fs = get_fs();
1935        set_fs(KERNEL_DS);
1936
1937        DUMP_WRITE(elf, sizeof(*elf));
1938        offset += sizeof(*elf);                         /* Elf header */
1939        offset += (segs + 1) * sizeof(struct elf_phdr); /* Program headers */
1940        foffset = offset;
1941
1942        /* Write notes phdr entry */
1943        {
1944                struct elf_phdr phdr;
1945                size_t sz = get_note_info_size(&info);
1946
1947                sz += elf_coredump_extra_notes_size();
1948
1949                fill_elf_note_phdr(&phdr, sz, offset);
1950                offset += sz;
1951                DUMP_WRITE(&phdr, sizeof(phdr));
1952        }
1953
1954        dataoff = offset = roundup(offset, ELF_EXEC_PAGESIZE);
1955
1956        /*
1957         * We must use the same mm->flags while dumping core to avoid
1958         * inconsistency between the program headers and bodies, otherwise an
1959         * unusable core file can be generated.
1960         */
1961        mm_flags = current->mm->flags;
1962
1963        /* Write program headers for segments dump */
1964        for (vma = first_vma(current, gate_vma); vma != NULL;
1965                        vma = next_vma(vma, gate_vma)) {
1966                struct elf_phdr phdr;
1967
1968                phdr.p_type = PT_LOAD;
1969                phdr.p_offset = offset;
1970                phdr.p_vaddr = vma->vm_start;
1971                phdr.p_paddr = 0;
1972                phdr.p_filesz = vma_dump_size(vma, mm_flags);
1973                phdr.p_memsz = vma->vm_end - vma->vm_start;
1974                offset += phdr.p_filesz;
1975                phdr.p_flags = vma->vm_flags & VM_READ ? PF_R : 0;
1976                if (vma->vm_flags & VM_WRITE)
1977                        phdr.p_flags |= PF_W;
1978                if (vma->vm_flags & VM_EXEC)
1979                        phdr.p_flags |= PF_X;
1980                phdr.p_align = ELF_EXEC_PAGESIZE;
1981
1982                DUMP_WRITE(&phdr, sizeof(phdr));
1983        }
1984
1985#ifdef ELF_CORE_WRITE_EXTRA_PHDRS
1986        ELF_CORE_WRITE_EXTRA_PHDRS;
1987#endif
1988
1989        /* write out the notes section */
1990        if (!write_note_info(&info, cprm->file, &foffset))
1991                goto end_coredump;
1992
1993        if (elf_coredump_extra_notes_write(cprm->file, &foffset))
1994                goto end_coredump;
1995
1996        /* Align to page */
1997        if (!dump_seek(cprm->file, dataoff - foffset))
1998                goto end_coredump;
1999
2000        for (vma = first_vma(current, gate_vma); vma != NULL;
2001                        vma = next_vma(vma, gate_vma)) {
2002                unsigned long addr;
2003                unsigned long end;
2004
2005                end = vma->vm_start + vma_dump_size(vma, mm_flags);
2006
2007                for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) {
2008                        struct page *page;
2009                        int stop;
2010
2011                        page = get_dump_page(addr);
2012                        if (page) {
2013                                void *kaddr = kmap(page);
2014                                stop = ((size += PAGE_SIZE) > cprm->limit) ||
2015                                        !dump_write(cprm->file, kaddr,
2016                                                    PAGE_SIZE);
2017                                kunmap(page);
2018                                page_cache_release(page);
2019                        } else
2020                                stop = !dump_seek(cprm->file, PAGE_SIZE);
2021                        if (stop)
2022                                goto end_coredump;
2023                }
2024        }
2025
2026#ifdef ELF_CORE_WRITE_EXTRA_DATA
2027        ELF_CORE_WRITE_EXTRA_DATA;
2028#endif
2029
2030end_coredump:
2031        set_fs(fs);
2032
2033cleanup:
2034        free_note_info(&info);
2035        kfree(elf);
2036out:
2037        return has_dumped;
2038}
2039
2040#endif          /* CONFIG_ELF_CORE */
2041
2042static int __init init_elf_binfmt(void)
2043{
2044        return register_binfmt(&elf_format);
2045}
2046
2047static void __exit exit_elf_binfmt(void)
2048{
2049        /* Remove the COFF and ELF loaders. */
2050        unregister_binfmt(&elf_format);
2051}
2052
2053core_initcall(init_elf_binfmt);
2054module_exit(exit_elf_binfmt);
2055MODULE_LICENSE("GPL");
2056
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.