blob: f1c64a27257ef6fb4c7e52747045633eedb1205c [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
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>
Linus Torvalds1da177e2005-04-16 15:20:36 -070015#include <linux/mm.h>
16#include <linux/mman.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070017#include <linux/errno.h>
18#include <linux/signal.h>
19#include <linux/binfmts.h>
20#include <linux/string.h>
21#include <linux/file.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070022#include <linux/slab.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070023#include <linux/personality.h>
24#include <linux/elfcore.h>
25#include <linux/init.h>
26#include <linux/highuid.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070027#include <linux/compiler.h>
28#include <linux/highmem.h>
29#include <linux/pagemap.h>
Denys Vlasenko2aa362c2012-10-04 17:15:36 -070030#include <linux/vmalloc.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include <linux/security.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070032#include <linux/random.h>
Jesper Juhlf4e5cc22006-06-23 02:05:35 -070033#include <linux/elf.h>
Alexey Dobriyan7e80d0d2007-05-08 00:28:59 -070034#include <linux/utsname.h>
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -080035#include <linux/coredump.h>
Frederic Weisbecker6fac4822012-11-13 14:20:55 +010036#include <linux/sched.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070037#include <asm/uaccess.h>
38#include <asm/param.h>
39#include <asm/page.h>
40
Denys Vlasenko2aa362c2012-10-04 17:15:36 -070041#ifndef user_long_t
42#define user_long_t long
43#endif
Denys Vlasenko49ae4d42012-10-04 17:15:35 -070044#ifndef user_siginfo_t
45#define user_siginfo_t siginfo_t
46#endif
47
Al Viro71613c32012-10-20 22:00:48 -040048static int load_elf_binary(struct linux_binprm *bprm);
Jesper Juhlf4e5cc22006-06-23 02:05:35 -070049static int load_elf_library(struct file *);
Andrew Mortonbb1ad822008-01-30 13:31:07 +010050static unsigned long elf_map(struct file *, unsigned long, struct elf_phdr *,
51 int, int, unsigned long);
Linus Torvalds1da177e2005-04-16 15:20:36 -070052
Linus Torvalds1da177e2005-04-16 15:20:36 -070053/*
54 * If we don't support core dumping, then supply a NULL so we
55 * don't even try.
56 */
Christoph Hellwig698ba7b2009-12-15 16:47:37 -080057#ifdef CONFIG_ELF_CORE
Masami Hiramatsuf6151df2009-12-17 15:27:16 -080058static int elf_core_dump(struct coredump_params *cprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -070059#else
60#define elf_core_dump NULL
61#endif
62
63#if ELF_EXEC_PAGESIZE > PAGE_SIZE
Jesper Juhlf4e5cc22006-06-23 02:05:35 -070064#define ELF_MIN_ALIGN ELF_EXEC_PAGESIZE
Linus Torvalds1da177e2005-04-16 15:20:36 -070065#else
Jesper Juhlf4e5cc22006-06-23 02:05:35 -070066#define ELF_MIN_ALIGN PAGE_SIZE
Linus Torvalds1da177e2005-04-16 15:20:36 -070067#endif
68
69#ifndef ELF_CORE_EFLAGS
70#define ELF_CORE_EFLAGS 0
71#endif
72
73#define ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(ELF_MIN_ALIGN-1))
74#define ELF_PAGEOFFSET(_v) ((_v) & (ELF_MIN_ALIGN-1))
75#define ELF_PAGEALIGN(_v) (((_v) + ELF_MIN_ALIGN - 1) & ~(ELF_MIN_ALIGN - 1))
76
77static struct linux_binfmt elf_format = {
Mikael Petterssonf670d0e2011-01-12 17:00:02 -080078 .module = THIS_MODULE,
79 .load_binary = load_elf_binary,
80 .load_shlib = load_elf_library,
81 .core_dump = elf_core_dump,
82 .min_coredump = ELF_EXEC_PAGESIZE,
Linus Torvalds1da177e2005-04-16 15:20:36 -070083};
84
Andrew Mortond4e3cc32007-07-21 04:37:32 -070085#define BAD_ADDR(x) ((unsigned long)(x) >= TASK_SIZE)
Linus Torvalds1da177e2005-04-16 15:20:36 -070086
87static int set_brk(unsigned long start, unsigned long end)
88{
89 start = ELF_PAGEALIGN(start);
90 end = ELF_PAGEALIGN(end);
91 if (end > start) {
92 unsigned long addr;
Linus Torvaldse4eb1ff2012-04-20 15:35:40 -070093 addr = vm_brk(start, end - start);
Linus Torvalds1da177e2005-04-16 15:20:36 -070094 if (BAD_ADDR(addr))
95 return addr;
96 }
97 current->mm->start_brk = current->mm->brk = end;
98 return 0;
99}
100
Linus Torvalds1da177e2005-04-16 15:20:36 -0700101/* We need to explicitly zero any fractional pages
102 after the data section (i.e. bss). This would
103 contain the junk from the file that should not
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700104 be in memory
105 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700106static int padzero(unsigned long elf_bss)
107{
108 unsigned long nbyte;
109
110 nbyte = ELF_PAGEOFFSET(elf_bss);
111 if (nbyte) {
112 nbyte = ELF_MIN_ALIGN - nbyte;
113 if (clear_user((void __user *) elf_bss, nbyte))
114 return -EFAULT;
115 }
116 return 0;
117}
118
Ohad Ben-Cohen09c6dd32008-02-03 18:05:15 +0200119/* Let's use some macros to make this stack manipulation a little clearer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700120#ifdef CONFIG_STACK_GROWSUP
121#define STACK_ADD(sp, items) ((elf_addr_t __user *)(sp) + (items))
122#define STACK_ROUND(sp, items) \
123 ((15 + (unsigned long) ((sp) + (items))) &~ 15UL)
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700124#define STACK_ALLOC(sp, len) ({ \
125 elf_addr_t __user *old_sp = (elf_addr_t __user *)sp; sp += len; \
126 old_sp; })
Linus Torvalds1da177e2005-04-16 15:20:36 -0700127#else
128#define STACK_ADD(sp, items) ((elf_addr_t __user *)(sp) - (items))
129#define STACK_ROUND(sp, items) \
130 (((unsigned long) (sp - items)) &~ 15UL)
131#define STACK_ALLOC(sp, len) ({ sp -= len ; sp; })
132#endif
133
Nathan Lynch483fad12008-07-22 04:48:46 +1000134#ifndef ELF_BASE_PLATFORM
135/*
136 * AT_BASE_PLATFORM indicates the "real" hardware/microarchitecture.
137 * If the arch defines ELF_BASE_PLATFORM (in asm/elf.h), the value
138 * will be copied to the user stack in the same manner as AT_PLATFORM.
139 */
140#define ELF_BASE_PLATFORM NULL
141#endif
142
Linus Torvalds1da177e2005-04-16 15:20:36 -0700143static int
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700144create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec,
Andi Kleend20894a2008-02-08 04:21:54 -0800145 unsigned long load_addr, unsigned long interp_load_addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700146{
147 unsigned long p = bprm->p;
148 int argc = bprm->argc;
149 int envc = bprm->envc;
150 elf_addr_t __user *argv;
151 elf_addr_t __user *envp;
152 elf_addr_t __user *sp;
153 elf_addr_t __user *u_platform;
Nathan Lynch483fad12008-07-22 04:48:46 +1000154 elf_addr_t __user *u_base_platform;
Kees Cookf06295b2009-01-07 18:08:52 -0800155 elf_addr_t __user *u_rand_bytes;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700156 const char *k_platform = ELF_PLATFORM;
Nathan Lynch483fad12008-07-22 04:48:46 +1000157 const char *k_base_platform = ELF_BASE_PLATFORM;
Kees Cookf06295b2009-01-07 18:08:52 -0800158 unsigned char k_rand_bytes[16];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700159 int items;
160 elf_addr_t *elf_info;
161 int ei_index = 0;
David Howells86a264a2008-11-14 10:39:18 +1100162 const struct cred *cred = current_cred();
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700163 struct vm_area_struct *vma;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700164
165 /*
Franck Bui-Huud68c9d62007-10-16 23:30:24 -0700166 * In some cases (e.g. Hyper-Threading), we want to avoid L1
167 * evictions by the processes running on the same package. One
168 * thing we can do is to shuffle the initial stack for them.
169 */
170
171 p = arch_align_stack(p);
172
173 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700174 * If this architecture has a platform capability string, copy it
175 * to userspace. In some cases (Sparc), this info is impossible
176 * for userspace to get any other way, in others (i386) it is
177 * merely difficult.
178 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700179 u_platform = NULL;
180 if (k_platform) {
181 size_t len = strlen(k_platform) + 1;
182
Linus Torvalds1da177e2005-04-16 15:20:36 -0700183 u_platform = (elf_addr_t __user *)STACK_ALLOC(p, len);
184 if (__copy_to_user(u_platform, k_platform, len))
185 return -EFAULT;
186 }
187
Nathan Lynch483fad12008-07-22 04:48:46 +1000188 /*
189 * If this architecture has a "base" platform capability
190 * string, copy it to userspace.
191 */
192 u_base_platform = NULL;
193 if (k_base_platform) {
194 size_t len = strlen(k_base_platform) + 1;
195
196 u_base_platform = (elf_addr_t __user *)STACK_ALLOC(p, len);
197 if (__copy_to_user(u_base_platform, k_base_platform, len))
198 return -EFAULT;
199 }
200
Kees Cookf06295b2009-01-07 18:08:52 -0800201 /*
202 * Generate 16 random bytes for userspace PRNG seeding.
203 */
204 get_random_bytes(k_rand_bytes, sizeof(k_rand_bytes));
205 u_rand_bytes = (elf_addr_t __user *)
206 STACK_ALLOC(p, sizeof(k_rand_bytes));
207 if (__copy_to_user(u_rand_bytes, k_rand_bytes, sizeof(k_rand_bytes)))
208 return -EFAULT;
209
Linus Torvalds1da177e2005-04-16 15:20:36 -0700210 /* Create the ELF interpreter info */
Jesper Juhl785d5572006-06-23 02:05:35 -0700211 elf_info = (elf_addr_t *)current->mm->saved_auxv;
Olaf Hering4f9a58d2007-10-16 23:30:12 -0700212 /* update AT_VECTOR_SIZE_BASE if the number of NEW_AUX_ENT() changes */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700213#define NEW_AUX_ENT(id, val) \
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700214 do { \
Jesper Juhl785d5572006-06-23 02:05:35 -0700215 elf_info[ei_index++] = id; \
216 elf_info[ei_index++] = val; \
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700217 } while (0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700218
219#ifdef ARCH_DLINFO
220 /*
221 * ARCH_DLINFO must come first so PPC can do its special alignment of
222 * AUXV.
Olaf Hering4f9a58d2007-10-16 23:30:12 -0700223 * update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT() in
224 * ARCH_DLINFO changes
Linus Torvalds1da177e2005-04-16 15:20:36 -0700225 */
226 ARCH_DLINFO;
227#endif
228 NEW_AUX_ENT(AT_HWCAP, ELF_HWCAP);
229 NEW_AUX_ENT(AT_PAGESZ, ELF_EXEC_PAGESIZE);
230 NEW_AUX_ENT(AT_CLKTCK, CLOCKS_PER_SEC);
231 NEW_AUX_ENT(AT_PHDR, load_addr + exec->e_phoff);
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700232 NEW_AUX_ENT(AT_PHENT, sizeof(struct elf_phdr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700233 NEW_AUX_ENT(AT_PHNUM, exec->e_phnum);
234 NEW_AUX_ENT(AT_BASE, interp_load_addr);
235 NEW_AUX_ENT(AT_FLAGS, 0);
236 NEW_AUX_ENT(AT_ENTRY, exec->e_entry);
Eric W. Biedermanebc887b2012-02-07 18:36:10 -0800237 NEW_AUX_ENT(AT_UID, from_kuid_munged(cred->user_ns, cred->uid));
238 NEW_AUX_ENT(AT_EUID, from_kuid_munged(cred->user_ns, cred->euid));
239 NEW_AUX_ENT(AT_GID, from_kgid_munged(cred->user_ns, cred->gid));
240 NEW_AUX_ENT(AT_EGID, from_kgid_munged(cred->user_ns, cred->egid));
Jesper Juhl785d5572006-06-23 02:05:35 -0700241 NEW_AUX_ENT(AT_SECURE, security_bprm_secureexec(bprm));
Kees Cookf06295b2009-01-07 18:08:52 -0800242 NEW_AUX_ENT(AT_RANDOM, (elf_addr_t)(unsigned long)u_rand_bytes);
Michael Neuling21713642013-04-17 17:33:11 +0000243#ifdef ELF_HWCAP2
244 NEW_AUX_ENT(AT_HWCAP2, ELF_HWCAP2);
245#endif
John Reiser65191082008-07-21 14:21:32 -0700246 NEW_AUX_ENT(AT_EXECFN, bprm->exec);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700247 if (k_platform) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700248 NEW_AUX_ENT(AT_PLATFORM,
Jesper Juhl785d5572006-06-23 02:05:35 -0700249 (elf_addr_t)(unsigned long)u_platform);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700250 }
Nathan Lynch483fad12008-07-22 04:48:46 +1000251 if (k_base_platform) {
252 NEW_AUX_ENT(AT_BASE_PLATFORM,
253 (elf_addr_t)(unsigned long)u_base_platform);
254 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700255 if (bprm->interp_flags & BINPRM_FLAGS_EXECFD) {
Jesper Juhl785d5572006-06-23 02:05:35 -0700256 NEW_AUX_ENT(AT_EXECFD, bprm->interp_data);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700257 }
258#undef NEW_AUX_ENT
259 /* AT_NULL is zero; clear the rest too */
260 memset(&elf_info[ei_index], 0,
261 sizeof current->mm->saved_auxv - ei_index * sizeof elf_info[0]);
262
263 /* And advance past the AT_NULL entry. */
264 ei_index += 2;
265
266 sp = STACK_ADD(p, ei_index);
267
Andi Kleend20894a2008-02-08 04:21:54 -0800268 items = (argc + 1) + (envc + 1) + 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700269 bprm->p = STACK_ROUND(sp, items);
270
271 /* Point sp at the lowest address on the stack */
272#ifdef CONFIG_STACK_GROWSUP
273 sp = (elf_addr_t __user *)bprm->p - items - ei_index;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700274 bprm->exec = (unsigned long)sp; /* XXX: PARISC HACK */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700275#else
276 sp = (elf_addr_t __user *)bprm->p;
277#endif
278
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700279
280 /*
281 * Grow the stack manually; some architectures have a limit on how
282 * far ahead a user-space access may be in order to grow the stack.
283 */
284 vma = find_extend_vma(current->mm, bprm->p);
285 if (!vma)
286 return -EFAULT;
287
Linus Torvalds1da177e2005-04-16 15:20:36 -0700288 /* Now, let's put argc (and argv, envp if appropriate) on the stack */
289 if (__put_user(argc, sp++))
290 return -EFAULT;
Andi Kleend20894a2008-02-08 04:21:54 -0800291 argv = sp;
292 envp = argv + argc + 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700293
294 /* Populate argv and envp */
Greg Kroah-Hartmana84a5052005-05-11 00:10:44 -0700295 p = current->mm->arg_end = current->mm->arg_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700296 while (argc-- > 0) {
297 size_t len;
Heiko Carstens841d5fb2006-12-06 20:36:35 -0800298 if (__put_user((elf_addr_t)p, argv++))
299 return -EFAULT;
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700300 len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);
301 if (!len || len > MAX_ARG_STRLEN)
WANG Cong23c49712008-05-08 21:52:33 +0800302 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700303 p += len;
304 }
305 if (__put_user(0, argv))
306 return -EFAULT;
307 current->mm->arg_end = current->mm->env_start = p;
308 while (envc-- > 0) {
309 size_t len;
Heiko Carstens841d5fb2006-12-06 20:36:35 -0800310 if (__put_user((elf_addr_t)p, envp++))
311 return -EFAULT;
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700312 len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);
313 if (!len || len > MAX_ARG_STRLEN)
WANG Cong23c49712008-05-08 21:52:33 +0800314 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700315 p += len;
316 }
317 if (__put_user(0, envp))
318 return -EFAULT;
319 current->mm->env_end = p;
320
321 /* Put the elf_info on the stack in the right place. */
322 sp = (elf_addr_t __user *)envp + 1;
323 if (copy_to_user(sp, elf_info, ei_index * sizeof(elf_addr_t)))
324 return -EFAULT;
325 return 0;
326}
327
James Hoganc07380b2011-05-09 10:58:40 +0100328#ifndef elf_map
329
Linus Torvalds1da177e2005-04-16 15:20:36 -0700330static unsigned long elf_map(struct file *filep, unsigned long addr,
Jiri Kosinacc503c12008-01-30 13:31:07 +0100331 struct elf_phdr *eppnt, int prot, int type,
332 unsigned long total_size)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700333{
334 unsigned long map_addr;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100335 unsigned long size = eppnt->p_filesz + ELF_PAGEOFFSET(eppnt->p_vaddr);
336 unsigned long off = eppnt->p_offset - ELF_PAGEOFFSET(eppnt->p_vaddr);
337 addr = ELF_PAGESTART(addr);
338 size = ELF_PAGEALIGN(size);
Jan Kratochvil60bfba72007-07-15 23:40:06 -0700339
Andrew Mortond4e3cc32007-07-21 04:37:32 -0700340 /* mmap() will return -EINVAL if given a zero size, but a
341 * segment with zero filesize is perfectly valid */
Jiri Kosinacc503c12008-01-30 13:31:07 +0100342 if (!size)
343 return addr;
344
Jiri Kosinacc503c12008-01-30 13:31:07 +0100345 /*
346 * total_size is the size of the ELF (interpreter) image.
347 * The _first_ mmap needs to know the full size, otherwise
348 * randomization might put this image into an overlapping
349 * position with the ELF binary image. (since size < total_size)
350 * So we first map the 'big' image - and unmap the remainder at
351 * the end. (which unmap is needed for ELF images with holes.)
352 */
353 if (total_size) {
354 total_size = ELF_PAGEALIGN(total_size);
Al Viro5a5e4c22012-05-30 01:49:38 -0400355 map_addr = vm_mmap(filep, addr, total_size, prot, type, off);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100356 if (!BAD_ADDR(map_addr))
Al Viro5a5e4c22012-05-30 01:49:38 -0400357 vm_munmap(map_addr+size, total_size-size);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100358 } else
Al Viro5a5e4c22012-05-30 01:49:38 -0400359 map_addr = vm_mmap(filep, addr, size, prot, type, off);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100360
Linus Torvalds1da177e2005-04-16 15:20:36 -0700361 return(map_addr);
362}
363
James Hoganc07380b2011-05-09 10:58:40 +0100364#endif /* !elf_map */
365
Jiri Kosinacc503c12008-01-30 13:31:07 +0100366static unsigned long total_mapping_size(struct elf_phdr *cmds, int nr)
367{
368 int i, first_idx = -1, last_idx = -1;
369
370 for (i = 0; i < nr; i++) {
371 if (cmds[i].p_type == PT_LOAD) {
372 last_idx = i;
373 if (first_idx == -1)
374 first_idx = i;
375 }
376 }
377 if (first_idx == -1)
378 return 0;
379
380 return cmds[last_idx].p_vaddr + cmds[last_idx].p_memsz -
381 ELF_PAGESTART(cmds[first_idx].p_vaddr);
382}
383
384
Linus Torvalds1da177e2005-04-16 15:20:36 -0700385/* This is much more generalized than the library routine read function,
386 so we keep this separate. Technically the library read function
387 is only provided so that we can read a.out libraries that have
388 an ELF header */
389
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700390static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
Jiri Kosinacc503c12008-01-30 13:31:07 +0100391 struct file *interpreter, unsigned long *interp_map_addr,
392 unsigned long no_base)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700393{
394 struct elf_phdr *elf_phdata;
395 struct elf_phdr *eppnt;
396 unsigned long load_addr = 0;
397 int load_addr_set = 0;
398 unsigned long last_bss = 0, elf_bss = 0;
399 unsigned long error = ~0UL;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100400 unsigned long total_size;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700401 int retval, i, size;
402
403 /* First of all, some simple consistency checks */
404 if (interp_elf_ex->e_type != ET_EXEC &&
405 interp_elf_ex->e_type != ET_DYN)
406 goto out;
407 if (!elf_check_arch(interp_elf_ex))
408 goto out;
409 if (!interpreter->f_op || !interpreter->f_op->mmap)
410 goto out;
411
412 /*
413 * If the size of this structure has changed, then punt, since
414 * we will be doing the wrong thing.
415 */
416 if (interp_elf_ex->e_phentsize != sizeof(struct elf_phdr))
417 goto out;
418 if (interp_elf_ex->e_phnum < 1 ||
419 interp_elf_ex->e_phnum > 65536U / sizeof(struct elf_phdr))
420 goto out;
421
422 /* Now read in all of the header information */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700423 size = sizeof(struct elf_phdr) * interp_elf_ex->e_phnum;
424 if (size > ELF_MIN_ALIGN)
425 goto out;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700426 elf_phdata = kmalloc(size, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700427 if (!elf_phdata)
428 goto out;
429
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700430 retval = kernel_read(interpreter, interp_elf_ex->e_phoff,
Mikael Petterssonf670d0e2011-01-12 17:00:02 -0800431 (char *)elf_phdata, size);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700432 error = -EIO;
433 if (retval != size) {
434 if (retval < 0)
435 error = retval;
436 goto out_close;
437 }
438
Jiri Kosinacc503c12008-01-30 13:31:07 +0100439 total_size = total_mapping_size(elf_phdata, interp_elf_ex->e_phnum);
440 if (!total_size) {
441 error = -EINVAL;
442 goto out_close;
443 }
444
Linus Torvalds1da177e2005-04-16 15:20:36 -0700445 eppnt = elf_phdata;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700446 for (i = 0; i < interp_elf_ex->e_phnum; i++, eppnt++) {
447 if (eppnt->p_type == PT_LOAD) {
448 int elf_type = MAP_PRIVATE | MAP_DENYWRITE;
449 int elf_prot = 0;
450 unsigned long vaddr = 0;
451 unsigned long k, map_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700452
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700453 if (eppnt->p_flags & PF_R)
454 elf_prot = PROT_READ;
455 if (eppnt->p_flags & PF_W)
456 elf_prot |= PROT_WRITE;
457 if (eppnt->p_flags & PF_X)
458 elf_prot |= PROT_EXEC;
459 vaddr = eppnt->p_vaddr;
460 if (interp_elf_ex->e_type == ET_EXEC || load_addr_set)
461 elf_type |= MAP_FIXED;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100462 else if (no_base && interp_elf_ex->e_type == ET_DYN)
463 load_addr = -vaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700464
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700465 map_addr = elf_map(interpreter, load_addr + vaddr,
Andrew Mortonbb1ad822008-01-30 13:31:07 +0100466 eppnt, elf_prot, elf_type, total_size);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100467 total_size = 0;
468 if (!*interp_map_addr)
469 *interp_map_addr = map_addr;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700470 error = map_addr;
471 if (BAD_ADDR(map_addr))
472 goto out_close;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700473
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700474 if (!load_addr_set &&
475 interp_elf_ex->e_type == ET_DYN) {
476 load_addr = map_addr - ELF_PAGESTART(vaddr);
477 load_addr_set = 1;
478 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700479
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700480 /*
481 * Check to see if the section's size will overflow the
482 * allowed task size. Note that p_filesz must always be
483 * <= p_memsize so it's only necessary to check p_memsz.
484 */
485 k = load_addr + eppnt->p_vaddr;
Chuck Ebbertce510592006-07-03 00:24:14 -0700486 if (BAD_ADDR(k) ||
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700487 eppnt->p_filesz > eppnt->p_memsz ||
488 eppnt->p_memsz > TASK_SIZE ||
489 TASK_SIZE - eppnt->p_memsz < k) {
490 error = -ENOMEM;
491 goto out_close;
492 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700493
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700494 /*
495 * Find the end of the file mapping for this phdr, and
496 * keep track of the largest address we see for this.
497 */
498 k = load_addr + eppnt->p_vaddr + eppnt->p_filesz;
499 if (k > elf_bss)
500 elf_bss = k;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700501
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700502 /*
503 * Do the same thing for the memory mapping - between
504 * elf_bss and last_bss is the bss section.
505 */
506 k = load_addr + eppnt->p_memsz + eppnt->p_vaddr;
507 if (k > last_bss)
508 last_bss = k;
509 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700510 }
511
Linus Torvalds1da177e2005-04-16 15:20:36 -0700512 if (last_bss > elf_bss) {
Roland McGrath752015d2009-09-08 19:49:40 -0700513 /*
514 * Now fill out the bss section. First pad the last page up
515 * to the page boundary, and then perform a mmap to make sure
516 * that there are zero-mapped pages up to and including the
517 * last bss page.
518 */
519 if (padzero(elf_bss)) {
520 error = -EFAULT;
521 goto out_close;
522 }
523
524 /* What we have mapped so far */
525 elf_bss = ELF_PAGESTART(elf_bss + ELF_MIN_ALIGN - 1);
526
527 /* Map the last of the bss segment */
Linus Torvaldse4eb1ff2012-04-20 15:35:40 -0700528 error = vm_brk(elf_bss, last_bss - elf_bss);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700529 if (BAD_ADDR(error))
530 goto out_close;
531 }
532
Jiri Kosinacc503c12008-01-30 13:31:07 +0100533 error = load_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700534
535out_close:
536 kfree(elf_phdata);
537out:
538 return error;
539}
540
Linus Torvalds1da177e2005-04-16 15:20:36 -0700541/*
542 * These are the functions used to load ELF style executables and shared
543 * libraries. There is no binary dependent code anywhere else.
544 */
545
546#define INTERPRETER_NONE 0
Linus Torvalds1da177e2005-04-16 15:20:36 -0700547#define INTERPRETER_ELF 2
548
Andi Kleen913bd902006-03-25 16:29:09 +0100549#ifndef STACK_RND_MASK
James Bottomleyd1cabd632007-03-16 13:38:35 -0800550#define STACK_RND_MASK (0x7ff >> (PAGE_SHIFT - 12)) /* 8MB of VA */
Andi Kleen913bd902006-03-25 16:29:09 +0100551#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700552
553static unsigned long randomize_stack_top(unsigned long stack_top)
554{
555 unsigned int random_variable = 0;
556
Andi Kleenc16b63e02006-09-26 10:52:28 +0200557 if ((current->flags & PF_RANDOMIZE) &&
558 !(current->personality & ADDR_NO_RANDOMIZE)) {
Andi Kleen913bd902006-03-25 16:29:09 +0100559 random_variable = get_random_int() & STACK_RND_MASK;
560 random_variable <<= PAGE_SHIFT;
561 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700562#ifdef CONFIG_STACK_GROWSUP
Andi Kleen913bd902006-03-25 16:29:09 +0100563 return PAGE_ALIGN(stack_top) + random_variable;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700564#else
Andi Kleen913bd902006-03-25 16:29:09 +0100565 return PAGE_ALIGN(stack_top) - random_variable;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700566#endif
567}
568
Al Viro71613c32012-10-20 22:00:48 -0400569static int load_elf_binary(struct linux_binprm *bprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700570{
571 struct file *interpreter = NULL; /* to shut gcc up */
572 unsigned long load_addr = 0, load_bias = 0;
573 int load_addr_set = 0;
574 char * elf_interpreter = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700575 unsigned long error;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700576 struct elf_phdr *elf_ppnt, *elf_phdata;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700577 unsigned long elf_bss, elf_brk;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700578 int retval, i;
579 unsigned int size;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100580 unsigned long elf_entry;
581 unsigned long interp_load_addr = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700582 unsigned long start_code, end_code, start_data, end_data;
David Daney1a530a62011-03-22 16:34:48 -0700583 unsigned long reloc_func_desc __maybe_unused = 0;
David Rientjes8de61e62006-12-06 20:40:16 -0800584 int executable_stack = EXSTACK_DEFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700585 unsigned long def_flags = 0;
Al Viro71613c32012-10-20 22:00:48 -0400586 struct pt_regs *regs = current_pt_regs();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700587 struct {
588 struct elfhdr elf_ex;
589 struct elfhdr interp_elf_ex;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700590 } *loc;
591
592 loc = kmalloc(sizeof(*loc), GFP_KERNEL);
593 if (!loc) {
594 retval = -ENOMEM;
595 goto out_ret;
596 }
597
598 /* Get the exec-header */
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700599 loc->elf_ex = *((struct elfhdr *)bprm->buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700600
601 retval = -ENOEXEC;
602 /* First of all, some simple consistency checks */
603 if (memcmp(loc->elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
604 goto out;
605
606 if (loc->elf_ex.e_type != ET_EXEC && loc->elf_ex.e_type != ET_DYN)
607 goto out;
608 if (!elf_check_arch(&loc->elf_ex))
609 goto out;
Mikael Petterssonf670d0e2011-01-12 17:00:02 -0800610 if (!bprm->file->f_op || !bprm->file->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700611 goto out;
612
613 /* Now read in all of the header information */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700614 if (loc->elf_ex.e_phentsize != sizeof(struct elf_phdr))
615 goto out;
616 if (loc->elf_ex.e_phnum < 1 ||
617 loc->elf_ex.e_phnum > 65536U / sizeof(struct elf_phdr))
618 goto out;
619 size = loc->elf_ex.e_phnum * sizeof(struct elf_phdr);
620 retval = -ENOMEM;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700621 elf_phdata = kmalloc(size, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700622 if (!elf_phdata)
623 goto out;
624
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700625 retval = kernel_read(bprm->file, loc->elf_ex.e_phoff,
626 (char *)elf_phdata, size);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700627 if (retval != size) {
628 if (retval >= 0)
629 retval = -EIO;
630 goto out_free_ph;
631 }
632
Linus Torvalds1da177e2005-04-16 15:20:36 -0700633 elf_ppnt = elf_phdata;
634 elf_bss = 0;
635 elf_brk = 0;
636
637 start_code = ~0UL;
638 end_code = 0;
639 start_data = 0;
640 end_data = 0;
641
642 for (i = 0; i < loc->elf_ex.e_phnum; i++) {
643 if (elf_ppnt->p_type == PT_INTERP) {
644 /* This is the program interpreter used for
645 * shared libraries - for now assume that this
646 * is an a.out format binary
647 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700648 retval = -ENOEXEC;
649 if (elf_ppnt->p_filesz > PATH_MAX ||
650 elf_ppnt->p_filesz < 2)
Al Viroe7b9b552009-03-29 16:31:16 -0400651 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700652
653 retval = -ENOMEM;
Jesper Juhl792db3a2006-01-09 20:54:45 -0800654 elf_interpreter = kmalloc(elf_ppnt->p_filesz,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700655 GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700656 if (!elf_interpreter)
Al Viroe7b9b552009-03-29 16:31:16 -0400657 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700658
659 retval = kernel_read(bprm->file, elf_ppnt->p_offset,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700660 elf_interpreter,
661 elf_ppnt->p_filesz);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700662 if (retval != elf_ppnt->p_filesz) {
663 if (retval >= 0)
664 retval = -EIO;
665 goto out_free_interp;
666 }
667 /* make sure path is NULL terminated */
668 retval = -ENOEXEC;
669 if (elf_interpreter[elf_ppnt->p_filesz - 1] != '\0')
670 goto out_free_interp;
671
Linus Torvalds1da177e2005-04-16 15:20:36 -0700672 interpreter = open_exec(elf_interpreter);
673 retval = PTR_ERR(interpreter);
674 if (IS_ERR(interpreter))
675 goto out_free_interp;
Alexey Dobriyan1fb84492007-01-26 00:57:16 -0800676
677 /*
678 * If the binary is not readable then enforce
679 * mm->dumpable = 0 regardless of the interpreter's
680 * permissions.
681 */
Al Viro1b5d7832011-06-19 12:49:47 -0400682 would_dump(bprm, interpreter);
Alexey Dobriyan1fb84492007-01-26 00:57:16 -0800683
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700684 retval = kernel_read(interpreter, 0, bprm->buf,
685 BINPRM_BUF_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700686 if (retval != BINPRM_BUF_SIZE) {
687 if (retval >= 0)
688 retval = -EIO;
689 goto out_free_dentry;
690 }
691
692 /* Get the exec headers */
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700693 loc->interp_elf_ex = *((struct elfhdr *)bprm->buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700694 break;
695 }
696 elf_ppnt++;
697 }
698
699 elf_ppnt = elf_phdata;
700 for (i = 0; i < loc->elf_ex.e_phnum; i++, elf_ppnt++)
701 if (elf_ppnt->p_type == PT_GNU_STACK) {
702 if (elf_ppnt->p_flags & PF_X)
703 executable_stack = EXSTACK_ENABLE_X;
704 else
705 executable_stack = EXSTACK_DISABLE_X;
706 break;
707 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700708
709 /* Some simple consistency checks for the interpreter */
710 if (elf_interpreter) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700711 retval = -ELIBBAD;
Andi Kleend20894a2008-02-08 04:21:54 -0800712 /* Not an ELF interpreter */
713 if (memcmp(loc->interp_elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700714 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700715 /* Verify the interpreter has a valid arch */
Andi Kleend20894a2008-02-08 04:21:54 -0800716 if (!elf_check_arch(&loc->interp_elf_ex))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700717 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700718 }
719
Linus Torvalds1da177e2005-04-16 15:20:36 -0700720 /* Flush all traces of the currently running executable */
721 retval = flush_old_exec(bprm);
722 if (retval)
723 goto out_free_dentry;
724
Linus Torvalds1da177e2005-04-16 15:20:36 -0700725 /* OK, This is the point of no return */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700726 current->mm->def_flags = def_flags;
727
728 /* Do this immediately, since STACK_TOP as used in setup_arg_pages
729 may depend on the personality. */
Martin Schwidefsky0b592682008-10-16 15:39:57 +0200730 SET_PERSONALITY(loc->elf_ex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700731 if (elf_read_implies_exec(loc->elf_ex, executable_stack))
732 current->personality |= READ_IMPLIES_EXEC;
733
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700734 if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700735 current->flags |= PF_RANDOMIZE;
Linus Torvalds221af7f2010-01-28 22:14:42 -0800736
737 setup_new_exec(bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700738
739 /* Do this so that we can load the interpreter, if need be. We will
740 change some of these later */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700741 current->mm->free_area_cache = current->mm->mmap_base;
Wolfgang Wander1363c3c2005-06-21 17:14:49 -0700742 current->mm->cached_hole_size = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700743 retval = setup_arg_pages(bprm, randomize_stack_top(STACK_TOP),
744 executable_stack);
745 if (retval < 0) {
746 send_sig(SIGKILL, current, 0);
747 goto out_free_dentry;
748 }
749
Linus Torvalds1da177e2005-04-16 15:20:36 -0700750 current->mm->start_stack = bprm->p;
751
André Goddard Rosaaf901ca2009-11-14 13:09:05 -0200752 /* Now we do a little grungy work by mmapping the ELF image into
Jiri Kosinacc503c12008-01-30 13:31:07 +0100753 the correct location in memory. */
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700754 for(i = 0, elf_ppnt = elf_phdata;
755 i < loc->elf_ex.e_phnum; i++, elf_ppnt++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700756 int elf_prot = 0, elf_flags;
757 unsigned long k, vaddr;
758
759 if (elf_ppnt->p_type != PT_LOAD)
760 continue;
761
762 if (unlikely (elf_brk > elf_bss)) {
763 unsigned long nbyte;
764
765 /* There was a PT_LOAD segment with p_memsz > p_filesz
766 before this one. Map anonymous pages, if needed,
767 and clear the area. */
Mikael Petterssonf670d0e2011-01-12 17:00:02 -0800768 retval = set_brk(elf_bss + load_bias,
769 elf_brk + load_bias);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700770 if (retval) {
771 send_sig(SIGKILL, current, 0);
772 goto out_free_dentry;
773 }
774 nbyte = ELF_PAGEOFFSET(elf_bss);
775 if (nbyte) {
776 nbyte = ELF_MIN_ALIGN - nbyte;
777 if (nbyte > elf_brk - elf_bss)
778 nbyte = elf_brk - elf_bss;
779 if (clear_user((void __user *)elf_bss +
780 load_bias, nbyte)) {
781 /*
782 * This bss-zeroing can fail if the ELF
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700783 * file specifies odd protections. So
Linus Torvalds1da177e2005-04-16 15:20:36 -0700784 * we don't check the return value
785 */
786 }
787 }
788 }
789
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700790 if (elf_ppnt->p_flags & PF_R)
791 elf_prot |= PROT_READ;
792 if (elf_ppnt->p_flags & PF_W)
793 elf_prot |= PROT_WRITE;
794 if (elf_ppnt->p_flags & PF_X)
795 elf_prot |= PROT_EXEC;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700796
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700797 elf_flags = MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700798
799 vaddr = elf_ppnt->p_vaddr;
800 if (loc->elf_ex.e_type == ET_EXEC || load_addr_set) {
801 elf_flags |= MAP_FIXED;
802 } else if (loc->elf_ex.e_type == ET_DYN) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700803 /* Try and get dynamic programs out of the way of the
804 * default mmap base, as well as whatever program they
805 * might try to exec. This is because the brk will
806 * follow the loader, and is not movable. */
David Daneye39f5602012-01-10 15:10:21 -0800807#ifdef CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE
Jiri Kosinaa3defbe2011-11-02 13:37:41 -0700808 /* Memory randomization might have been switched off
809 * in runtime via sysctl.
810 * If that is the case, retain the original non-zero
811 * load_bias value in order to establish proper
812 * non-randomized mappings.
813 */
814 if (current->flags & PF_RANDOMIZE)
815 load_bias = 0;
816 else
817 load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100818#else
Linus Torvalds90cb28e2007-01-06 13:28:21 -0800819 load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100820#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700821 }
822
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700823 error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt,
Andrew Mortonbb1ad822008-01-30 13:31:07 +0100824 elf_prot, elf_flags, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700825 if (BAD_ADDR(error)) {
826 send_sig(SIGKILL, current, 0);
Alexey Kuznetsovb140f2512007-05-08 00:31:57 -0700827 retval = IS_ERR((void *)error) ?
828 PTR_ERR((void*)error) : -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700829 goto out_free_dentry;
830 }
831
832 if (!load_addr_set) {
833 load_addr_set = 1;
834 load_addr = (elf_ppnt->p_vaddr - elf_ppnt->p_offset);
835 if (loc->elf_ex.e_type == ET_DYN) {
836 load_bias += error -
837 ELF_PAGESTART(load_bias + vaddr);
838 load_addr += load_bias;
839 reloc_func_desc = load_bias;
840 }
841 }
842 k = elf_ppnt->p_vaddr;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700843 if (k < start_code)
844 start_code = k;
845 if (start_data < k)
846 start_data = k;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700847
848 /*
849 * Check to see if the section's size will overflow the
850 * allowed task size. Note that p_filesz must always be
851 * <= p_memsz so it is only necessary to check p_memsz.
852 */
Chuck Ebbertce510592006-07-03 00:24:14 -0700853 if (BAD_ADDR(k) || elf_ppnt->p_filesz > elf_ppnt->p_memsz ||
Linus Torvalds1da177e2005-04-16 15:20:36 -0700854 elf_ppnt->p_memsz > TASK_SIZE ||
855 TASK_SIZE - elf_ppnt->p_memsz < k) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700856 /* set_brk can never work. Avoid overflows. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700857 send_sig(SIGKILL, current, 0);
Alexey Kuznetsovb140f2512007-05-08 00:31:57 -0700858 retval = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700859 goto out_free_dentry;
860 }
861
862 k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz;
863
864 if (k > elf_bss)
865 elf_bss = k;
866 if ((elf_ppnt->p_flags & PF_X) && end_code < k)
867 end_code = k;
868 if (end_data < k)
869 end_data = k;
870 k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz;
871 if (k > elf_brk)
872 elf_brk = k;
873 }
874
875 loc->elf_ex.e_entry += load_bias;
876 elf_bss += load_bias;
877 elf_brk += load_bias;
878 start_code += load_bias;
879 end_code += load_bias;
880 start_data += load_bias;
881 end_data += load_bias;
882
883 /* Calling set_brk effectively mmaps the pages that we need
884 * for the bss and break sections. We must do this before
885 * mapping in the interpreter, to make sure it doesn't wind
886 * up getting placed where the bss needs to go.
887 */
888 retval = set_brk(elf_bss, elf_brk);
889 if (retval) {
890 send_sig(SIGKILL, current, 0);
891 goto out_free_dentry;
892 }
akpm@osdl.org6de50512005-10-11 08:29:08 -0700893 if (likely(elf_bss != elf_brk) && unlikely(padzero(elf_bss))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700894 send_sig(SIGSEGV, current, 0);
895 retval = -EFAULT; /* Nobody gets to see this, but.. */
896 goto out_free_dentry;
897 }
898
899 if (elf_interpreter) {
Alan Cox6eec4822012-10-04 17:13:42 -0700900 unsigned long interp_map_addr = 0;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100901
Andi Kleend20894a2008-02-08 04:21:54 -0800902 elf_entry = load_elf_interp(&loc->interp_elf_ex,
903 interpreter,
904 &interp_map_addr,
905 load_bias);
906 if (!IS_ERR((void *)elf_entry)) {
907 /*
908 * load_elf_interp() returns relocation
909 * adjustment
910 */
911 interp_load_addr = elf_entry;
912 elf_entry += loc->interp_elf_ex.e_entry;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100913 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700914 if (BAD_ADDR(elf_entry)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700915 force_sig(SIGSEGV, current);
Chuck Ebbertce510592006-07-03 00:24:14 -0700916 retval = IS_ERR((void *)elf_entry) ?
917 (int)elf_entry : -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700918 goto out_free_dentry;
919 }
920 reloc_func_desc = interp_load_addr;
921
922 allow_write_access(interpreter);
923 fput(interpreter);
924 kfree(elf_interpreter);
925 } else {
926 elf_entry = loc->elf_ex.e_entry;
Suresh Siddha5342fba2006-02-26 04:18:28 +0100927 if (BAD_ADDR(elf_entry)) {
Chuck Ebbertce510592006-07-03 00:24:14 -0700928 force_sig(SIGSEGV, current);
929 retval = -EINVAL;
Suresh Siddha5342fba2006-02-26 04:18:28 +0100930 goto out_free_dentry;
931 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700932 }
933
934 kfree(elf_phdata);
935
Linus Torvalds1da177e2005-04-16 15:20:36 -0700936 set_binfmt(&elf_format);
937
Benjamin Herrenschmidt547ee842005-04-16 15:24:35 -0700938#ifdef ARCH_HAS_SETUP_ADDITIONAL_PAGES
Martin Schwidefskyfc5243d2008-12-25 13:38:35 +0100939 retval = arch_setup_additional_pages(bprm, !!elf_interpreter);
Benjamin Herrenschmidt547ee842005-04-16 15:24:35 -0700940 if (retval < 0) {
941 send_sig(SIGKILL, current, 0);
Roland McGrath18c8baff2005-04-28 15:17:19 -0700942 goto out;
Benjamin Herrenschmidt547ee842005-04-16 15:24:35 -0700943 }
944#endif /* ARCH_HAS_SETUP_ADDITIONAL_PAGES */
945
David Howellsa6f76f22008-11-14 10:39:24 +1100946 install_exec_creds(bprm);
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700947 retval = create_elf_tables(bprm, &loc->elf_ex,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700948 load_addr, interp_load_addr);
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700949 if (retval < 0) {
950 send_sig(SIGKILL, current, 0);
951 goto out;
952 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700953 /* N.B. passed_fileno might not be initialized? */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700954 current->mm->end_code = end_code;
955 current->mm->start_code = start_code;
956 current->mm->start_data = start_data;
957 current->mm->end_data = end_data;
958 current->mm->start_stack = bprm->p;
959
Jiri Kosinac1d171a2008-01-30 13:30:40 +0100960#ifdef arch_randomize_brk
Jiri Kosina4471a672011-04-14 15:22:09 -0700961 if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1)) {
Jiri Kosinac1d171a2008-01-30 13:30:40 +0100962 current->mm->brk = current->mm->start_brk =
963 arch_randomize_brk(current->mm);
Jiri Kosina4471a672011-04-14 15:22:09 -0700964#ifdef CONFIG_COMPAT_BRK
965 current->brk_randomized = 1;
966#endif
967 }
Jiri Kosinac1d171a2008-01-30 13:30:40 +0100968#endif
969
Linus Torvalds1da177e2005-04-16 15:20:36 -0700970 if (current->personality & MMAP_PAGE_ZERO) {
971 /* Why this, you ask??? Well SVr4 maps page 0 as read-only,
972 and some applications "depend" upon this behavior.
973 Since we do not have the power to recompile these, we
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700974 emulate the SVr4 behavior. Sigh. */
Linus Torvalds6be5ceb2012-04-20 17:13:58 -0700975 error = vm_mmap(NULL, 0, PAGE_SIZE, PROT_READ | PROT_EXEC,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700976 MAP_FIXED | MAP_PRIVATE, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700977 }
978
979#ifdef ELF_PLAT_INIT
980 /*
981 * The ABI may specify that certain registers be set up in special
982 * ways (on i386 %edx is the address of a DT_FINI function, for
983 * example. In addition, it may also specify (eg, PowerPC64 ELF)
984 * that the e_entry field is the address of the function descriptor
985 * for the startup routine, rather than the address of the startup
986 * routine itself. This macro performs whatever initialization to
987 * the regs structure is required as well as any relocations to the
988 * function descriptor entries when executing dynamically links apps.
989 */
990 ELF_PLAT_INIT(regs, reloc_func_desc);
991#endif
992
993 start_thread(regs, elf_entry, bprm->p);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700994 retval = 0;
995out:
996 kfree(loc);
997out_ret:
998 return retval;
999
1000 /* error cleanup */
1001out_free_dentry:
1002 allow_write_access(interpreter);
1003 if (interpreter)
1004 fput(interpreter);
1005out_free_interp:
Jesper Juhlf99d49a2005-11-07 01:01:34 -08001006 kfree(elf_interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001007out_free_ph:
1008 kfree(elf_phdata);
1009 goto out;
1010}
1011
1012/* This is really simpleminded and specialized - we are loading an
1013 a.out library that is given an ELF header. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001014static int load_elf_library(struct file *file)
1015{
1016 struct elf_phdr *elf_phdata;
1017 struct elf_phdr *eppnt;
1018 unsigned long elf_bss, bss, len;
1019 int retval, error, i, j;
1020 struct elfhdr elf_ex;
1021
1022 error = -ENOEXEC;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001023 retval = kernel_read(file, 0, (char *)&elf_ex, sizeof(elf_ex));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001024 if (retval != sizeof(elf_ex))
1025 goto out;
1026
1027 if (memcmp(elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
1028 goto out;
1029
1030 /* First of all, some simple consistency checks */
1031 if (elf_ex.e_type != ET_EXEC || elf_ex.e_phnum > 2 ||
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001032 !elf_check_arch(&elf_ex) || !file->f_op || !file->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001033 goto out;
1034
1035 /* Now read in all of the header information */
1036
1037 j = sizeof(struct elf_phdr) * elf_ex.e_phnum;
1038 /* j < ELF_MIN_ALIGN because elf_ex.e_phnum <= 2 */
1039
1040 error = -ENOMEM;
1041 elf_phdata = kmalloc(j, GFP_KERNEL);
1042 if (!elf_phdata)
1043 goto out;
1044
1045 eppnt = elf_phdata;
1046 error = -ENOEXEC;
1047 retval = kernel_read(file, elf_ex.e_phoff, (char *)eppnt, j);
1048 if (retval != j)
1049 goto out_free_ph;
1050
1051 for (j = 0, i = 0; i<elf_ex.e_phnum; i++)
1052 if ((eppnt + i)->p_type == PT_LOAD)
1053 j++;
1054 if (j != 1)
1055 goto out_free_ph;
1056
1057 while (eppnt->p_type != PT_LOAD)
1058 eppnt++;
1059
1060 /* Now use mmap to map the library into memory. */
Linus Torvalds6be5ceb2012-04-20 17:13:58 -07001061 error = vm_mmap(file,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001062 ELF_PAGESTART(eppnt->p_vaddr),
1063 (eppnt->p_filesz +
1064 ELF_PAGEOFFSET(eppnt->p_vaddr)),
1065 PROT_READ | PROT_WRITE | PROT_EXEC,
1066 MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE,
1067 (eppnt->p_offset -
1068 ELF_PAGEOFFSET(eppnt->p_vaddr)));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001069 if (error != ELF_PAGESTART(eppnt->p_vaddr))
1070 goto out_free_ph;
1071
1072 elf_bss = eppnt->p_vaddr + eppnt->p_filesz;
1073 if (padzero(elf_bss)) {
1074 error = -EFAULT;
1075 goto out_free_ph;
1076 }
1077
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001078 len = ELF_PAGESTART(eppnt->p_filesz + eppnt->p_vaddr +
1079 ELF_MIN_ALIGN - 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001080 bss = eppnt->p_memsz + eppnt->p_vaddr;
Linus Torvaldse4eb1ff2012-04-20 15:35:40 -07001081 if (bss > len)
1082 vm_brk(len, bss - len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001083 error = 0;
1084
1085out_free_ph:
1086 kfree(elf_phdata);
1087out:
1088 return error;
1089}
1090
Christoph Hellwig698ba7b2009-12-15 16:47:37 -08001091#ifdef CONFIG_ELF_CORE
Linus Torvalds1da177e2005-04-16 15:20:36 -07001092/*
1093 * ELF core dumper
1094 *
1095 * Modelled on fs/exec.c:aout_core_dump()
1096 * Jeremy Fitzhardinge <jeremy@sw.oz.au>
1097 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001098
1099/*
Jason Baron909af762012-03-23 15:02:51 -07001100 * The purpose of always_dump_vma() is to make sure that special kernel mappings
1101 * that are useful for post-mortem analysis are included in every core dump.
1102 * In that way we ensure that the core dump is fully interpretable later
1103 * without matching up the same kernel and hardware config to see what PC values
1104 * meant. These special mappings include - vDSO, vsyscall, and other
1105 * architecture specific mappings
1106 */
1107static bool always_dump_vma(struct vm_area_struct *vma)
1108{
1109 /* Any vsyscall mappings? */
1110 if (vma == get_gate_vma(vma->vm_mm))
1111 return true;
1112 /*
1113 * arch_vma_name() returns non-NULL for special architecture mappings,
1114 * such as vDSO sections.
1115 */
1116 if (arch_vma_name(vma))
1117 return true;
1118
1119 return false;
1120}
1121
1122/*
Roland McGrath82df3972007-10-16 23:27:02 -07001123 * Decide what to dump of a segment, part, all or none.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001124 */
Roland McGrath82df3972007-10-16 23:27:02 -07001125static unsigned long vma_dump_size(struct vm_area_struct *vma,
1126 unsigned long mm_flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001127{
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001128#define FILTER(type) (mm_flags & (1UL << MMF_DUMP_##type))
1129
Jason Baron909af762012-03-23 15:02:51 -07001130 /* always dump the vdso and vsyscall sections */
1131 if (always_dump_vma(vma))
Roland McGrath82df3972007-10-16 23:27:02 -07001132 goto whole;
Roland McGrathe5b97dd2007-01-26 00:56:48 -08001133
Konstantin Khlebnikov0103bd12012-10-08 16:28:59 -07001134 if (vma->vm_flags & VM_DONTDUMP)
Jason Baronaccb61f2012-03-23 15:02:51 -07001135 return 0;
1136
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001137 /* Hugetlb memory check */
1138 if (vma->vm_flags & VM_HUGETLB) {
1139 if ((vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_SHARED))
1140 goto whole;
1141 if (!(vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_PRIVATE))
1142 goto whole;
Naoya Horiguchi23d9e482013-04-17 15:58:28 -07001143 return 0;
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001144 }
1145
Linus Torvalds1da177e2005-04-16 15:20:36 -07001146 /* Do not dump I/O mapped devices or special mappings */
Konstantin Khlebnikov314e51b2012-10-08 16:29:02 -07001147 if (vma->vm_flags & VM_IO)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001148 return 0;
1149
Kawai, Hidehiroa1b59e82007-07-19 01:48:29 -07001150 /* By default, dump shared memory if mapped from an anonymous file. */
1151 if (vma->vm_flags & VM_SHARED) {
Al Viro496ad9a2013-01-23 17:07:38 -05001152 if (file_inode(vma->vm_file)->i_nlink == 0 ?
Roland McGrath82df3972007-10-16 23:27:02 -07001153 FILTER(ANON_SHARED) : FILTER(MAPPED_SHARED))
1154 goto whole;
1155 return 0;
Kawai, Hidehiroa1b59e82007-07-19 01:48:29 -07001156 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001157
Roland McGrath82df3972007-10-16 23:27:02 -07001158 /* Dump segments that have been written to. */
1159 if (vma->anon_vma && FILTER(ANON_PRIVATE))
1160 goto whole;
1161 if (vma->vm_file == NULL)
1162 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163
Roland McGrath82df3972007-10-16 23:27:02 -07001164 if (FILTER(MAPPED_PRIVATE))
1165 goto whole;
1166
1167 /*
1168 * If this looks like the beginning of a DSO or executable mapping,
1169 * check for an ELF header. If we find one, dump the first page to
1170 * aid in determining what was mapped here.
1171 */
Roland McGrath92dc07b2009-02-06 17:34:07 -08001172 if (FILTER(ELF_HEADERS) &&
1173 vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) {
Roland McGrath82df3972007-10-16 23:27:02 -07001174 u32 __user *header = (u32 __user *) vma->vm_start;
1175 u32 word;
Roland McGrath92dc07b2009-02-06 17:34:07 -08001176 mm_segment_t fs = get_fs();
Roland McGrath82df3972007-10-16 23:27:02 -07001177 /*
1178 * Doing it this way gets the constant folded by GCC.
1179 */
1180 union {
1181 u32 cmp;
1182 char elfmag[SELFMAG];
1183 } magic;
1184 BUILD_BUG_ON(SELFMAG != sizeof word);
1185 magic.elfmag[EI_MAG0] = ELFMAG0;
1186 magic.elfmag[EI_MAG1] = ELFMAG1;
1187 magic.elfmag[EI_MAG2] = ELFMAG2;
1188 magic.elfmag[EI_MAG3] = ELFMAG3;
Roland McGrath92dc07b2009-02-06 17:34:07 -08001189 /*
1190 * Switch to the user "segment" for get_user(),
1191 * then put back what elf_core_dump() had in place.
1192 */
1193 set_fs(USER_DS);
1194 if (unlikely(get_user(word, header)))
1195 word = 0;
1196 set_fs(fs);
1197 if (word == magic.cmp)
Roland McGrath82df3972007-10-16 23:27:02 -07001198 return PAGE_SIZE;
1199 }
1200
1201#undef FILTER
1202
1203 return 0;
1204
1205whole:
1206 return vma->vm_end - vma->vm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001207}
1208
Linus Torvalds1da177e2005-04-16 15:20:36 -07001209/* An ELF note in memory */
1210struct memelfnote
1211{
1212 const char *name;
1213 int type;
1214 unsigned int datasz;
1215 void *data;
1216};
1217
1218static int notesize(struct memelfnote *en)
1219{
1220 int sz;
1221
1222 sz = sizeof(struct elf_note);
1223 sz += roundup(strlen(en->name) + 1, 4);
1224 sz += roundup(en->datasz, 4);
1225
1226 return sz;
1227}
1228
Andi Kleend025c9d2006-09-30 23:29:28 -07001229#define DUMP_WRITE(addr, nr, foffset) \
1230 do { if (!dump_write(file, (addr), (nr))) return 0; *foffset += (nr); } while(0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001231
Andi Kleend025c9d2006-09-30 23:29:28 -07001232static int alignfile(struct file *file, loff_t *foffset)
1233{
Petr Vandroveca7a0d862006-10-13 18:42:07 +02001234 static const char buf[4] = { 0, };
Andi Kleend025c9d2006-09-30 23:29:28 -07001235 DUMP_WRITE(buf, roundup(*foffset, 4) - *foffset, foffset);
1236 return 1;
1237}
1238
1239static int writenote(struct memelfnote *men, struct file *file,
1240 loff_t *foffset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001241{
1242 struct elf_note en;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001243 en.n_namesz = strlen(men->name) + 1;
1244 en.n_descsz = men->datasz;
1245 en.n_type = men->type;
1246
Andi Kleend025c9d2006-09-30 23:29:28 -07001247 DUMP_WRITE(&en, sizeof(en), foffset);
1248 DUMP_WRITE(men->name, en.n_namesz, foffset);
1249 if (!alignfile(file, foffset))
1250 return 0;
1251 DUMP_WRITE(men->data, men->datasz, foffset);
1252 if (!alignfile(file, foffset))
1253 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001254
1255 return 1;
1256}
1257#undef DUMP_WRITE
Linus Torvalds1da177e2005-04-16 15:20:36 -07001258
Roland McGrath3aba4812008-01-30 13:31:44 +01001259static void fill_elf_header(struct elfhdr *elf, int segs,
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001260 u16 machine, u32 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001261{
Cyrill Gorcunov6970c8e2008-04-29 01:01:18 -07001262 memset(elf, 0, sizeof(*elf));
1263
Linus Torvalds1da177e2005-04-16 15:20:36 -07001264 memcpy(elf->e_ident, ELFMAG, SELFMAG);
1265 elf->e_ident[EI_CLASS] = ELF_CLASS;
1266 elf->e_ident[EI_DATA] = ELF_DATA;
1267 elf->e_ident[EI_VERSION] = EV_CURRENT;
1268 elf->e_ident[EI_OSABI] = ELF_OSABI;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001269
1270 elf->e_type = ET_CORE;
Roland McGrath3aba4812008-01-30 13:31:44 +01001271 elf->e_machine = machine;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001272 elf->e_version = EV_CURRENT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001273 elf->e_phoff = sizeof(struct elfhdr);
Roland McGrath3aba4812008-01-30 13:31:44 +01001274 elf->e_flags = flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001275 elf->e_ehsize = sizeof(struct elfhdr);
1276 elf->e_phentsize = sizeof(struct elf_phdr);
1277 elf->e_phnum = segs;
Cyrill Gorcunov6970c8e2008-04-29 01:01:18 -07001278
Linus Torvalds1da177e2005-04-16 15:20:36 -07001279 return;
1280}
1281
Andrew Morton8d6b5eee2006-09-25 23:32:04 -07001282static void fill_elf_note_phdr(struct elf_phdr *phdr, int sz, loff_t offset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001283{
1284 phdr->p_type = PT_NOTE;
1285 phdr->p_offset = offset;
1286 phdr->p_vaddr = 0;
1287 phdr->p_paddr = 0;
1288 phdr->p_filesz = sz;
1289 phdr->p_memsz = 0;
1290 phdr->p_flags = 0;
1291 phdr->p_align = 0;
1292 return;
1293}
1294
1295static void fill_note(struct memelfnote *note, const char *name, int type,
1296 unsigned int sz, void *data)
1297{
1298 note->name = name;
1299 note->type = type;
1300 note->datasz = sz;
1301 note->data = data;
1302 return;
1303}
1304
1305/*
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001306 * fill up all the fields in prstatus from the given task struct, except
1307 * registers which need to be filled up separately.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001308 */
1309static void fill_prstatus(struct elf_prstatus *prstatus,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001310 struct task_struct *p, long signr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001311{
1312 prstatus->pr_info.si_signo = prstatus->pr_cursig = signr;
1313 prstatus->pr_sigpend = p->pending.signal.sig[0];
1314 prstatus->pr_sighold = p->blocked.sig[0];
Oleg Nesterov3b34fc52009-06-17 16:27:38 -07001315 rcu_read_lock();
1316 prstatus->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1317 rcu_read_unlock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001318 prstatus->pr_pid = task_pid_vnr(p);
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001319 prstatus->pr_pgrp = task_pgrp_vnr(p);
1320 prstatus->pr_sid = task_session_vnr(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001321 if (thread_group_leader(p)) {
Frank Mayharf06febc2008-09-12 09:54:39 -07001322 struct task_cputime cputime;
1323
Linus Torvalds1da177e2005-04-16 15:20:36 -07001324 /*
Frank Mayharf06febc2008-09-12 09:54:39 -07001325 * This is the record for the group leader. It shows the
1326 * group-wide total, not its individual thread total.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001327 */
Frank Mayharf06febc2008-09-12 09:54:39 -07001328 thread_group_cputime(p, &cputime);
1329 cputime_to_timeval(cputime.utime, &prstatus->pr_utime);
1330 cputime_to_timeval(cputime.stime, &prstatus->pr_stime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001331 } else {
Frederic Weisbecker6fac4822012-11-13 14:20:55 +01001332 cputime_t utime, stime;
1333
1334 task_cputime(p, &utime, &stime);
1335 cputime_to_timeval(utime, &prstatus->pr_utime);
1336 cputime_to_timeval(stime, &prstatus->pr_stime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001337 }
1338 cputime_to_timeval(p->signal->cutime, &prstatus->pr_cutime);
1339 cputime_to_timeval(p->signal->cstime, &prstatus->pr_cstime);
1340}
1341
1342static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p,
1343 struct mm_struct *mm)
1344{
David Howellsc69e8d92008-11-14 10:39:19 +11001345 const struct cred *cred;
Greg Kroah-Hartmana84a5052005-05-11 00:10:44 -07001346 unsigned int i, len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001347
1348 /* first copy the parameters from user space */
1349 memset(psinfo, 0, sizeof(struct elf_prpsinfo));
1350
1351 len = mm->arg_end - mm->arg_start;
1352 if (len >= ELF_PRARGSZ)
1353 len = ELF_PRARGSZ-1;
1354 if (copy_from_user(&psinfo->pr_psargs,
1355 (const char __user *)mm->arg_start, len))
1356 return -EFAULT;
1357 for(i = 0; i < len; i++)
1358 if (psinfo->pr_psargs[i] == 0)
1359 psinfo->pr_psargs[i] = ' ';
1360 psinfo->pr_psargs[len] = 0;
1361
Oleg Nesterov3b34fc52009-06-17 16:27:38 -07001362 rcu_read_lock();
1363 psinfo->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1364 rcu_read_unlock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001365 psinfo->pr_pid = task_pid_vnr(p);
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001366 psinfo->pr_pgrp = task_pgrp_vnr(p);
1367 psinfo->pr_sid = task_session_vnr(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001368
1369 i = p->state ? ffz(~p->state) + 1 : 0;
1370 psinfo->pr_state = i;
Carsten Otte55148542006-03-25 03:08:22 -08001371 psinfo->pr_sname = (i > 5) ? '.' : "RSDTZW"[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001372 psinfo->pr_zomb = psinfo->pr_sname == 'Z';
1373 psinfo->pr_nice = task_nice(p);
1374 psinfo->pr_flag = p->flags;
David Howellsc69e8d92008-11-14 10:39:19 +11001375 rcu_read_lock();
1376 cred = __task_cred(p);
Eric W. Biedermanebc887b2012-02-07 18:36:10 -08001377 SET_UID(psinfo->pr_uid, from_kuid_munged(cred->user_ns, cred->uid));
1378 SET_GID(psinfo->pr_gid, from_kgid_munged(cred->user_ns, cred->gid));
David Howellsc69e8d92008-11-14 10:39:19 +11001379 rcu_read_unlock();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001380 strncpy(psinfo->pr_fname, p->comm, sizeof(psinfo->pr_fname));
1381
1382 return 0;
1383}
1384
Roland McGrath3aba4812008-01-30 13:31:44 +01001385static void fill_auxv_note(struct memelfnote *note, struct mm_struct *mm)
1386{
1387 elf_addr_t *auxv = (elf_addr_t *) mm->saved_auxv;
1388 int i = 0;
1389 do
1390 i += 2;
1391 while (auxv[i - 2] != AT_NULL);
1392 fill_note(note, "CORE", NT_AUXV, i * sizeof(elf_addr_t), auxv);
1393}
1394
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001395static void fill_siginfo_note(struct memelfnote *note, user_siginfo_t *csigdata,
1396 siginfo_t *siginfo)
1397{
1398 mm_segment_t old_fs = get_fs();
1399 set_fs(KERNEL_DS);
1400 copy_siginfo_to_user((user_siginfo_t __user *) csigdata, siginfo);
1401 set_fs(old_fs);
1402 fill_note(note, "CORE", NT_SIGINFO, sizeof(*csigdata), csigdata);
1403}
1404
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001405#define MAX_FILE_NOTE_SIZE (4*1024*1024)
1406/*
1407 * Format of NT_FILE note:
1408 *
1409 * long count -- how many files are mapped
1410 * long page_size -- units for file_ofs
1411 * array of [COUNT] elements of
1412 * long start
1413 * long end
1414 * long file_ofs
1415 * followed by COUNT filenames in ASCII: "FILE1" NUL "FILE2" NUL...
1416 */
1417static void fill_files_note(struct memelfnote *note)
1418{
1419 struct vm_area_struct *vma;
1420 unsigned count, size, names_ofs, remaining, n;
1421 user_long_t *data;
1422 user_long_t *start_end_ofs;
1423 char *name_base, *name_curpos;
1424
1425 /* *Estimated* file count and total data size needed */
1426 count = current->mm->map_count;
1427 size = count * 64;
1428
1429 names_ofs = (2 + 3 * count) * sizeof(data[0]);
1430 alloc:
1431 if (size >= MAX_FILE_NOTE_SIZE) /* paranoia check */
1432 goto err;
1433 size = round_up(size, PAGE_SIZE);
1434 data = vmalloc(size);
1435 if (!data)
1436 goto err;
1437
1438 start_end_ofs = data + 2;
1439 name_base = name_curpos = ((char *)data) + names_ofs;
1440 remaining = size - names_ofs;
1441 count = 0;
1442 for (vma = current->mm->mmap; vma != NULL; vma = vma->vm_next) {
1443 struct file *file;
1444 const char *filename;
1445
1446 file = vma->vm_file;
1447 if (!file)
1448 continue;
1449 filename = d_path(&file->f_path, name_curpos, remaining);
1450 if (IS_ERR(filename)) {
1451 if (PTR_ERR(filename) == -ENAMETOOLONG) {
1452 vfree(data);
1453 size = size * 5 / 4;
1454 goto alloc;
1455 }
1456 continue;
1457 }
1458
1459 /* d_path() fills at the end, move name down */
1460 /* n = strlen(filename) + 1: */
1461 n = (name_curpos + remaining) - filename;
1462 remaining = filename - name_curpos;
1463 memmove(name_curpos, filename, n);
1464 name_curpos += n;
1465
1466 *start_end_ofs++ = vma->vm_start;
1467 *start_end_ofs++ = vma->vm_end;
1468 *start_end_ofs++ = vma->vm_pgoff;
1469 count++;
1470 }
1471
1472 /* Now we know exact count of files, can store it */
1473 data[0] = count;
1474 data[1] = PAGE_SIZE;
1475 /*
1476 * Count usually is less than current->mm->map_count,
1477 * we need to move filenames down.
1478 */
1479 n = current->mm->map_count - count;
1480 if (n != 0) {
1481 unsigned shift_bytes = n * 3 * sizeof(data[0]);
1482 memmove(name_base - shift_bytes, name_base,
1483 name_curpos - name_base);
1484 name_curpos -= shift_bytes;
1485 }
1486
1487 size = name_curpos - (char *)data;
1488 fill_note(note, "CORE", NT_FILE, size, data);
1489 err: ;
1490}
1491
Roland McGrath4206d3a2008-01-30 13:31:45 +01001492#ifdef CORE_DUMP_USE_REGSET
1493#include <linux/regset.h>
1494
1495struct elf_thread_core_info {
1496 struct elf_thread_core_info *next;
1497 struct task_struct *task;
1498 struct elf_prstatus prstatus;
1499 struct memelfnote notes[0];
1500};
1501
1502struct elf_note_info {
1503 struct elf_thread_core_info *thread;
1504 struct memelfnote psinfo;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001505 struct memelfnote signote;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001506 struct memelfnote auxv;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001507 struct memelfnote files;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001508 user_siginfo_t csigdata;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001509 size_t size;
1510 int thread_notes;
1511};
1512
Roland McGrathd31472b2008-03-04 14:28:30 -08001513/*
1514 * When a regset has a writeback hook, we call it on each thread before
1515 * dumping user memory. On register window machines, this makes sure the
1516 * user memory backing the register data is up to date before we read it.
1517 */
1518static void do_thread_regset_writeback(struct task_struct *task,
1519 const struct user_regset *regset)
1520{
1521 if (regset->writeback)
1522 regset->writeback(task, regset, 1);
1523}
1524
H. J. Lu0953f65d2012-02-14 13:34:52 -08001525#ifndef PR_REG_SIZE
1526#define PR_REG_SIZE(S) sizeof(S)
1527#endif
1528
1529#ifndef PRSTATUS_SIZE
1530#define PRSTATUS_SIZE(S) sizeof(S)
1531#endif
1532
1533#ifndef PR_REG_PTR
1534#define PR_REG_PTR(S) (&((S)->pr_reg))
1535#endif
1536
1537#ifndef SET_PR_FPVALID
1538#define SET_PR_FPVALID(S, V) ((S)->pr_fpvalid = (V))
1539#endif
1540
Roland McGrath4206d3a2008-01-30 13:31:45 +01001541static int fill_thread_core_info(struct elf_thread_core_info *t,
1542 const struct user_regset_view *view,
1543 long signr, size_t *total)
1544{
1545 unsigned int i;
1546
1547 /*
1548 * NT_PRSTATUS is the one special case, because the regset data
1549 * goes into the pr_reg field inside the note contents, rather
1550 * than being the whole note contents. We fill the reset in here.
1551 * We assume that regset 0 is NT_PRSTATUS.
1552 */
1553 fill_prstatus(&t->prstatus, t->task, signr);
1554 (void) view->regsets[0].get(t->task, &view->regsets[0],
H. J. Lu0953f65d2012-02-14 13:34:52 -08001555 0, PR_REG_SIZE(t->prstatus.pr_reg),
1556 PR_REG_PTR(&t->prstatus), NULL);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001557
1558 fill_note(&t->notes[0], "CORE", NT_PRSTATUS,
H. J. Lu0953f65d2012-02-14 13:34:52 -08001559 PRSTATUS_SIZE(t->prstatus), &t->prstatus);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001560 *total += notesize(&t->notes[0]);
1561
Roland McGrathd31472b2008-03-04 14:28:30 -08001562 do_thread_regset_writeback(t->task, &view->regsets[0]);
1563
Roland McGrath4206d3a2008-01-30 13:31:45 +01001564 /*
1565 * Each other regset might generate a note too. For each regset
1566 * that has no core_note_type or is inactive, we leave t->notes[i]
1567 * all zero and we'll know to skip writing it later.
1568 */
1569 for (i = 1; i < view->n; ++i) {
1570 const struct user_regset *regset = &view->regsets[i];
Roland McGrathd31472b2008-03-04 14:28:30 -08001571 do_thread_regset_writeback(t->task, regset);
H. Peter Anvinc8e25252012-03-02 10:43:48 -08001572 if (regset->core_note_type && regset->get &&
Roland McGrath4206d3a2008-01-30 13:31:45 +01001573 (!regset->active || regset->active(t->task, regset))) {
1574 int ret;
1575 size_t size = regset->n * regset->size;
1576 void *data = kmalloc(size, GFP_KERNEL);
1577 if (unlikely(!data))
1578 return 0;
1579 ret = regset->get(t->task, regset,
1580 0, size, data, NULL);
1581 if (unlikely(ret))
1582 kfree(data);
1583 else {
1584 if (regset->core_note_type != NT_PRFPREG)
1585 fill_note(&t->notes[i], "LINUX",
1586 regset->core_note_type,
1587 size, data);
1588 else {
H. J. Lu0953f65d2012-02-14 13:34:52 -08001589 SET_PR_FPVALID(&t->prstatus, 1);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001590 fill_note(&t->notes[i], "CORE",
1591 NT_PRFPREG, size, data);
1592 }
1593 *total += notesize(&t->notes[i]);
1594 }
1595 }
1596 }
1597
1598 return 1;
1599}
1600
1601static int fill_note_info(struct elfhdr *elf, int phdrs,
1602 struct elf_note_info *info,
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07001603 siginfo_t *siginfo, struct pt_regs *regs)
Roland McGrath4206d3a2008-01-30 13:31:45 +01001604{
1605 struct task_struct *dump_task = current;
1606 const struct user_regset_view *view = task_user_regset_view(dump_task);
1607 struct elf_thread_core_info *t;
1608 struct elf_prpsinfo *psinfo;
Oleg Nesterov83914442008-07-25 01:47:45 -07001609 struct core_thread *ct;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001610 unsigned int i;
1611
1612 info->size = 0;
1613 info->thread = NULL;
1614
1615 psinfo = kmalloc(sizeof(*psinfo), GFP_KERNEL);
Alan Cox6899e922012-12-17 16:02:09 -08001616 if (psinfo == NULL) {
1617 info->psinfo.data = NULL; /* So we don't free this wrongly */
Roland McGrath4206d3a2008-01-30 13:31:45 +01001618 return 0;
Alan Cox6899e922012-12-17 16:02:09 -08001619 }
Roland McGrath4206d3a2008-01-30 13:31:45 +01001620
Amerigo Wange2dbe122009-07-01 01:06:26 -04001621 fill_note(&info->psinfo, "CORE", NT_PRPSINFO, sizeof(*psinfo), psinfo);
1622
Roland McGrath4206d3a2008-01-30 13:31:45 +01001623 /*
1624 * Figure out how many notes we're going to need for each thread.
1625 */
1626 info->thread_notes = 0;
1627 for (i = 0; i < view->n; ++i)
1628 if (view->regsets[i].core_note_type != 0)
1629 ++info->thread_notes;
1630
1631 /*
1632 * Sanity check. We rely on regset 0 being in NT_PRSTATUS,
1633 * since it is our one special case.
1634 */
1635 if (unlikely(info->thread_notes == 0) ||
1636 unlikely(view->regsets[0].core_note_type != NT_PRSTATUS)) {
1637 WARN_ON(1);
1638 return 0;
1639 }
1640
1641 /*
1642 * Initialize the ELF file header.
1643 */
1644 fill_elf_header(elf, phdrs,
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001645 view->e_machine, view->e_flags);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001646
1647 /*
1648 * Allocate a structure for each thread.
1649 */
Oleg Nesterov83914442008-07-25 01:47:45 -07001650 for (ct = &dump_task->mm->core_state->dumper; ct; ct = ct->next) {
1651 t = kzalloc(offsetof(struct elf_thread_core_info,
1652 notes[info->thread_notes]),
1653 GFP_KERNEL);
1654 if (unlikely(!t))
1655 return 0;
Oleg Nesterov24d52882008-07-25 01:47:40 -07001656
Oleg Nesterov83914442008-07-25 01:47:45 -07001657 t->task = ct->task;
1658 if (ct->task == dump_task || !info->thread) {
1659 t->next = info->thread;
1660 info->thread = t;
1661 } else {
1662 /*
1663 * Make sure to keep the original task at
1664 * the head of the list.
1665 */
1666 t->next = info->thread->next;
1667 info->thread->next = t;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001668 }
Oleg Nesterov83914442008-07-25 01:47:45 -07001669 }
Roland McGrath4206d3a2008-01-30 13:31:45 +01001670
1671 /*
1672 * Now fill in each thread's information.
1673 */
1674 for (t = info->thread; t != NULL; t = t->next)
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07001675 if (!fill_thread_core_info(t, view, siginfo->si_signo, &info->size))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001676 return 0;
1677
1678 /*
1679 * Fill in the two process-wide notes.
1680 */
1681 fill_psinfo(psinfo, dump_task->group_leader, dump_task->mm);
1682 info->size += notesize(&info->psinfo);
1683
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001684 fill_siginfo_note(&info->signote, &info->csigdata, siginfo);
1685 info->size += notesize(&info->signote);
1686
Roland McGrath4206d3a2008-01-30 13:31:45 +01001687 fill_auxv_note(&info->auxv, current->mm);
1688 info->size += notesize(&info->auxv);
1689
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001690 fill_files_note(&info->files);
1691 info->size += notesize(&info->files);
1692
Roland McGrath4206d3a2008-01-30 13:31:45 +01001693 return 1;
1694}
1695
1696static size_t get_note_info_size(struct elf_note_info *info)
1697{
1698 return info->size;
1699}
1700
1701/*
1702 * Write all the notes for each thread. When writing the first thread, the
1703 * process-wide notes are interleaved after the first thread-specific note.
1704 */
1705static int write_note_info(struct elf_note_info *info,
1706 struct file *file, loff_t *foffset)
1707{
1708 bool first = 1;
1709 struct elf_thread_core_info *t = info->thread;
1710
1711 do {
1712 int i;
1713
1714 if (!writenote(&t->notes[0], file, foffset))
1715 return 0;
1716
1717 if (first && !writenote(&info->psinfo, file, foffset))
1718 return 0;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001719 if (first && !writenote(&info->signote, file, foffset))
1720 return 0;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001721 if (first && !writenote(&info->auxv, file, foffset))
1722 return 0;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001723 if (first && !writenote(&info->files, file, foffset))
1724 return 0;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001725
1726 for (i = 1; i < info->thread_notes; ++i)
1727 if (t->notes[i].data &&
1728 !writenote(&t->notes[i], file, foffset))
1729 return 0;
1730
1731 first = 0;
1732 t = t->next;
1733 } while (t);
1734
1735 return 1;
1736}
1737
1738static void free_note_info(struct elf_note_info *info)
1739{
1740 struct elf_thread_core_info *threads = info->thread;
1741 while (threads) {
1742 unsigned int i;
1743 struct elf_thread_core_info *t = threads;
1744 threads = t->next;
1745 WARN_ON(t->notes[0].data && t->notes[0].data != &t->prstatus);
1746 for (i = 1; i < info->thread_notes; ++i)
1747 kfree(t->notes[i].data);
1748 kfree(t);
1749 }
1750 kfree(info->psinfo.data);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001751 vfree(info->files.data);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001752}
1753
1754#else
1755
Linus Torvalds1da177e2005-04-16 15:20:36 -07001756/* Here is the structure in which status of each thread is captured. */
1757struct elf_thread_status
1758{
1759 struct list_head list;
1760 struct elf_prstatus prstatus; /* NT_PRSTATUS */
1761 elf_fpregset_t fpu; /* NT_PRFPREG */
1762 struct task_struct *thread;
1763#ifdef ELF_CORE_COPY_XFPREGS
Mark Nelson5b20cd82007-10-16 23:25:39 -07001764 elf_fpxregset_t xfpu; /* ELF_CORE_XFPREG_TYPE */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001765#endif
1766 struct memelfnote notes[3];
1767 int num_notes;
1768};
1769
1770/*
1771 * In order to add the specific thread information for the elf file format,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001772 * we need to keep a linked list of every threads pr_status and then create
1773 * a single section for them in the final core file.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001774 */
1775static int elf_dump_thread_status(long signr, struct elf_thread_status *t)
1776{
1777 int sz = 0;
1778 struct task_struct *p = t->thread;
1779 t->num_notes = 0;
1780
1781 fill_prstatus(&t->prstatus, p, signr);
1782 elf_core_copy_task_regs(p, &t->prstatus.pr_reg);
1783
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001784 fill_note(&t->notes[0], "CORE", NT_PRSTATUS, sizeof(t->prstatus),
1785 &(t->prstatus));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001786 t->num_notes++;
1787 sz += notesize(&t->notes[0]);
1788
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001789 if ((t->prstatus.pr_fpvalid = elf_core_copy_task_fpregs(p, NULL,
1790 &t->fpu))) {
1791 fill_note(&t->notes[1], "CORE", NT_PRFPREG, sizeof(t->fpu),
1792 &(t->fpu));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001793 t->num_notes++;
1794 sz += notesize(&t->notes[1]);
1795 }
1796
1797#ifdef ELF_CORE_COPY_XFPREGS
1798 if (elf_core_copy_task_xfpregs(p, &t->xfpu)) {
Mark Nelson5b20cd82007-10-16 23:25:39 -07001799 fill_note(&t->notes[2], "LINUX", ELF_CORE_XFPREG_TYPE,
1800 sizeof(t->xfpu), &t->xfpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001801 t->num_notes++;
1802 sz += notesize(&t->notes[2]);
1803 }
1804#endif
1805 return sz;
1806}
1807
Roland McGrath3aba4812008-01-30 13:31:44 +01001808struct elf_note_info {
1809 struct memelfnote *notes;
1810 struct elf_prstatus *prstatus; /* NT_PRSTATUS */
1811 struct elf_prpsinfo *psinfo; /* NT_PRPSINFO */
1812 struct list_head thread_list;
1813 elf_fpregset_t *fpu;
1814#ifdef ELF_CORE_COPY_XFPREGS
1815 elf_fpxregset_t *xfpu;
1816#endif
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001817 user_siginfo_t csigdata;
Roland McGrath3aba4812008-01-30 13:31:44 +01001818 int thread_status_size;
1819 int numnote;
1820};
1821
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001822static int elf_note_info_init(struct elf_note_info *info)
Roland McGrath3aba4812008-01-30 13:31:44 +01001823{
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001824 memset(info, 0, sizeof(*info));
Roland McGrath3aba4812008-01-30 13:31:44 +01001825 INIT_LIST_HEAD(&info->thread_list);
1826
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001827 /* Allocate space for ELF notes */
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001828 info->notes = kmalloc(8 * sizeof(struct memelfnote), GFP_KERNEL);
Roland McGrath3aba4812008-01-30 13:31:44 +01001829 if (!info->notes)
1830 return 0;
1831 info->psinfo = kmalloc(sizeof(*info->psinfo), GFP_KERNEL);
1832 if (!info->psinfo)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10001833 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01001834 info->prstatus = kmalloc(sizeof(*info->prstatus), GFP_KERNEL);
1835 if (!info->prstatus)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10001836 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01001837 info->fpu = kmalloc(sizeof(*info->fpu), GFP_KERNEL);
1838 if (!info->fpu)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10001839 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01001840#ifdef ELF_CORE_COPY_XFPREGS
1841 info->xfpu = kmalloc(sizeof(*info->xfpu), GFP_KERNEL);
1842 if (!info->xfpu)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10001843 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01001844#endif
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001845 return 1;
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001846}
Roland McGrath3aba4812008-01-30 13:31:44 +01001847
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001848static int fill_note_info(struct elfhdr *elf, int phdrs,
1849 struct elf_note_info *info,
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07001850 siginfo_t *siginfo, struct pt_regs *regs)
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001851{
1852 struct list_head *t;
1853
1854 if (!elf_note_info_init(info))
1855 return 0;
1856
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07001857 if (siginfo->si_signo) {
Oleg Nesterov83914442008-07-25 01:47:45 -07001858 struct core_thread *ct;
WANG Cong4220b7f2008-04-29 01:01:18 -07001859 struct elf_thread_status *ets;
Oleg Nesterov24d52882008-07-25 01:47:40 -07001860
Oleg Nesterov83914442008-07-25 01:47:45 -07001861 for (ct = current->mm->core_state->dumper.next;
1862 ct; ct = ct->next) {
1863 ets = kzalloc(sizeof(*ets), GFP_KERNEL);
1864 if (!ets)
1865 return 0;
1866
1867 ets->thread = ct->task;
1868 list_add(&ets->list, &info->thread_list);
1869 }
1870
Roland McGrath3aba4812008-01-30 13:31:44 +01001871 list_for_each(t, &info->thread_list) {
Roland McGrath3aba4812008-01-30 13:31:44 +01001872 int sz;
1873
WANG Cong4220b7f2008-04-29 01:01:18 -07001874 ets = list_entry(t, struct elf_thread_status, list);
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07001875 sz = elf_dump_thread_status(siginfo->si_signo, ets);
Roland McGrath3aba4812008-01-30 13:31:44 +01001876 info->thread_status_size += sz;
1877 }
1878 }
1879 /* now collect the dump for the current */
1880 memset(info->prstatus, 0, sizeof(*info->prstatus));
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07001881 fill_prstatus(info->prstatus, current, siginfo->si_signo);
Roland McGrath3aba4812008-01-30 13:31:44 +01001882 elf_core_copy_regs(&info->prstatus->pr_reg, regs);
1883
1884 /* Set up header */
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001885 fill_elf_header(elf, phdrs, ELF_ARCH, ELF_CORE_EFLAGS);
Roland McGrath3aba4812008-01-30 13:31:44 +01001886
1887 /*
1888 * Set up the notes in similar form to SVR4 core dumps made
1889 * with info from their /proc.
1890 */
1891
1892 fill_note(info->notes + 0, "CORE", NT_PRSTATUS,
1893 sizeof(*info->prstatus), info->prstatus);
1894 fill_psinfo(info->psinfo, current->group_leader, current->mm);
1895 fill_note(info->notes + 1, "CORE", NT_PRPSINFO,
1896 sizeof(*info->psinfo), info->psinfo);
1897
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001898 fill_siginfo_note(info->notes + 2, &info->csigdata, siginfo);
1899 fill_auxv_note(info->notes + 3, current->mm);
1900 fill_files_note(info->notes + 4);
Roland McGrath3aba4812008-01-30 13:31:44 +01001901
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001902 info->numnote = 5;
Roland McGrath3aba4812008-01-30 13:31:44 +01001903
1904 /* Try to dump the FPU. */
1905 info->prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, regs,
1906 info->fpu);
1907 if (info->prstatus->pr_fpvalid)
1908 fill_note(info->notes + info->numnote++,
1909 "CORE", NT_PRFPREG, sizeof(*info->fpu), info->fpu);
1910#ifdef ELF_CORE_COPY_XFPREGS
1911 if (elf_core_copy_task_xfpregs(current, info->xfpu))
1912 fill_note(info->notes + info->numnote++,
1913 "LINUX", ELF_CORE_XFPREG_TYPE,
1914 sizeof(*info->xfpu), info->xfpu);
1915#endif
1916
1917 return 1;
Roland McGrath3aba4812008-01-30 13:31:44 +01001918}
1919
1920static size_t get_note_info_size(struct elf_note_info *info)
1921{
1922 int sz = 0;
1923 int i;
1924
1925 for (i = 0; i < info->numnote; i++)
1926 sz += notesize(info->notes + i);
1927
1928 sz += info->thread_status_size;
1929
1930 return sz;
1931}
1932
1933static int write_note_info(struct elf_note_info *info,
1934 struct file *file, loff_t *foffset)
1935{
1936 int i;
1937 struct list_head *t;
1938
1939 for (i = 0; i < info->numnote; i++)
1940 if (!writenote(info->notes + i, file, foffset))
1941 return 0;
1942
1943 /* write out the thread status notes section */
1944 list_for_each(t, &info->thread_list) {
1945 struct elf_thread_status *tmp =
1946 list_entry(t, struct elf_thread_status, list);
1947
1948 for (i = 0; i < tmp->num_notes; i++)
1949 if (!writenote(&tmp->notes[i], file, foffset))
1950 return 0;
1951 }
1952
1953 return 1;
1954}
1955
1956static void free_note_info(struct elf_note_info *info)
1957{
1958 while (!list_empty(&info->thread_list)) {
1959 struct list_head *tmp = info->thread_list.next;
1960 list_del(tmp);
1961 kfree(list_entry(tmp, struct elf_thread_status, list));
1962 }
1963
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001964 /* Free data allocated by fill_files_note(): */
1965 vfree(info->notes[4].data);
1966
Roland McGrath3aba4812008-01-30 13:31:44 +01001967 kfree(info->prstatus);
1968 kfree(info->psinfo);
1969 kfree(info->notes);
1970 kfree(info->fpu);
1971#ifdef ELF_CORE_COPY_XFPREGS
1972 kfree(info->xfpu);
1973#endif
1974}
1975
Roland McGrath4206d3a2008-01-30 13:31:45 +01001976#endif
1977
Roland McGrathf47aef52007-01-26 00:56:49 -08001978static struct vm_area_struct *first_vma(struct task_struct *tsk,
1979 struct vm_area_struct *gate_vma)
1980{
1981 struct vm_area_struct *ret = tsk->mm->mmap;
1982
1983 if (ret)
1984 return ret;
1985 return gate_vma;
1986}
1987/*
1988 * Helper function for iterating across a vma list. It ensures that the caller
1989 * will visit `gate_vma' prior to terminating the search.
1990 */
1991static struct vm_area_struct *next_vma(struct vm_area_struct *this_vma,
1992 struct vm_area_struct *gate_vma)
1993{
1994 struct vm_area_struct *ret;
1995
1996 ret = this_vma->vm_next;
1997 if (ret)
1998 return ret;
1999 if (this_vma == gate_vma)
2000 return NULL;
2001 return gate_vma;
2002}
2003
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002004static void fill_extnum_info(struct elfhdr *elf, struct elf_shdr *shdr4extnum,
2005 elf_addr_t e_shoff, int segs)
2006{
2007 elf->e_shoff = e_shoff;
2008 elf->e_shentsize = sizeof(*shdr4extnum);
2009 elf->e_shnum = 1;
2010 elf->e_shstrndx = SHN_UNDEF;
2011
2012 memset(shdr4extnum, 0, sizeof(*shdr4extnum));
2013
2014 shdr4extnum->sh_type = SHT_NULL;
2015 shdr4extnum->sh_size = elf->e_shnum;
2016 shdr4extnum->sh_link = elf->e_shstrndx;
2017 shdr4extnum->sh_info = segs;
2018}
2019
2020static size_t elf_core_vma_data_size(struct vm_area_struct *gate_vma,
2021 unsigned long mm_flags)
2022{
2023 struct vm_area_struct *vma;
2024 size_t size = 0;
2025
2026 for (vma = first_vma(current, gate_vma); vma != NULL;
2027 vma = next_vma(vma, gate_vma))
2028 size += vma_dump_size(vma, mm_flags);
2029 return size;
2030}
2031
Linus Torvalds1da177e2005-04-16 15:20:36 -07002032/*
2033 * Actual dumper
2034 *
2035 * This is a two-pass process; first we find the offsets of the bits,
2036 * and then they are actually written out. If we run out of core limit
2037 * we just truncate.
2038 */
Masami Hiramatsuf6151df2009-12-17 15:27:16 -08002039static int elf_core_dump(struct coredump_params *cprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002040{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002041 int has_dumped = 0;
2042 mm_segment_t fs;
2043 int segs;
2044 size_t size = 0;
Roland McGrathf47aef52007-01-26 00:56:49 -08002045 struct vm_area_struct *vma, *gate_vma;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002046 struct elfhdr *elf = NULL;
Andi Kleend025c9d2006-09-30 23:29:28 -07002047 loff_t offset = 0, dataoff, foffset;
Roland McGrath3aba4812008-01-30 13:31:44 +01002048 struct elf_note_info info;
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002049 struct elf_phdr *phdr4note = NULL;
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002050 struct elf_shdr *shdr4extnum = NULL;
2051 Elf_Half e_phnum;
2052 elf_addr_t e_shoff;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002053
2054 /*
2055 * We no longer stop all VM operations.
2056 *
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002057 * This is because those proceses that could possibly change map_count
2058 * or the mmap / vma pages are now blocked in do_exit on current
2059 * finishing this core dump.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002060 *
2061 * Only ptrace can touch these memory addresses, but it doesn't change
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002062 * the map_count or the pages allocated. So no possibility of crashing
Linus Torvalds1da177e2005-04-16 15:20:36 -07002063 * exists while dumping the mm->vm_next areas to the core file.
2064 */
2065
2066 /* alloc memory for large data structures: too large to be on stack */
2067 elf = kmalloc(sizeof(*elf), GFP_KERNEL);
2068 if (!elf)
WANG Cong5f719552008-05-06 12:45:35 +08002069 goto out;
KAMEZAWA Hiroyuki341c87b2009-06-30 11:41:23 -07002070 /*
2071 * The number of segs are recored into ELF header as 16bit value.
2072 * Please check DEFAULT_MAX_MAP_COUNT definition when you modify here.
2073 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002074 segs = current->mm->map_count;
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002075 segs += elf_core_extra_phdrs();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002076
Stephen Wilson31db58b2011-03-13 15:49:15 -04002077 gate_vma = get_gate_vma(current->mm);
Roland McGrathf47aef52007-01-26 00:56:49 -08002078 if (gate_vma != NULL)
2079 segs++;
2080
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002081 /* for notes section */
2082 segs++;
2083
2084 /* If segs > PN_XNUM(0xffff), then e_phnum overflows. To avoid
2085 * this, kernel supports extended numbering. Have a look at
2086 * include/linux/elf.h for further information. */
2087 e_phnum = segs > PN_XNUM ? PN_XNUM : segs;
2088
Roland McGrath3aba4812008-01-30 13:31:44 +01002089 /*
2090 * Collect all the non-memory information about the process for the
2091 * notes. This also sets up the file header.
2092 */
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07002093 if (!fill_note_info(elf, e_phnum, &info, cprm->siginfo, cprm->regs))
Roland McGrath3aba4812008-01-30 13:31:44 +01002094 goto cleanup;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002095
2096 has_dumped = 1;
2097 current->flags |= PF_DUMPCORE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002098
2099 fs = get_fs();
2100 set_fs(KERNEL_DS);
2101
Linus Torvalds1da177e2005-04-16 15:20:36 -07002102 offset += sizeof(*elf); /* Elf header */
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002103 offset += segs * sizeof(struct elf_phdr); /* Program headers */
Petr Vandroveca7a0d862006-10-13 18:42:07 +02002104 foffset = offset;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002105
2106 /* Write notes phdr entry */
2107 {
Roland McGrath3aba4812008-01-30 13:31:44 +01002108 size_t sz = get_note_info_size(&info);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002109
Michael Ellermane5501492007-09-19 14:38:12 +10002110 sz += elf_coredump_extra_notes_size();
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +01002111
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002112 phdr4note = kmalloc(sizeof(*phdr4note), GFP_KERNEL);
2113 if (!phdr4note)
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -08002114 goto end_coredump;
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002115
2116 fill_elf_note_phdr(phdr4note, sz, offset);
2117 offset += sz;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002118 }
2119
Linus Torvalds1da177e2005-04-16 15:20:36 -07002120 dataoff = offset = roundup(offset, ELF_EXEC_PAGESIZE);
2121
Masami Hiramatsu30736a42010-03-05 13:44:12 -08002122 offset += elf_core_vma_data_size(gate_vma, cprm->mm_flags);
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002123 offset += elf_core_extra_data_size();
2124 e_shoff = offset;
2125
2126 if (e_phnum == PN_XNUM) {
2127 shdr4extnum = kmalloc(sizeof(*shdr4extnum), GFP_KERNEL);
2128 if (!shdr4extnum)
2129 goto end_coredump;
2130 fill_extnum_info(elf, shdr4extnum, e_shoff, segs);
2131 }
2132
2133 offset = dataoff;
2134
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002135 size += sizeof(*elf);
2136 if (size > cprm->limit || !dump_write(cprm->file, elf, sizeof(*elf)))
2137 goto end_coredump;
2138
2139 size += sizeof(*phdr4note);
2140 if (size > cprm->limit
2141 || !dump_write(cprm->file, phdr4note, sizeof(*phdr4note)))
2142 goto end_coredump;
2143
Linus Torvalds1da177e2005-04-16 15:20:36 -07002144 /* Write program headers for segments dump */
Roland McGrathf47aef52007-01-26 00:56:49 -08002145 for (vma = first_vma(current, gate_vma); vma != NULL;
2146 vma = next_vma(vma, gate_vma)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002147 struct elf_phdr phdr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002148
2149 phdr.p_type = PT_LOAD;
2150 phdr.p_offset = offset;
2151 phdr.p_vaddr = vma->vm_start;
2152 phdr.p_paddr = 0;
Masami Hiramatsu30736a42010-03-05 13:44:12 -08002153 phdr.p_filesz = vma_dump_size(vma, cprm->mm_flags);
Roland McGrath82df3972007-10-16 23:27:02 -07002154 phdr.p_memsz = vma->vm_end - vma->vm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002155 offset += phdr.p_filesz;
2156 phdr.p_flags = vma->vm_flags & VM_READ ? PF_R : 0;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002157 if (vma->vm_flags & VM_WRITE)
2158 phdr.p_flags |= PF_W;
2159 if (vma->vm_flags & VM_EXEC)
2160 phdr.p_flags |= PF_X;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002161 phdr.p_align = ELF_EXEC_PAGESIZE;
2162
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -08002163 size += sizeof(phdr);
2164 if (size > cprm->limit
2165 || !dump_write(cprm->file, &phdr, sizeof(phdr)))
2166 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002167 }
2168
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002169 if (!elf_core_write_extra_phdrs(cprm->file, offset, &size, cprm->limit))
2170 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002171
2172 /* write out the notes section */
Masami Hiramatsuf6151df2009-12-17 15:27:16 -08002173 if (!write_note_info(&info, cprm->file, &foffset))
Roland McGrath3aba4812008-01-30 13:31:44 +01002174 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002175
Masami Hiramatsuf6151df2009-12-17 15:27:16 -08002176 if (elf_coredump_extra_notes_write(cprm->file, &foffset))
Michael Ellermane5501492007-09-19 14:38:12 +10002177 goto end_coredump;
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +01002178
Andi Kleend025c9d2006-09-30 23:29:28 -07002179 /* Align to page */
Masami Hiramatsuf6151df2009-12-17 15:27:16 -08002180 if (!dump_seek(cprm->file, dataoff - foffset))
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002181 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002182
Roland McGrathf47aef52007-01-26 00:56:49 -08002183 for (vma = first_vma(current, gate_vma); vma != NULL;
2184 vma = next_vma(vma, gate_vma)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002185 unsigned long addr;
Roland McGrath82df3972007-10-16 23:27:02 -07002186 unsigned long end;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002187
Masami Hiramatsu30736a42010-03-05 13:44:12 -08002188 end = vma->vm_start + vma_dump_size(vma, cprm->mm_flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002189
Roland McGrath82df3972007-10-16 23:27:02 -07002190 for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002191 struct page *page;
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002192 int stop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002193
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002194 page = get_dump_page(addr);
2195 if (page) {
2196 void *kaddr = kmap(page);
Masami Hiramatsuf6151df2009-12-17 15:27:16 -08002197 stop = ((size += PAGE_SIZE) > cprm->limit) ||
2198 !dump_write(cprm->file, kaddr,
2199 PAGE_SIZE);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002200 kunmap(page);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002201 page_cache_release(page);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002202 } else
Masami Hiramatsuf6151df2009-12-17 15:27:16 -08002203 stop = !dump_seek(cprm->file, PAGE_SIZE);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002204 if (stop)
2205 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002206 }
2207 }
2208
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002209 if (!elf_core_write_extra_data(cprm->file, &size, cprm->limit))
2210 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002211
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002212 if (e_phnum == PN_XNUM) {
2213 size += sizeof(*shdr4extnum);
2214 if (size > cprm->limit
2215 || !dump_write(cprm->file, shdr4extnum,
2216 sizeof(*shdr4extnum)))
2217 goto end_coredump;
2218 }
2219
Linus Torvalds1da177e2005-04-16 15:20:36 -07002220end_coredump:
2221 set_fs(fs);
2222
2223cleanup:
Roland McGrath3aba4812008-01-30 13:31:44 +01002224 free_note_info(&info);
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002225 kfree(shdr4extnum);
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002226 kfree(phdr4note);
WANG Cong5f719552008-05-06 12:45:35 +08002227 kfree(elf);
2228out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002229 return has_dumped;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002230}
2231
Christoph Hellwig698ba7b2009-12-15 16:47:37 -08002232#endif /* CONFIG_ELF_CORE */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002233
2234static int __init init_elf_binfmt(void)
2235{
Al Viro8fc3dc52012-03-17 03:05:16 -04002236 register_binfmt(&elf_format);
2237 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002238}
2239
2240static void __exit exit_elf_binfmt(void)
2241{
2242 /* Remove the COFF and ELF loaders. */
2243 unregister_binfmt(&elf_format);
2244}
2245
2246core_initcall(init_elf_binfmt);
2247module_exit(exit_elf_binfmt);
2248MODULE_LICENSE("GPL");