1
2
3
4
5
6
7
8
9
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 <linux/coredump.h>
35#include <asm/uaccess.h>
36#include <asm/param.h>
37#include <asm/page.h>
38
39static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs);
40static int load_elf_library(struct file *);
41static unsigned long elf_map(struct file *, unsigned long, struct elf_phdr *,
42 int, int, unsigned long);
43
44
45
46
47
48#ifdef CONFIG_ELF_CORE
49static int elf_core_dump(struct coredump_params *cprm);
50#else
51#define elf_core_dump NULL
52#endif
53
54#if ELF_EXEC_PAGESIZE > PAGE_SIZE
55#define ELF_MIN_ALIGN ELF_EXEC_PAGESIZE
56#else
57#define ELF_MIN_ALIGN PAGE_SIZE
58#endif
59
60#ifndef ELF_CORE_EFLAGS
61#define ELF_CORE_EFLAGS 0
62#endif
63
64#define ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(ELF_MIN_ALIGN-1))
65#define ELF_PAGEOFFSET(_v) ((_v) & (ELF_MIN_ALIGN-1))
66#define ELF_PAGEALIGN(_v) (((_v) + ELF_MIN_ALIGN - 1) & ~(ELF_MIN_ALIGN - 1))
67
68static struct linux_binfmt elf_format = {
69 .module = THIS_MODULE,
70 .load_binary = load_elf_binary,
71 .load_shlib = load_elf_library,
72 .core_dump = elf_core_dump,
73 .min_coredump = ELF_EXEC_PAGESIZE,
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(¤t->mm->mmap_sem);
85 addr = do_brk(start, end - start);
86 up_write(¤t->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
95
96
97
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
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
130
131
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
160
161
162
163
164 p = arch_align_stack(p);
165
166
167
168
169
170
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
183
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
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
204 elf_info = (elf_addr_t *)current->mm->saved_auxv;
205
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
215
216
217
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
250 memset(&elf_info[ei_index], 0,
251 sizeof current->mm->saved_auxv - ei_index * sizeof elf_info[0]);
252
253
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
262#ifdef CONFIG_STACK_GROWSUP
263 sp = (elf_addr_t __user *)bprm->p - items - ei_index;
264 bprm->exec = (unsigned long)sp;
265#else
266 sp = (elf_addr_t __user *)bprm->p;
267#endif
268
269
270
271
272
273
274 vma = find_extend_vma(current->mm, bprm->p);
275 if (!vma)
276 return -EFAULT;
277
278
279 if (__put_user(argc, sp++))
280 return -EFAULT;
281 argv = sp;
282 envp = argv + argc + 1;
283
284
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
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
318static unsigned long elf_map(struct file *filep, unsigned long addr,
319 struct elf_phdr *eppnt, int prot, int type,
320 unsigned long total_size)
321{
322 unsigned long map_addr;
323 unsigned long size = eppnt->p_filesz + ELF_PAGEOFFSET(eppnt->p_vaddr);
324 unsigned long off = eppnt->p_offset - ELF_PAGEOFFSET(eppnt->p_vaddr);
325 addr = ELF_PAGESTART(addr);
326 size = ELF_PAGEALIGN(size);
327
328
329
330 if (!size)
331 return addr;
332
333 down_write(¤t->mm->mmap_sem);
334
335
336
337
338
339
340
341
342 if (total_size) {
343 total_size = ELF_PAGEALIGN(total_size);
344 map_addr = do_mmap(filep, addr, total_size, prot, type, off);
345 if (!BAD_ADDR(map_addr))
346 do_munmap(current->mm, map_addr+size, total_size-size);
347 } else
348 map_addr = do_mmap(filep, addr, size, prot, type, off);
349
350 up_write(¤t->mm->mmap_sem);
351 return(map_addr);
352}
353
354static unsigned long total_mapping_size(struct elf_phdr *cmds, int nr)
355{
356 int i, first_idx = -1, last_idx = -1;
357
358 for (i = 0; i < nr; i++) {
359 if (cmds[i].p_type == PT_LOAD) {
360 last_idx = i;
361 if (first_idx == -1)
362 first_idx = i;
363 }
364 }
365 if (first_idx == -1)
366 return 0;
367
368 return cmds[last_idx].p_vaddr + cmds[last_idx].p_memsz -
369 ELF_PAGESTART(cmds[first_idx].p_vaddr);
370}
371
372
373
374
375
376
377
378static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
379 struct file *interpreter, unsigned long *interp_map_addr,
380 unsigned long no_base)
381{
382 struct elf_phdr *elf_phdata;
383 struct elf_phdr *eppnt;
384 unsigned long load_addr = 0;
385 int load_addr_set = 0;
386 unsigned long last_bss = 0, elf_bss = 0;
387 unsigned long error = ~0UL;
388 unsigned long total_size;
389 int retval, i, size;
390
391
392 if (interp_elf_ex->e_type != ET_EXEC &&
393 interp_elf_ex->e_type != ET_DYN)
394 goto out;
395 if (!elf_check_arch(interp_elf_ex))
396 goto out;
397 if (!interpreter->f_op || !interpreter->f_op->mmap)
398 goto out;
399
400
401
402
403
404 if (interp_elf_ex->e_phentsize != sizeof(struct elf_phdr))
405 goto out;
406 if (interp_elf_ex->e_phnum < 1 ||
407 interp_elf_ex->e_phnum > 65536U / sizeof(struct elf_phdr))
408 goto out;
409
410
411 size = sizeof(struct elf_phdr) * interp_elf_ex->e_phnum;
412 if (size > ELF_MIN_ALIGN)
413 goto out;
414 elf_phdata = kmalloc(size, GFP_KERNEL);
415 if (!elf_phdata)
416 goto out;
417
418 retval = kernel_read(interpreter, interp_elf_ex->e_phoff,
419 (char *)elf_phdata, size);
420 error = -EIO;
421 if (retval != size) {
422 if (retval < 0)
423 error = retval;
424 goto out_close;
425 }
426
427 total_size = total_mapping_size(elf_phdata, interp_elf_ex->e_phnum);
428 if (!total_size) {
429 error = -EINVAL;
430 goto out_close;
431 }
432
433 eppnt = elf_phdata;
434 for (i = 0; i < interp_elf_ex->e_phnum; i++, eppnt++) {
435 if (eppnt->p_type == PT_LOAD) {
436 int elf_type = MAP_PRIVATE | MAP_DENYWRITE;
437 int elf_prot = 0;
438 unsigned long vaddr = 0;
439 unsigned long k, map_addr;
440
441 if (eppnt->p_flags & PF_R)
442 elf_prot = PROT_READ;
443 if (eppnt->p_flags & PF_W)
444 elf_prot |= PROT_WRITE;
445 if (eppnt->p_flags & PF_X)
446 elf_prot |= PROT_EXEC;
447 vaddr = eppnt->p_vaddr;
448 if (interp_elf_ex->e_type == ET_EXEC || load_addr_set)
449 elf_type |= MAP_FIXED;
450 else if (no_base && interp_elf_ex->e_type == ET_DYN)
451 load_addr = -vaddr;
452
453 map_addr = elf_map(interpreter, load_addr + vaddr,
454 eppnt, elf_prot, elf_type, total_size);
455 total_size = 0;
456 if (!*interp_map_addr)
457 *interp_map_addr = map_addr;
458 error = map_addr;
459 if (BAD_ADDR(map_addr))
460 goto out_close;
461
462 if (!load_addr_set &&
463 interp_elf_ex->e_type == ET_DYN) {
464 load_addr = map_addr - ELF_PAGESTART(vaddr);
465 load_addr_set = 1;
466 }
467
468
469
470
471
472
473 k = load_addr + eppnt->p_vaddr;
474 if (BAD_ADDR(k) ||
475 eppnt->p_filesz > eppnt->p_memsz ||
476 eppnt->p_memsz > TASK_SIZE ||
477 TASK_SIZE - eppnt->p_memsz < k) {
478 error = -ENOMEM;
479 goto out_close;
480 }
481
482
483
484
485
486 k = load_addr + eppnt->p_vaddr + eppnt->p_filesz;
487 if (k > elf_bss)
488 elf_bss = k;
489
490
491
492
493
494 k = load_addr + eppnt->p_memsz + eppnt->p_vaddr;
495 if (k > last_bss)
496 last_bss = k;
497 }
498 }
499
500 if (last_bss > elf_bss) {
501
502
503
504
505
506
507 if (padzero(elf_bss)) {
508 error = -EFAULT;
509 goto out_close;
510 }
511
512
513 elf_bss = ELF_PAGESTART(elf_bss + ELF_MIN_ALIGN - 1);
514
515
516 down_write(¤t->mm->mmap_sem);
517 error = do_brk(elf_bss, last_bss - elf_bss);
518 up_write(¤t->mm->mmap_sem);
519 if (BAD_ADDR(error))
520 goto out_close;
521 }
522
523 error = load_addr;
524
525out_close:
526 kfree(elf_phdata);
527out:
528 return error;
529}
530
531
532
533
534
535
536#define INTERPRETER_NONE 0
537#define INTERPRETER_ELF 2
538
539#ifndef STACK_RND_MASK
540#define STACK_RND_MASK (0x7ff >> (PAGE_SHIFT - 12))
541#endif
542
543static unsigned long randomize_stack_top(unsigned long stack_top)
544{
545 unsigned int random_variable = 0;
546
547 if ((current->flags & PF_RANDOMIZE) &&
548 !(current->personality & ADDR_NO_RANDOMIZE)) {
549 random_variable = get_random_int() & STACK_RND_MASK;
550 random_variable <<= PAGE_SHIFT;
551 }
552#ifdef CONFIG_STACK_GROWSUP
553 return PAGE_ALIGN(stack_top) + random_variable;
554#else
555 return PAGE_ALIGN(stack_top) - random_variable;
556#endif
557}
558
559static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs)
560{
561 struct file *interpreter = NULL;
562 unsigned long load_addr = 0, load_bias = 0;
563 int load_addr_set = 0;
564 char * elf_interpreter = NULL;
565 unsigned long error;
566 struct elf_phdr *elf_ppnt, *elf_phdata;
567 unsigned long elf_bss, elf_brk;
568 int retval, i;
569 unsigned int size;
570 unsigned long elf_entry;
571 unsigned long interp_load_addr = 0;
572 unsigned long start_code, end_code, start_data, end_data;
573 unsigned long reloc_func_desc __maybe_unused = 0;
574 int executable_stack = EXSTACK_DEFAULT;
575 unsigned long def_flags = 0;
576 struct {
577 struct elfhdr elf_ex;
578 struct elfhdr interp_elf_ex;
579 } *loc;
580
581 loc = kmalloc(sizeof(*loc), GFP_KERNEL);
582 if (!loc) {
583 retval = -ENOMEM;
584 goto out_ret;
585 }
586
587
588 loc->elf_ex = *((struct elfhdr *)bprm->buf);
589
590 retval = -ENOEXEC;
591
592 if (memcmp(loc->elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
593 goto out;
594
595 if (loc->elf_ex.e_type != ET_EXEC && loc->elf_ex.e_type != ET_DYN)
596 goto out;
597 if (!elf_check_arch(&loc->elf_ex))
598 goto out;
599 if (!bprm->file->f_op || !bprm->file->f_op->mmap)
600 goto out;
601
602
603 if (loc->elf_ex.e_phentsize != sizeof(struct elf_phdr))
604 goto out;
605 if (loc->elf_ex.e_phnum < 1 ||
606 loc->elf_ex.e_phnum > 65536U / sizeof(struct elf_phdr))
607 goto out;
608 size = loc->elf_ex.e_phnum * sizeof(struct elf_phdr);
609 retval = -ENOMEM;
610 elf_phdata = kmalloc(size, GFP_KERNEL);
611 if (!elf_phdata)
612 goto out;
613
614 retval = kernel_read(bprm->file, loc->elf_ex.e_phoff,
615 (char *)elf_phdata, size);
616 if (retval != size) {
617 if (retval >= 0)
618 retval = -EIO;
619 goto out_free_ph;
620 }
621
622 elf_ppnt = elf_phdata;
623 elf_bss = 0;
624 elf_brk = 0;
625
626 start_code = ~0UL;
627 end_code = 0;
628 start_data = 0;
629 end_data = 0;
630
631 for (i = 0; i < loc->elf_ex.e_phnum; i++) {
632 if (elf_ppnt->p_type == PT_INTERP) {
633
634
635
636
637 retval = -ENOEXEC;
638 if (elf_ppnt->p_filesz > PATH_MAX ||
639 elf_ppnt->p_filesz < 2)
640 goto out_free_ph;
641
642 retval = -ENOMEM;
643 elf_interpreter = kmalloc(elf_ppnt->p_filesz,
644 GFP_KERNEL);
645 if (!elf_interpreter)
646 goto out_free_ph;
647
648 retval = kernel_read(bprm->file, elf_ppnt->p_offset,
649 elf_interpreter,
650 elf_ppnt->p_filesz);
651 if (retval != elf_ppnt->p_filesz) {
652 if (retval >= 0)
653 retval = -EIO;
654 goto out_free_interp;
655 }
656
657 retval = -ENOEXEC;
658 if (elf_interpreter[elf_ppnt->p_filesz - 1] != '\0')
659 goto out_free_interp;
660
661 interpreter = open_exec(elf_interpreter);
662 retval = PTR_ERR(interpreter);
663 if (IS_ERR(interpreter))
664 goto out_free_interp;
665
666
667
668
669
670
671 would_dump(bprm, interpreter);
672
673 retval = kernel_read(interpreter, 0, bprm->buf,
674 BINPRM_BUF_SIZE);
675 if (retval != BINPRM_BUF_SIZE) {
676 if (retval >= 0)
677 retval = -EIO;
678 goto out_free_dentry;
679 }
680
681
682 loc->interp_elf_ex = *((struct elfhdr *)bprm->buf);
683 break;
684 }
685 elf_ppnt++;
686 }
687
688 elf_ppnt = elf_phdata;
689 for (i = 0; i < loc->elf_ex.e_phnum; i++, elf_ppnt++)
690 if (elf_ppnt->p_type == PT_GNU_STACK) {
691 if (elf_ppnt->p_flags & PF_X)
692 executable_stack = EXSTACK_ENABLE_X;
693 else
694 executable_stack = EXSTACK_DISABLE_X;
695 break;
696 }
697
698
699 if (elf_interpreter) {
700 retval = -ELIBBAD;
701
702 if (memcmp(loc->interp_elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
703 goto out_free_dentry;
704
705 if (!elf_check_arch(&loc->interp_elf_ex))
706 goto out_free_dentry;
707 }
708
709
710 retval = flush_old_exec(bprm);
711 if (retval)
712 goto out_free_dentry;
713
714
715 current->flags &= ~PF_FORKNOEXEC;
716 current->mm->def_flags = def_flags;
717
718
719
720 SET_PERSONALITY(loc->elf_ex);
721 if (elf_read_implies_exec(loc->elf_ex, executable_stack))
722 current->personality |= READ_IMPLIES_EXEC;
723
724 if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
725 current->flags |= PF_RANDOMIZE;
726
727 setup_new_exec(bprm);
728
729
730
731 current->mm->free_area_cache = current->mm->mmap_base;
732 current->mm->cached_hole_size = 0;
733 retval = setup_arg_pages(bprm, randomize_stack_top(STACK_TOP),
734 executable_stack);
735 if (retval < 0) {
736 send_sig(SIGKILL, current, 0);
737 goto out_free_dentry;
738 }
739
740 current->mm->start_stack = bprm->p;
741
742
743
744 for(i = 0, elf_ppnt = elf_phdata;
745 i < loc->elf_ex.e_phnum; i++, elf_ppnt++) {
746 int elf_prot = 0, elf_flags;
747 unsigned long k, vaddr;
748
749 if (elf_ppnt->p_type != PT_LOAD)
750 continue;
751
752 if (unlikely (elf_brk > elf_bss)) {
753 unsigned long nbyte;
754
755
756
757
758 retval = set_brk(elf_bss + load_bias,
759 elf_brk + load_bias);
760 if (retval) {
761 send_sig(SIGKILL, current, 0);
762 goto out_free_dentry;
763 }
764 nbyte = ELF_PAGEOFFSET(elf_bss);
765 if (nbyte) {
766 nbyte = ELF_MIN_ALIGN - nbyte;
767 if (nbyte > elf_brk - elf_bss)
768 nbyte = elf_brk - elf_bss;
769 if (clear_user((void __user *)elf_bss +
770 load_bias, nbyte)) {
771
772
773
774
775
776 }
777 }
778 }
779
780 if (elf_ppnt->p_flags & PF_R)
781 elf_prot |= PROT_READ;
782 if (elf_ppnt->p_flags & PF_W)
783 elf_prot |= PROT_WRITE;
784 if (elf_ppnt->p_flags & PF_X)
785 elf_prot |= PROT_EXEC;
786
787 elf_flags = MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE;
788
789 vaddr = elf_ppnt->p_vaddr;
790 if (loc->elf_ex.e_type == ET_EXEC || load_addr_set) {
791 elf_flags |= MAP_FIXED;
792 } else if (loc->elf_ex.e_type == ET_DYN) {
793
794
795
796
797#if defined(CONFIG_X86) || defined(CONFIG_ARM)
798
799
800
801
802
803
804 if (current->flags & PF_RANDOMIZE)
805 load_bias = 0;
806 else
807 load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr);
808#else
809 load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr);
810#endif
811 }
812
813 error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt,
814 elf_prot, elf_flags, 0);
815 if (BAD_ADDR(error)) {
816 send_sig(SIGKILL, current, 0);
817 retval = IS_ERR((void *)error) ?
818 PTR_ERR((void*)error) : -EINVAL;
819 goto out_free_dentry;
820 }
821
822 if (!load_addr_set) {
823 load_addr_set = 1;
824 load_addr = (elf_ppnt->p_vaddr - elf_ppnt->p_offset);
825 if (loc->elf_ex.e_type == ET_DYN) {
826 load_bias += error -
827 ELF_PAGESTART(load_bias + vaddr);
828 load_addr += load_bias;
829 reloc_func_desc = load_bias;
830 }
831 }
832 k = elf_ppnt->p_vaddr;
833 if (k < start_code)
834 start_code = k;
835 if (start_data < k)
836 start_data = k;
837
838
839
840
841
842
843 if (BAD_ADDR(k) || elf_ppnt->p_filesz > elf_ppnt->p_memsz ||
844 elf_ppnt->p_memsz > TASK_SIZE ||
845 TASK_SIZE - elf_ppnt->p_memsz < k) {
846
847 send_sig(SIGKILL, current, 0);
848 retval = -EINVAL;
849 goto out_free_dentry;
850 }
851
852 k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz;
853
854 if (k > elf_bss)
855 elf_bss = k;
856 if ((elf_ppnt->p_flags & PF_X) && end_code < k)
857 end_code = k;
858 if (end_data < k)
859 end_data = k;
860 k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz;
861 if (k > elf_brk)
862 elf_brk = k;
863 }
864
865 loc->elf_ex.e_entry += load_bias;
866 elf_bss += load_bias;
867 elf_brk += load_bias;
868 start_code += load_bias;
869 end_code += load_bias;
870 start_data += load_bias;
871 end_data += load_bias;
872
873
874
875
876
877
878 retval = set_brk(elf_bss, elf_brk);
879 if (retval) {
880 send_sig(SIGKILL, current, 0);
881 goto out_free_dentry;
882 }
883 if (likely(elf_bss != elf_brk) && unlikely(padzero(elf_bss))) {
884 send_sig(SIGSEGV, current, 0);
885 retval = -EFAULT;
886 goto out_free_dentry;
887 }
888
889 if (elf_interpreter) {
890 unsigned long uninitialized_var(interp_map_addr);
891
892 elf_entry = load_elf_interp(&loc->interp_elf_ex,
893 interpreter,
894 &interp_map_addr,
895 load_bias);
896 if (!IS_ERR((void *)elf_entry)) {
897
898
899
900
901 interp_load_addr = elf_entry;
902 elf_entry += loc->interp_elf_ex.e_entry;
903 }
904 if (BAD_ADDR(elf_entry)) {
905 force_sig(SIGSEGV, current);
906 retval = IS_ERR((void *)elf_entry) ?
907 (int)elf_entry : -EINVAL;
908 goto out_free_dentry;
909 }
910 reloc_func_desc = interp_load_addr;
911
912 allow_write_access(interpreter);
913 fput(interpreter);
914 kfree(elf_interpreter);
915 } else {
916 elf_entry = loc->elf_ex.e_entry;
917 if (BAD_ADDR(elf_entry)) {
918 force_sig(SIGSEGV, current);
919 retval = -EINVAL;
920 goto out_free_dentry;
921 }
922 }
923
924 kfree(elf_phdata);
925
926 set_binfmt(&elf_format);
927
928#ifdef ARCH_HAS_SETUP_ADDITIONAL_PAGES
929 retval = arch_setup_additional_pages(bprm, !!elf_interpreter);
930 if (retval < 0) {
931 send_sig(SIGKILL, current, 0);
932 goto out;
933 }
934#endif
935
936 install_exec_creds(bprm);
937 current->flags &= ~PF_FORKNOEXEC;
938 retval = create_elf_tables(bprm, &loc->elf_ex,
939 load_addr, interp_load_addr);
940 if (retval < 0) {
941 send_sig(SIGKILL, current, 0);
942 goto out;
943 }
944
945 current->mm->end_code = end_code;
946 current->mm->start_code = start_code;
947 current->mm->start_data = start_data;
948 current->mm->end_data = end_data;
949 current->mm->start_stack = bprm->p;
950
951#ifdef arch_randomize_brk
952 if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1)) {
953 current->mm->brk = current->mm->start_brk =
954 arch_randomize_brk(current->mm);
955#ifdef CONFIG_COMPAT_BRK
956 current->brk_randomized = 1;
957#endif
958 }
959#endif
960
961 if (current->personality & MMAP_PAGE_ZERO) {
962
963
964
965
966 down_write(¤t->mm->mmap_sem);
967 error = do_mmap(NULL, 0, PAGE_SIZE, PROT_READ | PROT_EXEC,
968 MAP_FIXED | MAP_PRIVATE, 0);
969 up_write(¤t->mm->mmap_sem);
970 }
971
972#ifdef ELF_PLAT_INIT
973
974
975
976
977
978
979
980
981
982
983 ELF_PLAT_INIT(regs, reloc_func_desc);
984#endif
985
986 start_thread(regs, elf_entry, bprm->p);
987 retval = 0;
988out:
989 kfree(loc);
990out_ret:
991 return retval;
992
993
994out_free_dentry:
995 allow_write_access(interpreter);
996 if (interpreter)
997 fput(interpreter);
998out_free_interp:
999 kfree(elf_interpreter);
1000out_free_ph:
1001 kfree(elf_phdata);
1002 goto out;
1003}
1004
1005
1006
1007static int load_elf_library(struct file *file)
1008{
1009 struct elf_phdr *elf_phdata;
1010 struct elf_phdr *eppnt;
1011 unsigned long elf_bss, bss, len;
1012 int retval, error, i, j;
1013 struct elfhdr elf_ex;
1014
1015 error = -ENOEXEC;
1016 retval = kernel_read(file, 0, (char *)&elf_ex, sizeof(elf_ex));
1017 if (retval != sizeof(elf_ex))
1018 goto out;
1019
1020 if (memcmp(elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
1021 goto out;
1022
1023
1024 if (elf_ex.e_type != ET_EXEC || elf_ex.e_phnum > 2 ||
1025 !elf_check_arch(&elf_ex) || !file->f_op || !file->f_op->mmap)
1026 goto out;
1027
1028
1029
1030 j = sizeof(struct elf_phdr) * elf_ex.e_phnum;
1031
1032
1033 error = -ENOMEM;
1034 elf_phdata = kmalloc(j, GFP_KERNEL);
1035 if (!elf_phdata)
1036 goto out;
1037
1038 eppnt = elf_phdata;
1039 error = -ENOEXEC;
1040 retval = kernel_read(file, elf_ex.e_phoff, (char *)eppnt, j);
1041 if (retval != j)
1042 goto out_free_ph;
1043
1044 for (j = 0, i = 0; i<elf_ex.e_phnum; i++)
1045 if ((eppnt + i)->p_type == PT_LOAD)
1046 j++;
1047 if (j != 1)
1048 goto out_free_ph;
1049
1050 while (eppnt->p_type != PT_LOAD)
1051 eppnt++;
1052
1053
1054 down_write(¤t->mm->mmap_sem);
1055 error = do_mmap(file,
1056 ELF_PAGESTART(eppnt->p_vaddr),
1057 (eppnt->p_filesz +
1058 ELF_PAGEOFFSET(eppnt->p_vaddr)),
1059 PROT_READ | PROT_WRITE | PROT_EXEC,
1060 MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE,
1061 (eppnt->p_offset -
1062 ELF_PAGEOFFSET(eppnt->p_vaddr)));
1063 up_write(¤t->mm->mmap_sem);
1064 if (error != ELF_PAGESTART(eppnt->p_vaddr))
1065 goto out_free_ph;
1066
1067 elf_bss = eppnt->p_vaddr + eppnt->p_filesz;
1068 if (padzero(elf_bss)) {
1069 error = -EFAULT;
1070 goto out_free_ph;
1071 }
1072
1073 len = ELF_PAGESTART(eppnt->p_filesz + eppnt->p_vaddr +
1074 ELF_MIN_ALIGN - 1);
1075 bss = eppnt->p_memsz + eppnt->p_vaddr;
1076 if (bss > len) {
1077 down_write(¤t->mm->mmap_sem);
1078 do_brk(len, bss - len);
1079 up_write(¤t->mm->mmap_sem);
1080 }
1081 error = 0;
1082
1083out_free_ph:
1084 kfree(elf_phdata);
1085out:
1086 return error;
1087}
1088
1089#ifdef CONFIG_ELF_CORE
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100static unsigned long vma_dump_size(struct vm_area_struct *vma,
1101 unsigned long mm_flags)
1102{
1103#define FILTER(type) (mm_flags & (1UL << MMF_DUMP_##type))
1104
1105
1106 if (vma->vm_flags & VM_ALWAYSDUMP)
1107 goto whole;
1108
1109
1110 if (vma->vm_flags & VM_HUGETLB) {
1111 if ((vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_SHARED))
1112 goto whole;
1113 if (!(vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_PRIVATE))
1114 goto whole;
1115 }
1116
1117
1118 if (vma->vm_flags & (VM_IO | VM_RESERVED))
1119 return 0;
1120
1121
1122 if (vma->vm_flags & VM_SHARED) {
1123 if (vma->vm_file->f_path.dentry->d_inode->i_nlink == 0 ?
1124 FILTER(ANON_SHARED) : FILTER(MAPPED_SHARED))
1125 goto whole;
1126 return 0;
1127 }
1128
1129
1130 if (vma->anon_vma && FILTER(ANON_PRIVATE))
1131 goto whole;
1132 if (vma->vm_file == NULL)
1133 return 0;
1134
1135 if (FILTER(MAPPED_PRIVATE))
1136 goto whole;
1137
1138
1139
1140
1141
1142
1143 if (FILTER(ELF_HEADERS) &&
1144 vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) {
1145 u32 __user *header = (u32 __user *) vma->vm_start;
1146 u32 word;
1147 mm_segment_t fs = get_fs();
1148
1149
1150
1151 union {
1152 u32 cmp;
1153 char elfmag[SELFMAG];
1154 } magic;
1155 BUILD_BUG_ON(SELFMAG != sizeof word);
1156 magic.elfmag[EI_MAG0] = ELFMAG0;
1157 magic.elfmag[EI_MAG1] = ELFMAG1;
1158 magic.elfmag[EI_MAG2] = ELFMAG2;
1159 magic.elfmag[EI_MAG3] = ELFMAG3;
1160
1161
1162
1163
1164 set_fs(USER_DS);
1165 if (unlikely(get_user(word, header)))
1166 word = 0;
1167 set_fs(fs);
1168 if (word == magic.cmp)
1169 return PAGE_SIZE;
1170 }
1171
1172#undef FILTER
1173
1174 return 0;
1175
1176whole:
1177 return vma->vm_end - vma->vm_start;
1178}
1179
1180
1181struct memelfnote
1182{
1183 const char *name;
1184 int type;
1185 unsigned int datasz;
1186 void *data;
1187};
1188
1189static int notesize(struct memelfnote *en)
1190{
1191 int sz;
1192
1193 sz = sizeof(struct elf_note);
1194 sz += roundup(strlen(en->name) + 1, 4);
1195 sz += roundup(en->datasz, 4);
1196
1197 return sz;
1198}
1199
1200#define DUMP_WRITE(addr, nr, foffset) \
1201 do { if (!dump_write(file, (addr), (nr))) return 0; *foffset += (nr); } while(0)
1202
1203static int alignfile(struct file *file, loff_t *foffset)
1204{
1205 static const char buf[4] = { 0, };
1206 DUMP_WRITE(buf, roundup(*foffset, 4) - *foffset, foffset);
1207 return 1;
1208}
1209
1210static int writenote(struct memelfnote *men, struct file *file,
1211 loff_t *foffset)
1212{
1213 struct elf_note en;
1214 en.n_namesz = strlen(men->name) + 1;
1215 en.n_descsz = men->datasz;
1216 en.n_type = men->type;
1217
1218 DUMP_WRITE(&en, sizeof(en), foffset);
1219 DUMP_WRITE(men->name, en.n_namesz, foffset);
1220 if (!alignfile(file, foffset))
1221 return 0;
1222 DUMP_WRITE(men->data, men->datasz, foffset);
1223 if (!alignfile(file, foffset))
1224 return 0;
1225
1226 return 1;
1227}
1228#undef DUMP_WRITE
1229
1230static void fill_elf_header(struct elfhdr *elf, int segs,
1231 u16 machine, u32 flags, u8 osabi)
1232{
1233 memset(elf, 0, sizeof(*elf));
1234
1235 memcpy(elf->e_ident, ELFMAG, SELFMAG);
1236 elf->e_ident[EI_CLASS] = ELF_CLASS;
1237 elf->e_ident[EI_DATA] = ELF_DATA;
1238 elf->e_ident[EI_VERSION] = EV_CURRENT;
1239 elf->e_ident[EI_OSABI] = ELF_OSABI;
1240
1241 elf->e_type = ET_CORE;
1242 elf->e_machine = machine;
1243 elf->e_version = EV_CURRENT;
1244 elf->e_phoff = sizeof(struct elfhdr);
1245 elf->e_flags = flags;
1246 elf->e_ehsize = sizeof(struct elfhdr);
1247 elf->e_phentsize = sizeof(struct elf_phdr);
1248 elf->e_phnum = segs;
1249
1250 return;
1251}
1252
1253static void fill_elf_note_phdr(struct elf_phdr *phdr, int sz, loff_t offset)
1254{
1255 phdr->p_type = PT_NOTE;
1256 phdr->p_offset = offset;
1257 phdr->p_vaddr = 0;
1258 phdr->p_paddr = 0;
1259 phdr->p_filesz = sz;
1260 phdr->p_memsz = 0;
1261 phdr->p_flags = 0;
1262 phdr->p_align = 0;
1263 return;
1264}
1265
1266static void fill_note(struct memelfnote *note, const char *name, int type,
1267 unsigned int sz, void *data)
1268{
1269 note->name = name;
1270 note->type = type;
1271 note->datasz = sz;
1272 note->data = data;
1273 return;
1274}
1275
1276
1277
1278
1279
1280static void fill_prstatus(struct elf_prstatus *prstatus,
1281 struct task_struct *p, long signr)
1282{
1283 prstatus->pr_info.si_signo = prstatus->pr_cursig = signr;
1284 prstatus->pr_sigpend = p->pending.signal.sig[0];
1285 prstatus->pr_sighold = p->blocked.sig[0];
1286 rcu_read_lock();
1287 prstatus->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1288 rcu_read_unlock();
1289 prstatus->pr_pid = task_pid_vnr(p);
1290 prstatus->pr_pgrp = task_pgrp_vnr(p);
1291 prstatus->pr_sid = task_session_vnr(p);
1292 if (thread_group_leader(p)) {
1293 struct task_cputime cputime;
1294
1295
1296
1297
1298
1299 thread_group_cputime(p, &cputime);
1300 cputime_to_timeval(cputime.utime, &prstatus->pr_utime);
1301 cputime_to_timeval(cputime.stime, &prstatus->pr_stime);
1302 } else {
1303 cputime_to_timeval(p->utime, &prstatus->pr_utime);
1304 cputime_to_timeval(p->stime, &prstatus->pr_stime);
1305 }
1306 cputime_to_timeval(p->signal->cutime, &prstatus->pr_cutime);
1307 cputime_to_timeval(p->signal->cstime, &prstatus->pr_cstime);
1308}
1309
1310static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p,
1311 struct mm_struct *mm)
1312{
1313 const struct cred *cred;
1314 unsigned int i, len;
1315
1316
1317 memset(psinfo, 0, sizeof(struct elf_prpsinfo));
1318
1319 len = mm->arg_end - mm->arg_start;
1320 if (len >= ELF_PRARGSZ)
1321 len = ELF_PRARGSZ-1;
1322 if (copy_from_user(&psinfo->pr_psargs,
1323 (const char __user *)mm->arg_start, len))
1324 return -EFAULT;
1325 for(i = 0; i < len; i++)
1326 if (psinfo->pr_psargs[i] == 0)
1327 psinfo->pr_psargs[i] = ' ';
1328 psinfo->pr_psargs[len] = 0;
1329
1330 rcu_read_lock();
1331 psinfo->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1332 rcu_read_unlock();
1333 psinfo->pr_pid = task_pid_vnr(p);
1334 psinfo->pr_pgrp = task_pgrp_vnr(p);
1335 psinfo->pr_sid = task_session_vnr(p);
1336
1337 i = p->state ? ffz(~p->state) + 1 : 0;
1338 psinfo->pr_state = i;
1339 psinfo->pr_sname = (i > 5) ? '.' : "RSDTZW"[i];
1340 psinfo->pr_zomb = psinfo->pr_sname == 'Z';
1341 psinfo->pr_nice = task_nice(p);
1342 psinfo->pr_flag = p->flags;
1343 rcu_read_lock();
1344 cred = __task_cred(p);
1345 SET_UID(psinfo->pr_uid, cred->uid);
1346 SET_GID(psinfo->pr_gid, cred->gid);
1347 rcu_read_unlock();
1348 strncpy(psinfo->pr_fname, p->comm, sizeof(psinfo->pr_fname));
1349
1350 return 0;
1351}
1352
1353static void fill_auxv_note(struct memelfnote *note, struct mm_struct *mm)
1354{
1355 elf_addr_t *auxv = (elf_addr_t *) mm->saved_auxv;
1356 int i = 0;
1357 do
1358 i += 2;
1359 while (auxv[i - 2] != AT_NULL);
1360 fill_note(note, "CORE", NT_AUXV, i * sizeof(elf_addr_t), auxv);
1361}
1362
1363#ifdef CORE_DUMP_USE_REGSET
1364#include <linux/regset.h>
1365
1366struct elf_thread_core_info {
1367 struct elf_thread_core_info *next;
1368 struct task_struct *task;
1369 struct elf_prstatus prstatus;
1370 struct memelfnote notes[0];
1371};
1372
1373struct elf_note_info {
1374 struct elf_thread_core_info *thread;
1375 struct memelfnote psinfo;
1376 struct memelfnote auxv;
1377 size_t size;
1378 int thread_notes;
1379};
1380
1381
1382
1383
1384
1385
1386static void do_thread_regset_writeback(struct task_struct *task,
1387 const struct user_regset *regset)
1388{
1389 if (regset->writeback)
1390 regset->writeback(task, regset, 1);
1391}
1392
1393static int fill_thread_core_info(struct elf_thread_core_info *t,
1394 const struct user_regset_view *view,
1395 long signr, size_t *total)
1396{
1397 unsigned int i;
1398
1399
1400
1401
1402
1403
1404
1405 fill_prstatus(&t->prstatus, t->task, signr);
1406 (void) view->regsets[0].get(t->task, &view->regsets[0],
1407 0, sizeof(t->prstatus.pr_reg),
1408 &t->prstatus.pr_reg, NULL);
1409
1410 fill_note(&t->notes[0], "CORE", NT_PRSTATUS,
1411 sizeof(t->prstatus), &t->prstatus);
1412 *total += notesize(&t->notes[0]);
1413
1414 do_thread_regset_writeback(t->task, &view->regsets[0]);
1415
1416
1417
1418
1419
1420
1421 for (i = 1; i < view->n; ++i) {
1422 const struct user_regset *regset = &view->regsets[i];
1423 do_thread_regset_writeback(t->task, regset);
1424 if (regset->core_note_type && regset->get &&
1425 (!regset->active || regset->active(t->task, regset))) {
1426 int ret;
1427 size_t size = regset->n * regset->size;
1428 void *data = kmalloc(size, GFP_KERNEL);
1429 if (unlikely(!data))
1430 return 0;
1431 ret = regset->get(t->task, regset,
1432 0, size, data, NULL);
1433 if (unlikely(ret))
1434 kfree(data);
1435 else {
1436 if (regset->core_note_type != NT_PRFPREG)
1437 fill_note(&t->notes[i], "LINUX",
1438 regset->core_note_type,
1439 size, data);
1440 else {
1441 t->prstatus.pr_fpvalid = 1;
1442 fill_note(&t->notes[i], "CORE",
1443 NT_PRFPREG, size, data);
1444 }
1445 *total += notesize(&t->notes[i]);
1446 }
1447 }
1448 }
1449
1450 return 1;
1451}
1452
1453static int fill_note_info(struct elfhdr *elf, int phdrs,
1454 struct elf_note_info *info,
1455 long signr, struct pt_regs *regs)
1456{
1457 struct task_struct *dump_task = current;
1458 const struct user_regset_view *view = task_user_regset_view(dump_task);
1459 struct elf_thread_core_info *t;
1460 struct elf_prpsinfo *psinfo;
1461 struct core_thread *ct;
1462 unsigned int i;
1463
1464 info->size = 0;
1465 info->thread = NULL;
1466
1467 psinfo = kmalloc(sizeof(*psinfo), GFP_KERNEL);
1468 if (psinfo == NULL)
1469 return 0;
1470
1471 fill_note(&info->psinfo, "CORE", NT_PRPSINFO, sizeof(*psinfo), psinfo);
1472
1473
1474
1475
1476 info->thread_notes = 0;
1477 for (i = 0; i < view->n; ++i)
1478 if (view->regsets[i].core_note_type != 0)
1479 ++info->thread_notes;
1480
1481
1482
1483
1484
1485 if (unlikely(info->thread_notes == 0) ||
1486 unlikely(view->regsets[0].core_note_type != NT_PRSTATUS)) {
1487 WARN_ON(1);
1488 return 0;
1489 }
1490
1491
1492
1493
1494 fill_elf_header(elf, phdrs,
1495 view->e_machine, view->e_flags, view->ei_osabi);
1496
1497
1498
1499
1500 for (ct = &dump_task->mm->core_state->dumper; ct; ct = ct->next) {
1501 t = kzalloc(offsetof(struct elf_thread_core_info,
1502 notes[info->thread_notes]),
1503 GFP_KERNEL);
1504 if (unlikely(!t))
1505 return 0;
1506
1507 t->task = ct->task;
1508 if (ct->task == dump_task || !info->thread) {
1509 t->next = info->thread;
1510 info->thread = t;
1511 } else {
1512
1513
1514
1515
1516 t->next = info->thread->next;
1517 info->thread->next = t;
1518 }
1519 }
1520
1521
1522
1523
1524 for (t = info->thread; t != NULL; t = t->next)
1525 if (!fill_thread_core_info(t, view, signr, &info->size))
1526 return 0;
1527
1528
1529
1530
1531 fill_psinfo(psinfo, dump_task->group_leader, dump_task->mm);
1532 info->size += notesize(&info->psinfo);
1533
1534 fill_auxv_note(&info->auxv, current->mm);
1535 info->size += notesize(&info->auxv);
1536
1537 return 1;
1538}
1539
1540static size_t get_note_info_size(struct elf_note_info *info)
1541{
1542 return info->size;
1543}
1544
1545
1546
1547
1548
1549static int write_note_info(struct elf_note_info *info,
1550 struct file *file, loff_t *foffset)
1551{
1552 bool first = 1;
1553 struct elf_thread_core_info *t = info->thread;
1554
1555 do {
1556 int i;
1557
1558 if (!writenote(&t->notes[0], file, foffset))
1559 return 0;
1560
1561 if (first && !writenote(&info->psinfo, file, foffset))
1562 return 0;
1563 if (first && !writenote(&info->auxv, file, foffset))
1564 return 0;
1565
1566 for (i = 1; i < info->thread_notes; ++i)
1567 if (t->notes[i].data &&
1568 !writenote(&t->notes[i], file, foffset))
1569 return 0;
1570
1571 first = 0;
1572 t = t->next;
1573 } while (t);
1574
1575 return 1;
1576}
1577
1578static void free_note_info(struct elf_note_info *info)
1579{
1580 struct elf_thread_core_info *threads = info->thread;
1581 while (threads) {
1582 unsigned int i;
1583 struct elf_thread_core_info *t = threads;
1584 threads = t->next;
1585 WARN_ON(t->notes[0].data && t->notes[0].data != &t->prstatus);
1586 for (i = 1; i < info->thread_notes; ++i)
1587 kfree(t->notes[i].data);
1588 kfree(t);
1589 }
1590 kfree(info->psinfo.data);
1591}
1592
1593#else
1594
1595
1596struct elf_thread_status
1597{
1598 struct list_head list;
1599 struct elf_prstatus prstatus;
1600 elf_fpregset_t fpu;
1601 struct task_struct *thread;
1602#ifdef ELF_CORE_COPY_XFPREGS
1603 elf_fpxregset_t xfpu;
1604#endif
1605 struct memelfnote notes[3];
1606 int num_notes;
1607};
1608
1609
1610
1611
1612
1613
1614static int elf_dump_thread_status(long signr, struct elf_thread_status *t)
1615{
1616 int sz = 0;
1617 struct task_struct *p = t->thread;
1618 t->num_notes = 0;
1619
1620 fill_prstatus(&t->prstatus, p, signr);
1621 elf_core_copy_task_regs(p, &t->prstatus.pr_reg);
1622
1623 fill_note(&t->notes[0], "CORE", NT_PRSTATUS, sizeof(t->prstatus),
1624 &(t->prstatus));
1625 t->num_notes++;
1626 sz += notesize(&t->notes[0]);
1627
1628 if ((t->prstatus.pr_fpvalid = elf_core_copy_task_fpregs(p, NULL,
1629 &t->fpu))) {
1630 fill_note(&t->notes[1], "CORE", NT_PRFPREG, sizeof(t->fpu),
1631 &(t->fpu));
1632 t->num_notes++;
1633 sz += notesize(&t->notes[1]);
1634 }
1635
1636#ifdef ELF_CORE_COPY_XFPREGS
1637 if (elf_core_copy_task_xfpregs(p, &t->xfpu)) {
1638 fill_note(&t->notes[2], "LINUX", ELF_CORE_XFPREG_TYPE,
1639 sizeof(t->xfpu), &t->xfpu);
1640 t->num_notes++;
1641 sz += notesize(&t->notes[2]);
1642 }
1643#endif
1644 return sz;
1645}
1646
1647struct elf_note_info {
1648 struct memelfnote *notes;
1649 struct elf_prstatus *prstatus;
1650 struct elf_prpsinfo *psinfo;
1651 struct list_head thread_list;
1652 elf_fpregset_t *fpu;
1653#ifdef ELF_CORE_COPY_XFPREGS
1654 elf_fpxregset_t *xfpu;
1655#endif
1656 int thread_status_size;
1657 int numnote;
1658};
1659
1660static int elf_note_info_init(struct elf_note_info *info)
1661{
1662 memset(info, 0, sizeof(*info));
1663 INIT_LIST_HEAD(&info->thread_list);
1664
1665
1666 info->notes = kmalloc(6 * sizeof(struct memelfnote), GFP_KERNEL);
1667 if (!info->notes)
1668 return 0;
1669 info->psinfo = kmalloc(sizeof(*info->psinfo), GFP_KERNEL);
1670 if (!info->psinfo)
1671 goto notes_free;
1672 info->prstatus = kmalloc(sizeof(*info->prstatus), GFP_KERNEL);
1673 if (!info->prstatus)
1674 goto psinfo_free;
1675 info->fpu = kmalloc(sizeof(*info->fpu), GFP_KERNEL);
1676 if (!info->fpu)
1677 goto prstatus_free;
1678#ifdef ELF_CORE_COPY_XFPREGS
1679 info->xfpu = kmalloc(sizeof(*info->xfpu), GFP_KERNEL);
1680 if (!info->xfpu)
1681 goto fpu_free;
1682#endif
1683 return 1;
1684#ifdef ELF_CORE_COPY_XFPREGS
1685 fpu_free:
1686 kfree(info->fpu);
1687#endif
1688 prstatus_free:
1689 kfree(info->prstatus);
1690 psinfo_free:
1691 kfree(info->psinfo);
1692 notes_free:
1693 kfree(info->notes);
1694 return 0;
1695}
1696
1697static int fill_note_info(struct elfhdr *elf, int phdrs,
1698 struct elf_note_info *info,
1699 long signr, struct pt_regs *regs)
1700{
1701 struct list_head *t;
1702
1703 if (!elf_note_info_init(info))
1704 return 0;
1705
1706 if (signr) {
1707 struct core_thread *ct;
1708 struct elf_thread_status *ets;
1709
1710 for (ct = current->mm->core_state->dumper.next;
1711 ct; ct = ct->next) {
1712 ets = kzalloc(sizeof(*ets), GFP_KERNEL);
1713 if (!ets)
1714 return 0;
1715
1716 ets->thread = ct->task;
1717 list_add(&ets->list, &info->thread_list);
1718 }
1719
1720 list_for_each(t, &info->thread_list) {
1721 int sz;
1722
1723 ets = list_entry(t, struct elf_thread_status, list);
1724 sz = elf_dump_thread_status(signr, ets);
1725 info->thread_status_size += sz;
1726 }
1727 }
1728
1729 memset(info->prstatus, 0, sizeof(*info->prstatus));
1730 fill_prstatus(info->prstatus, current, signr);
1731 elf_core_copy_regs(&info->prstatus->pr_reg, regs);
1732
1733
1734 fill_elf_header(elf, phdrs, ELF_ARCH, ELF_CORE_EFLAGS, ELF_OSABI);
1735
1736
1737
1738
1739
1740
1741 fill_note(info->notes + 0, "CORE", NT_PRSTATUS,
1742 sizeof(*info->prstatus), info->prstatus);
1743 fill_psinfo(info->psinfo, current->group_leader, current->mm);
1744 fill_note(info->notes + 1, "CORE", NT_PRPSINFO,
1745 sizeof(*info->psinfo), info->psinfo);
1746
1747 info->numnote = 2;
1748
1749 fill_auxv_note(&info->notes[info->numnote++], current->mm);
1750
1751
1752 info->prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, regs,
1753 info->fpu);
1754 if (info->prstatus->pr_fpvalid)
1755 fill_note(info->notes + info->numnote++,
1756 "CORE", NT_PRFPREG, sizeof(*info->fpu), info->fpu);
1757#ifdef ELF_CORE_COPY_XFPREGS
1758 if (elf_core_copy_task_xfpregs(current, info->xfpu))
1759 fill_note(info->notes + info->numnote++,
1760 "LINUX", ELF_CORE_XFPREG_TYPE,
1761 sizeof(*info->xfpu), info->xfpu);
1762#endif
1763
1764 return 1;
1765}
1766
1767static size_t get_note_info_size(struct elf_note_info *info)
1768{
1769 int sz = 0;
1770 int i;
1771
1772 for (i = 0; i < info->numnote; i++)
1773 sz += notesize(info->notes + i);
1774
1775 sz += info->thread_status_size;
1776
1777 return sz;
1778}
1779
1780static int write_note_info(struct elf_note_info *info,
1781 struct file *file, loff_t *foffset)
1782{
1783 int i;
1784 struct list_head *t;
1785
1786 for (i = 0; i < info->numnote; i++)
1787 if (!writenote(info->notes + i, file, foffset))
1788 return 0;
1789
1790
1791 list_for_each(t, &info->thread_list) {
1792 struct elf_thread_status *tmp =
1793 list_entry(t, struct elf_thread_status, list);
1794
1795 for (i = 0; i < tmp->num_notes; i++)
1796 if (!writenote(&tmp->notes[i], file, foffset))
1797 return 0;
1798 }
1799
1800 return 1;
1801}
1802
1803static void free_note_info(struct elf_note_info *info)
1804{
1805 while (!list_empty(&info->thread_list)) {
1806 struct list_head *tmp = info->thread_list.next;
1807 list_del(tmp);
1808 kfree(list_entry(tmp, struct elf_thread_status, list));
1809 }
1810
1811 kfree(info->prstatus);
1812 kfree(info->psinfo);
1813 kfree(info->notes);
1814 kfree(info->fpu);
1815#ifdef ELF_CORE_COPY_XFPREGS
1816 kfree(info->xfpu);
1817#endif
1818}
1819
1820#endif
1821
1822static struct vm_area_struct *first_vma(struct task_struct *tsk,
1823 struct vm_area_struct *gate_vma)
1824{
1825 struct vm_area_struct *ret = tsk->mm->mmap;
1826
1827 if (ret)
1828 return ret;
1829 return gate_vma;
1830}
1831
1832
1833
1834
1835static struct vm_area_struct *next_vma(struct vm_area_struct *this_vma,
1836 struct vm_area_struct *gate_vma)
1837{
1838 struct vm_area_struct *ret;
1839
1840 ret = this_vma->vm_next;
1841 if (ret)
1842 return ret;
1843 if (this_vma == gate_vma)
1844 return NULL;
1845 return gate_vma;
1846}
1847
1848static void fill_extnum_info(struct elfhdr *elf, struct elf_shdr *shdr4extnum,
1849 elf_addr_t e_shoff, int segs)
1850{
1851 elf->e_shoff = e_shoff;
1852 elf->e_shentsize = sizeof(*shdr4extnum);
1853 elf->e_shnum = 1;
1854 elf->e_shstrndx = SHN_UNDEF;
1855
1856 memset(shdr4extnum, 0, sizeof(*shdr4extnum));
1857
1858 shdr4extnum->sh_type = SHT_NULL;
1859 shdr4extnum->sh_size = elf->e_shnum;
1860 shdr4extnum->sh_link = elf->e_shstrndx;
1861 shdr4extnum->sh_info = segs;
1862}
1863
1864static size_t elf_core_vma_data_size(struct vm_area_struct *gate_vma,
1865 unsigned long mm_flags)
1866{
1867 struct vm_area_struct *vma;
1868 size_t size = 0;
1869
1870 for (vma = first_vma(current, gate_vma); vma != NULL;
1871 vma = next_vma(vma, gate_vma))
1872 size += vma_dump_size(vma, mm_flags);
1873 return size;
1874}
1875
1876
1877
1878
1879
1880
1881
1882
1883static int elf_core_dump(struct coredump_params *cprm)
1884{
1885 int has_dumped = 0;
1886 mm_segment_t fs;
1887 int segs;
1888 size_t size = 0;
1889 struct vm_area_struct *vma, *gate_vma;
1890 struct elfhdr *elf = NULL;
1891 loff_t offset = 0, dataoff, foffset;
1892 struct elf_note_info info;
1893 struct elf_phdr *phdr4note = NULL;
1894 struct elf_shdr *shdr4extnum = NULL;
1895 Elf_Half e_phnum;
1896 elf_addr_t e_shoff;
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911 elf = kmalloc(sizeof(*elf), GFP_KERNEL);
1912 if (!elf)
1913 goto out;
1914
1915
1916
1917
1918 segs = current->mm->map_count;
1919 segs += elf_core_extra_phdrs();
1920
1921 gate_vma = get_gate_vma(current->mm);
1922 if (gate_vma != NULL)
1923 segs++;
1924
1925
1926 segs++;
1927
1928
1929
1930
1931 e_phnum = segs > PN_XNUM ? PN_XNUM : segs;
1932
1933
1934
1935
1936
1937 if (!fill_note_info(elf, e_phnum, &info, cprm->signr, cprm->regs))
1938 goto cleanup;
1939
1940 has_dumped = 1;
1941 current->flags |= PF_DUMPCORE;
1942
1943 fs = get_fs();
1944 set_fs(KERNEL_DS);
1945
1946 offset += sizeof(*elf);
1947 offset += segs * sizeof(struct elf_phdr);
1948 foffset = offset;
1949
1950
1951 {
1952 size_t sz = get_note_info_size(&info);
1953
1954 sz += elf_coredump_extra_notes_size();
1955
1956 phdr4note = kmalloc(sizeof(*phdr4note), GFP_KERNEL);
1957 if (!phdr4note)
1958 goto end_coredump;
1959
1960 fill_elf_note_phdr(phdr4note, sz, offset);
1961 offset += sz;
1962 }
1963
1964 dataoff = offset = roundup(offset, ELF_EXEC_PAGESIZE);
1965
1966 offset += elf_core_vma_data_size(gate_vma, cprm->mm_flags);
1967 offset += elf_core_extra_data_size();
1968 e_shoff = offset;
1969
1970 if (e_phnum == PN_XNUM) {
1971 shdr4extnum = kmalloc(sizeof(*shdr4extnum), GFP_KERNEL);
1972 if (!shdr4extnum)
1973 goto end_coredump;
1974 fill_extnum_info(elf, shdr4extnum, e_shoff, segs);
1975 }
1976
1977 offset = dataoff;
1978
1979 size += sizeof(*elf);
1980 if (size > cprm->limit || !dump_write(cprm->file, elf, sizeof(*elf)))
1981 goto end_coredump;
1982
1983 size += sizeof(*phdr4note);
1984 if (size > cprm->limit
1985 || !dump_write(cprm->file, phdr4note, sizeof(*phdr4note)))
1986 goto end_coredump;
1987
1988
1989 for (vma = first_vma(current, gate_vma); vma != NULL;
1990 vma = next_vma(vma, gate_vma)) {
1991 struct elf_phdr phdr;
1992
1993 phdr.p_type = PT_LOAD;
1994 phdr.p_offset = offset;
1995 phdr.p_vaddr = vma->vm_start;
1996 phdr.p_paddr = 0;
1997 phdr.p_filesz = vma_dump_size(vma, cprm->mm_flags);
1998 phdr.p_memsz = vma->vm_end - vma->vm_start;
1999 offset += phdr.p_filesz;
2000 phdr.p_flags = vma->vm_flags & VM_READ ? PF_R : 0;
2001 if (vma->vm_flags & VM_WRITE)
2002 phdr.p_flags |= PF_W;
2003 if (vma->vm_flags & VM_EXEC)
2004 phdr.p_flags |= PF_X;
2005 phdr.p_align = ELF_EXEC_PAGESIZE;
2006
2007 size += sizeof(phdr);
2008 if (size > cprm->limit
2009 || !dump_write(cprm->file, &phdr, sizeof(phdr)))
2010 goto end_coredump;
2011 }
2012
2013 if (!elf_core_write_extra_phdrs(cprm->file, offset, &size, cprm->limit))
2014 goto end_coredump;
2015
2016
2017 if (!write_note_info(&info, cprm->file, &foffset))
2018 goto end_coredump;
2019
2020 if (elf_coredump_extra_notes_write(cprm->file, &foffset))
2021 goto end_coredump;
2022
2023
2024 if (!dump_seek(cprm->file, dataoff - foffset))
2025 goto end_coredump;
2026
2027 for (vma = first_vma(current, gate_vma); vma != NULL;
2028 vma = next_vma(vma, gate_vma)) {
2029 unsigned long addr;
2030 unsigned long end;
2031
2032 end = vma->vm_start + vma_dump_size(vma, cprm->mm_flags);
2033
2034 for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) {
2035 struct page *page;
2036 int stop;
2037
2038 page = get_dump_page(addr);
2039 if (page) {
2040 void *kaddr = kmap(page);
2041 stop = ((size += PAGE_SIZE) > cprm->limit) ||
2042 !dump_write(cprm->file, kaddr,
2043 PAGE_SIZE);
2044 kunmap(page);
2045 page_cache_release(page);
2046 } else
2047 stop = !dump_seek(cprm->file, PAGE_SIZE);
2048 if (stop)
2049 goto end_coredump;
2050 }
2051 }
2052
2053 if (!elf_core_write_extra_data(cprm->file, &size, cprm->limit))
2054 goto end_coredump;
2055
2056 if (e_phnum == PN_XNUM) {
2057 size += sizeof(*shdr4extnum);
2058 if (size > cprm->limit
2059 || !dump_write(cprm->file, shdr4extnum,
2060 sizeof(*shdr4extnum)))
2061 goto end_coredump;
2062 }
2063
2064end_coredump:
2065 set_fs(fs);
2066
2067cleanup:
2068 free_note_info(&info);
2069 kfree(shdr4extnum);
2070 kfree(phdr4note);
2071 kfree(elf);
2072out:
2073 return has_dumped;
2074}
2075
2076#endif
2077
2078static int __init init_elf_binfmt(void)
2079{
2080 return register_binfmt(&elf_format);
2081}
2082
2083static void __exit exit_elf_binfmt(void)
2084{
2085
2086 unregister_binfmt(&elf_format);
2087}
2088
2089core_initcall(init_elf_binfmt);
2090module_exit(exit_elf_binfmt);
2091MODULE_LICENSE("GPL");
2092