blob: f010d6c8dd14af48be83c1d13bffdde1bf628294 [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>
Kees Cookd1fd8362015-04-14 15:48:07 -070034#include <linux/elf-randomize.h>
Alexey Dobriyan7e80d0d2007-05-08 00:28:59 -070035#include <linux/utsname.h>
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -080036#include <linux/coredump.h>
Frederic Weisbecker6fac4822012-11-13 14:20:55 +010037#include <linux/sched.h>
Ross Zwisler50378352015-10-05 16:33:36 -060038#include <linux/dax.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070039#include <asm/uaccess.h>
40#include <asm/param.h>
41#include <asm/page.h>
42
Denys Vlasenko2aa362c2012-10-04 17:15:36 -070043#ifndef user_long_t
44#define user_long_t long
45#endif
Denys Vlasenko49ae4d42012-10-04 17:15:35 -070046#ifndef user_siginfo_t
47#define user_siginfo_t siginfo_t
48#endif
49
Al Viro71613c32012-10-20 22:00:48 -040050static int load_elf_binary(struct linux_binprm *bprm);
Andrew Mortonbb1ad822008-01-30 13:31:07 +010051static unsigned long elf_map(struct file *, unsigned long, struct elf_phdr *,
52 int, int, unsigned long);
Linus Torvalds1da177e2005-04-16 15:20:36 -070053
Josh Triplett69369a72014-04-03 14:48:27 -070054#ifdef CONFIG_USELIB
55static int load_elf_library(struct file *);
56#else
57#define load_elf_library NULL
58#endif
59
Linus Torvalds1da177e2005-04-16 15:20:36 -070060/*
61 * If we don't support core dumping, then supply a NULL so we
62 * don't even try.
63 */
Christoph Hellwig698ba7b2009-12-15 16:47:37 -080064#ifdef CONFIG_ELF_CORE
Masami Hiramatsuf6151df2009-12-17 15:27:16 -080065static int elf_core_dump(struct coredump_params *cprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -070066#else
67#define elf_core_dump NULL
68#endif
69
70#if ELF_EXEC_PAGESIZE > PAGE_SIZE
Jesper Juhlf4e5cc22006-06-23 02:05:35 -070071#define ELF_MIN_ALIGN ELF_EXEC_PAGESIZE
Linus Torvalds1da177e2005-04-16 15:20:36 -070072#else
Jesper Juhlf4e5cc22006-06-23 02:05:35 -070073#define ELF_MIN_ALIGN PAGE_SIZE
Linus Torvalds1da177e2005-04-16 15:20:36 -070074#endif
75
76#ifndef ELF_CORE_EFLAGS
77#define ELF_CORE_EFLAGS 0
78#endif
79
80#define ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(ELF_MIN_ALIGN-1))
81#define ELF_PAGEOFFSET(_v) ((_v) & (ELF_MIN_ALIGN-1))
82#define ELF_PAGEALIGN(_v) (((_v) + ELF_MIN_ALIGN - 1) & ~(ELF_MIN_ALIGN - 1))
83
84static struct linux_binfmt elf_format = {
Mikael Petterssonf670d0e2011-01-12 17:00:02 -080085 .module = THIS_MODULE,
86 .load_binary = load_elf_binary,
87 .load_shlib = load_elf_library,
88 .core_dump = elf_core_dump,
89 .min_coredump = ELF_EXEC_PAGESIZE,
Linus Torvalds1da177e2005-04-16 15:20:36 -070090};
91
Andrew Mortond4e3cc32007-07-21 04:37:32 -070092#define BAD_ADDR(x) ((unsigned long)(x) >= TASK_SIZE)
Linus Torvalds1da177e2005-04-16 15:20:36 -070093
94static int set_brk(unsigned long start, unsigned long end)
95{
96 start = ELF_PAGEALIGN(start);
97 end = ELF_PAGEALIGN(end);
98 if (end > start) {
99 unsigned long addr;
Linus Torvaldse4eb1ff2012-04-20 15:35:40 -0700100 addr = vm_brk(start, end - start);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700101 if (BAD_ADDR(addr))
102 return addr;
103 }
104 current->mm->start_brk = current->mm->brk = end;
105 return 0;
106}
107
Linus Torvalds1da177e2005-04-16 15:20:36 -0700108/* We need to explicitly zero any fractional pages
109 after the data section (i.e. bss). This would
110 contain the junk from the file that should not
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700111 be in memory
112 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700113static int padzero(unsigned long elf_bss)
114{
115 unsigned long nbyte;
116
117 nbyte = ELF_PAGEOFFSET(elf_bss);
118 if (nbyte) {
119 nbyte = ELF_MIN_ALIGN - nbyte;
120 if (clear_user((void __user *) elf_bss, nbyte))
121 return -EFAULT;
122 }
123 return 0;
124}
125
Ohad Ben-Cohen09c6dd32008-02-03 18:05:15 +0200126/* Let's use some macros to make this stack manipulation a little clearer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700127#ifdef CONFIG_STACK_GROWSUP
128#define STACK_ADD(sp, items) ((elf_addr_t __user *)(sp) + (items))
129#define STACK_ROUND(sp, items) \
130 ((15 + (unsigned long) ((sp) + (items))) &~ 15UL)
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700131#define STACK_ALLOC(sp, len) ({ \
132 elf_addr_t __user *old_sp = (elf_addr_t __user *)sp; sp += len; \
133 old_sp; })
Linus Torvalds1da177e2005-04-16 15:20:36 -0700134#else
135#define STACK_ADD(sp, items) ((elf_addr_t __user *)(sp) - (items))
136#define STACK_ROUND(sp, items) \
137 (((unsigned long) (sp - items)) &~ 15UL)
138#define STACK_ALLOC(sp, len) ({ sp -= len ; sp; })
139#endif
140
Nathan Lynch483fad12008-07-22 04:48:46 +1000141#ifndef ELF_BASE_PLATFORM
142/*
143 * AT_BASE_PLATFORM indicates the "real" hardware/microarchitecture.
144 * If the arch defines ELF_BASE_PLATFORM (in asm/elf.h), the value
145 * will be copied to the user stack in the same manner as AT_PLATFORM.
146 */
147#define ELF_BASE_PLATFORM NULL
148#endif
149
Linus Torvalds1da177e2005-04-16 15:20:36 -0700150static int
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700151create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec,
Andi Kleend20894a2008-02-08 04:21:54 -0800152 unsigned long load_addr, unsigned long interp_load_addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700153{
154 unsigned long p = bprm->p;
155 int argc = bprm->argc;
156 int envc = bprm->envc;
157 elf_addr_t __user *argv;
158 elf_addr_t __user *envp;
159 elf_addr_t __user *sp;
160 elf_addr_t __user *u_platform;
Nathan Lynch483fad12008-07-22 04:48:46 +1000161 elf_addr_t __user *u_base_platform;
Kees Cookf06295b2009-01-07 18:08:52 -0800162 elf_addr_t __user *u_rand_bytes;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700163 const char *k_platform = ELF_PLATFORM;
Nathan Lynch483fad12008-07-22 04:48:46 +1000164 const char *k_base_platform = ELF_BASE_PLATFORM;
Kees Cookf06295b2009-01-07 18:08:52 -0800165 unsigned char k_rand_bytes[16];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700166 int items;
167 elf_addr_t *elf_info;
168 int ei_index = 0;
David Howells86a264a2008-11-14 10:39:18 +1100169 const struct cred *cred = current_cred();
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700170 struct vm_area_struct *vma;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700171
172 /*
Franck Bui-Huud68c9d62007-10-16 23:30:24 -0700173 * In some cases (e.g. Hyper-Threading), we want to avoid L1
174 * evictions by the processes running on the same package. One
175 * thing we can do is to shuffle the initial stack for them.
176 */
177
178 p = arch_align_stack(p);
179
180 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700181 * If this architecture has a platform capability string, copy it
182 * to userspace. In some cases (Sparc), this info is impossible
183 * for userspace to get any other way, in others (i386) it is
184 * merely difficult.
185 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700186 u_platform = NULL;
187 if (k_platform) {
188 size_t len = strlen(k_platform) + 1;
189
Linus Torvalds1da177e2005-04-16 15:20:36 -0700190 u_platform = (elf_addr_t __user *)STACK_ALLOC(p, len);
191 if (__copy_to_user(u_platform, k_platform, len))
192 return -EFAULT;
193 }
194
Nathan Lynch483fad12008-07-22 04:48:46 +1000195 /*
196 * If this architecture has a "base" platform capability
197 * string, copy it to userspace.
198 */
199 u_base_platform = NULL;
200 if (k_base_platform) {
201 size_t len = strlen(k_base_platform) + 1;
202
203 u_base_platform = (elf_addr_t __user *)STACK_ALLOC(p, len);
204 if (__copy_to_user(u_base_platform, k_base_platform, len))
205 return -EFAULT;
206 }
207
Kees Cookf06295b2009-01-07 18:08:52 -0800208 /*
209 * Generate 16 random bytes for userspace PRNG seeding.
210 */
211 get_random_bytes(k_rand_bytes, sizeof(k_rand_bytes));
212 u_rand_bytes = (elf_addr_t __user *)
213 STACK_ALLOC(p, sizeof(k_rand_bytes));
214 if (__copy_to_user(u_rand_bytes, k_rand_bytes, sizeof(k_rand_bytes)))
215 return -EFAULT;
216
Linus Torvalds1da177e2005-04-16 15:20:36 -0700217 /* Create the ELF interpreter info */
Jesper Juhl785d5572006-06-23 02:05:35 -0700218 elf_info = (elf_addr_t *)current->mm->saved_auxv;
Olaf Hering4f9a58d2007-10-16 23:30:12 -0700219 /* update AT_VECTOR_SIZE_BASE if the number of NEW_AUX_ENT() changes */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700220#define NEW_AUX_ENT(id, val) \
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700221 do { \
Jesper Juhl785d5572006-06-23 02:05:35 -0700222 elf_info[ei_index++] = id; \
223 elf_info[ei_index++] = val; \
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700224 } while (0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700225
226#ifdef ARCH_DLINFO
227 /*
228 * ARCH_DLINFO must come first so PPC can do its special alignment of
229 * AUXV.
Olaf Hering4f9a58d2007-10-16 23:30:12 -0700230 * update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT() in
231 * ARCH_DLINFO changes
Linus Torvalds1da177e2005-04-16 15:20:36 -0700232 */
233 ARCH_DLINFO;
234#endif
235 NEW_AUX_ENT(AT_HWCAP, ELF_HWCAP);
236 NEW_AUX_ENT(AT_PAGESZ, ELF_EXEC_PAGESIZE);
237 NEW_AUX_ENT(AT_CLKTCK, CLOCKS_PER_SEC);
238 NEW_AUX_ENT(AT_PHDR, load_addr + exec->e_phoff);
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700239 NEW_AUX_ENT(AT_PHENT, sizeof(struct elf_phdr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700240 NEW_AUX_ENT(AT_PHNUM, exec->e_phnum);
241 NEW_AUX_ENT(AT_BASE, interp_load_addr);
242 NEW_AUX_ENT(AT_FLAGS, 0);
243 NEW_AUX_ENT(AT_ENTRY, exec->e_entry);
Eric W. Biedermanebc887b2012-02-07 18:36:10 -0800244 NEW_AUX_ENT(AT_UID, from_kuid_munged(cred->user_ns, cred->uid));
245 NEW_AUX_ENT(AT_EUID, from_kuid_munged(cred->user_ns, cred->euid));
246 NEW_AUX_ENT(AT_GID, from_kgid_munged(cred->user_ns, cred->gid));
247 NEW_AUX_ENT(AT_EGID, from_kgid_munged(cred->user_ns, cred->egid));
Jesper Juhl785d5572006-06-23 02:05:35 -0700248 NEW_AUX_ENT(AT_SECURE, security_bprm_secureexec(bprm));
Kees Cookf06295b2009-01-07 18:08:52 -0800249 NEW_AUX_ENT(AT_RANDOM, (elf_addr_t)(unsigned long)u_rand_bytes);
Michael Neuling21713642013-04-17 17:33:11 +0000250#ifdef ELF_HWCAP2
251 NEW_AUX_ENT(AT_HWCAP2, ELF_HWCAP2);
252#endif
John Reiser65191082008-07-21 14:21:32 -0700253 NEW_AUX_ENT(AT_EXECFN, bprm->exec);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700254 if (k_platform) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700255 NEW_AUX_ENT(AT_PLATFORM,
Jesper Juhl785d5572006-06-23 02:05:35 -0700256 (elf_addr_t)(unsigned long)u_platform);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700257 }
Nathan Lynch483fad12008-07-22 04:48:46 +1000258 if (k_base_platform) {
259 NEW_AUX_ENT(AT_BASE_PLATFORM,
260 (elf_addr_t)(unsigned long)u_base_platform);
261 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700262 if (bprm->interp_flags & BINPRM_FLAGS_EXECFD) {
Jesper Juhl785d5572006-06-23 02:05:35 -0700263 NEW_AUX_ENT(AT_EXECFD, bprm->interp_data);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700264 }
265#undef NEW_AUX_ENT
266 /* AT_NULL is zero; clear the rest too */
267 memset(&elf_info[ei_index], 0,
268 sizeof current->mm->saved_auxv - ei_index * sizeof elf_info[0]);
269
270 /* And advance past the AT_NULL entry. */
271 ei_index += 2;
272
273 sp = STACK_ADD(p, ei_index);
274
Andi Kleend20894a2008-02-08 04:21:54 -0800275 items = (argc + 1) + (envc + 1) + 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700276 bprm->p = STACK_ROUND(sp, items);
277
278 /* Point sp at the lowest address on the stack */
279#ifdef CONFIG_STACK_GROWSUP
280 sp = (elf_addr_t __user *)bprm->p - items - ei_index;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700281 bprm->exec = (unsigned long)sp; /* XXX: PARISC HACK */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700282#else
283 sp = (elf_addr_t __user *)bprm->p;
284#endif
285
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700286
287 /*
288 * Grow the stack manually; some architectures have a limit on how
289 * far ahead a user-space access may be in order to grow the stack.
290 */
291 vma = find_extend_vma(current->mm, bprm->p);
292 if (!vma)
293 return -EFAULT;
294
Linus Torvalds1da177e2005-04-16 15:20:36 -0700295 /* Now, let's put argc (and argv, envp if appropriate) on the stack */
296 if (__put_user(argc, sp++))
297 return -EFAULT;
Andi Kleend20894a2008-02-08 04:21:54 -0800298 argv = sp;
299 envp = argv + argc + 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700300
301 /* Populate argv and envp */
Greg Kroah-Hartmana84a5052005-05-11 00:10:44 -0700302 p = current->mm->arg_end = current->mm->arg_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700303 while (argc-- > 0) {
304 size_t len;
Heiko Carstens841d5fb2006-12-06 20:36:35 -0800305 if (__put_user((elf_addr_t)p, argv++))
306 return -EFAULT;
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700307 len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);
308 if (!len || len > MAX_ARG_STRLEN)
WANG Cong23c49712008-05-08 21:52:33 +0800309 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700310 p += len;
311 }
312 if (__put_user(0, argv))
313 return -EFAULT;
314 current->mm->arg_end = current->mm->env_start = p;
315 while (envc-- > 0) {
316 size_t len;
Heiko Carstens841d5fb2006-12-06 20:36:35 -0800317 if (__put_user((elf_addr_t)p, envp++))
318 return -EFAULT;
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700319 len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);
320 if (!len || len > MAX_ARG_STRLEN)
WANG Cong23c49712008-05-08 21:52:33 +0800321 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700322 p += len;
323 }
324 if (__put_user(0, envp))
325 return -EFAULT;
326 current->mm->env_end = p;
327
328 /* Put the elf_info on the stack in the right place. */
329 sp = (elf_addr_t __user *)envp + 1;
330 if (copy_to_user(sp, elf_info, ei_index * sizeof(elf_addr_t)))
331 return -EFAULT;
332 return 0;
333}
334
James Hoganc07380b2011-05-09 10:58:40 +0100335#ifndef elf_map
336
Linus Torvalds1da177e2005-04-16 15:20:36 -0700337static unsigned long elf_map(struct file *filep, unsigned long addr,
Jiri Kosinacc503c12008-01-30 13:31:07 +0100338 struct elf_phdr *eppnt, int prot, int type,
339 unsigned long total_size)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700340{
341 unsigned long map_addr;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100342 unsigned long size = eppnt->p_filesz + ELF_PAGEOFFSET(eppnt->p_vaddr);
343 unsigned long off = eppnt->p_offset - ELF_PAGEOFFSET(eppnt->p_vaddr);
344 addr = ELF_PAGESTART(addr);
345 size = ELF_PAGEALIGN(size);
Jan Kratochvil60bfba72007-07-15 23:40:06 -0700346
Andrew Mortond4e3cc32007-07-21 04:37:32 -0700347 /* mmap() will return -EINVAL if given a zero size, but a
348 * segment with zero filesize is perfectly valid */
Jiri Kosinacc503c12008-01-30 13:31:07 +0100349 if (!size)
350 return addr;
351
Jiri Kosinacc503c12008-01-30 13:31:07 +0100352 /*
353 * total_size is the size of the ELF (interpreter) image.
354 * The _first_ mmap needs to know the full size, otherwise
355 * randomization might put this image into an overlapping
356 * position with the ELF binary image. (since size < total_size)
357 * So we first map the 'big' image - and unmap the remainder at
358 * the end. (which unmap is needed for ELF images with holes.)
359 */
360 if (total_size) {
361 total_size = ELF_PAGEALIGN(total_size);
Al Viro5a5e4c22012-05-30 01:49:38 -0400362 map_addr = vm_mmap(filep, addr, total_size, prot, type, off);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100363 if (!BAD_ADDR(map_addr))
Al Viro5a5e4c22012-05-30 01:49:38 -0400364 vm_munmap(map_addr+size, total_size-size);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100365 } else
Al Viro5a5e4c22012-05-30 01:49:38 -0400366 map_addr = vm_mmap(filep, addr, size, prot, type, off);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100367
Linus Torvalds1da177e2005-04-16 15:20:36 -0700368 return(map_addr);
369}
370
James Hoganc07380b2011-05-09 10:58:40 +0100371#endif /* !elf_map */
372
Jiri Kosinacc503c12008-01-30 13:31:07 +0100373static unsigned long total_mapping_size(struct elf_phdr *cmds, int nr)
374{
375 int i, first_idx = -1, last_idx = -1;
376
377 for (i = 0; i < nr; i++) {
378 if (cmds[i].p_type == PT_LOAD) {
379 last_idx = i;
380 if (first_idx == -1)
381 first_idx = i;
382 }
383 }
384 if (first_idx == -1)
385 return 0;
386
387 return cmds[last_idx].p_vaddr + cmds[last_idx].p_memsz -
388 ELF_PAGESTART(cmds[first_idx].p_vaddr);
389}
390
Paul Burton6a8d3892014-09-11 08:30:14 +0100391/**
392 * load_elf_phdrs() - load ELF program headers
393 * @elf_ex: ELF header of the binary whose program headers should be loaded
394 * @elf_file: the opened ELF binary file
395 *
396 * Loads ELF program headers from the binary file elf_file, which has the ELF
397 * header pointed to by elf_ex, into a newly allocated array. The caller is
398 * responsible for freeing the allocated data. Returns an ERR_PTR upon failure.
399 */
400static struct elf_phdr *load_elf_phdrs(struct elfhdr *elf_ex,
401 struct file *elf_file)
402{
403 struct elf_phdr *elf_phdata = NULL;
404 int retval, size, err = -1;
405
406 /*
407 * If the size of this structure has changed, then punt, since
408 * we will be doing the wrong thing.
409 */
410 if (elf_ex->e_phentsize != sizeof(struct elf_phdr))
411 goto out;
412
413 /* Sanity check the number of program headers... */
414 if (elf_ex->e_phnum < 1 ||
415 elf_ex->e_phnum > 65536U / sizeof(struct elf_phdr))
416 goto out;
417
418 /* ...and their total size. */
419 size = sizeof(struct elf_phdr) * elf_ex->e_phnum;
420 if (size > ELF_MIN_ALIGN)
421 goto out;
422
423 elf_phdata = kmalloc(size, GFP_KERNEL);
424 if (!elf_phdata)
425 goto out;
426
427 /* Read in the program headers */
428 retval = kernel_read(elf_file, elf_ex->e_phoff,
429 (char *)elf_phdata, size);
430 if (retval != size) {
431 err = (retval < 0) ? retval : -EIO;
432 goto out;
433 }
434
435 /* Success! */
436 err = 0;
437out:
438 if (err) {
439 kfree(elf_phdata);
440 elf_phdata = NULL;
441 }
442 return elf_phdata;
443}
Jiri Kosinacc503c12008-01-30 13:31:07 +0100444
Paul Burton774c1052014-09-11 08:30:16 +0100445#ifndef CONFIG_ARCH_BINFMT_ELF_STATE
446
447/**
448 * struct arch_elf_state - arch-specific ELF loading state
449 *
450 * This structure is used to preserve architecture specific data during
451 * the loading of an ELF file, throughout the checking of architecture
452 * specific ELF headers & through to the point where the ELF load is
453 * known to be proceeding (ie. SET_PERSONALITY).
454 *
455 * This implementation is a dummy for architectures which require no
456 * specific state.
457 */
458struct arch_elf_state {
459};
460
461#define INIT_ARCH_ELF_STATE {}
462
463/**
464 * arch_elf_pt_proc() - check a PT_LOPROC..PT_HIPROC ELF program header
465 * @ehdr: The main ELF header
466 * @phdr: The program header to check
467 * @elf: The open ELF file
468 * @is_interp: True if the phdr is from the interpreter of the ELF being
469 * loaded, else false.
470 * @state: Architecture-specific state preserved throughout the process
471 * of loading the ELF.
472 *
473 * Inspects the program header phdr to validate its correctness and/or
474 * suitability for the system. Called once per ELF program header in the
475 * range PT_LOPROC to PT_HIPROC, for both the ELF being loaded and its
476 * interpreter.
477 *
478 * Return: Zero to proceed with the ELF load, non-zero to fail the ELF load
479 * with that return code.
480 */
481static inline int arch_elf_pt_proc(struct elfhdr *ehdr,
482 struct elf_phdr *phdr,
483 struct file *elf, bool is_interp,
484 struct arch_elf_state *state)
485{
486 /* Dummy implementation, always proceed */
487 return 0;
488}
489
490/**
Maciej W. Rozycki54d157142015-10-26 15:47:57 +0000491 * arch_check_elf() - check an ELF executable
Paul Burton774c1052014-09-11 08:30:16 +0100492 * @ehdr: The main ELF header
493 * @has_interp: True if the ELF has an interpreter, else false.
494 * @state: Architecture-specific state preserved throughout the process
495 * of loading the ELF.
496 *
497 * Provides a final opportunity for architecture code to reject the loading
498 * of the ELF & cause an exec syscall to return an error. This is called after
499 * all program headers to be checked by arch_elf_pt_proc have been.
500 *
501 * Return: Zero to proceed with the ELF load, non-zero to fail the ELF load
502 * with that return code.
503 */
504static inline int arch_check_elf(struct elfhdr *ehdr, bool has_interp,
505 struct arch_elf_state *state)
506{
507 /* Dummy implementation, always proceed */
508 return 0;
509}
510
511#endif /* !CONFIG_ARCH_BINFMT_ELF_STATE */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700512
513/* This is much more generalized than the library routine read function,
514 so we keep this separate. Technically the library read function
515 is only provided so that we can read a.out libraries that have
516 an ELF header */
517
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700518static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
Jiri Kosinacc503c12008-01-30 13:31:07 +0100519 struct file *interpreter, unsigned long *interp_map_addr,
Paul Burtona9d9ef12014-09-11 08:30:15 +0100520 unsigned long no_base, struct elf_phdr *interp_elf_phdata)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700521{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700522 struct elf_phdr *eppnt;
523 unsigned long load_addr = 0;
524 int load_addr_set = 0;
525 unsigned long last_bss = 0, elf_bss = 0;
526 unsigned long error = ~0UL;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100527 unsigned long total_size;
Paul Burton6a8d3892014-09-11 08:30:14 +0100528 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700529
530 /* First of all, some simple consistency checks */
531 if (interp_elf_ex->e_type != ET_EXEC &&
532 interp_elf_ex->e_type != ET_DYN)
533 goto out;
534 if (!elf_check_arch(interp_elf_ex))
535 goto out;
Al Viro72c2d532013-09-22 16:27:52 -0400536 if (!interpreter->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700537 goto out;
538
Paul Burtona9d9ef12014-09-11 08:30:15 +0100539 total_size = total_mapping_size(interp_elf_phdata,
540 interp_elf_ex->e_phnum);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100541 if (!total_size) {
542 error = -EINVAL;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100543 goto out;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100544 }
545
Paul Burtona9d9ef12014-09-11 08:30:15 +0100546 eppnt = interp_elf_phdata;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700547 for (i = 0; i < interp_elf_ex->e_phnum; i++, eppnt++) {
548 if (eppnt->p_type == PT_LOAD) {
549 int elf_type = MAP_PRIVATE | MAP_DENYWRITE;
550 int elf_prot = 0;
551 unsigned long vaddr = 0;
552 unsigned long k, map_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700554 if (eppnt->p_flags & PF_R)
555 elf_prot = PROT_READ;
556 if (eppnt->p_flags & PF_W)
557 elf_prot |= PROT_WRITE;
558 if (eppnt->p_flags & PF_X)
559 elf_prot |= PROT_EXEC;
560 vaddr = eppnt->p_vaddr;
561 if (interp_elf_ex->e_type == ET_EXEC || load_addr_set)
562 elf_type |= MAP_FIXED;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100563 else if (no_base && interp_elf_ex->e_type == ET_DYN)
564 load_addr = -vaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700565
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700566 map_addr = elf_map(interpreter, load_addr + vaddr,
Andrew Mortonbb1ad822008-01-30 13:31:07 +0100567 eppnt, elf_prot, elf_type, total_size);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100568 total_size = 0;
569 if (!*interp_map_addr)
570 *interp_map_addr = map_addr;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700571 error = map_addr;
572 if (BAD_ADDR(map_addr))
Paul Burtona9d9ef12014-09-11 08:30:15 +0100573 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700574
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700575 if (!load_addr_set &&
576 interp_elf_ex->e_type == ET_DYN) {
577 load_addr = map_addr - ELF_PAGESTART(vaddr);
578 load_addr_set = 1;
579 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700580
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700581 /*
582 * Check to see if the section's size will overflow the
583 * allowed task size. Note that p_filesz must always be
584 * <= p_memsize so it's only necessary to check p_memsz.
585 */
586 k = load_addr + eppnt->p_vaddr;
Chuck Ebbertce510592006-07-03 00:24:14 -0700587 if (BAD_ADDR(k) ||
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700588 eppnt->p_filesz > eppnt->p_memsz ||
589 eppnt->p_memsz > TASK_SIZE ||
590 TASK_SIZE - eppnt->p_memsz < k) {
591 error = -ENOMEM;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100592 goto out;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700593 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700594
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700595 /*
596 * Find the end of the file mapping for this phdr, and
597 * keep track of the largest address we see for this.
598 */
599 k = load_addr + eppnt->p_vaddr + eppnt->p_filesz;
600 if (k > elf_bss)
601 elf_bss = k;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700602
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700603 /*
604 * Do the same thing for the memory mapping - between
605 * elf_bss and last_bss is the bss section.
606 */
Kees Cook4a0c08d2016-08-02 14:04:51 -0700607 k = load_addr + eppnt->p_vaddr + eppnt->p_memsz;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700608 if (k > last_bss)
609 last_bss = k;
610 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700611 }
612
Kees Cook4a0c08d2016-08-02 14:04:51 -0700613 /*
614 * Now fill out the bss section: first pad the last page from
615 * the file up to the page boundary, and zero it from elf_bss
616 * up to the end of the page.
617 */
618 if (padzero(elf_bss)) {
619 error = -EFAULT;
620 goto out;
621 }
622 /*
623 * Next, align both the file and mem bss up to the page size,
624 * since this is where elf_bss was just zeroed up to, and where
625 * last_bss will end after the vm_brk() below.
626 */
627 elf_bss = ELF_PAGEALIGN(elf_bss);
628 last_bss = ELF_PAGEALIGN(last_bss);
629 /* Finally, if there is still more bss to allocate, do it. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700630 if (last_bss > elf_bss) {
Linus Torvaldse4eb1ff2012-04-20 15:35:40 -0700631 error = vm_brk(elf_bss, last_bss - elf_bss);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700632 if (BAD_ADDR(error))
Paul Burtona9d9ef12014-09-11 08:30:15 +0100633 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700634 }
635
Jiri Kosinacc503c12008-01-30 13:31:07 +0100636 error = load_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700637out:
638 return error;
639}
640
Linus Torvalds1da177e2005-04-16 15:20:36 -0700641/*
642 * These are the functions used to load ELF style executables and shared
643 * libraries. There is no binary dependent code anywhere else.
644 */
645
Andi Kleen913bd902006-03-25 16:29:09 +0100646#ifndef STACK_RND_MASK
James Bottomleyd1cabd62007-03-16 13:38:35 -0800647#define STACK_RND_MASK (0x7ff >> (PAGE_SHIFT - 12)) /* 8MB of VA */
Andi Kleen913bd902006-03-25 16:29:09 +0100648#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700649
650static unsigned long randomize_stack_top(unsigned long stack_top)
651{
Hector Marco-Gisbert4e7c22d2015-02-14 09:33:50 -0800652 unsigned long random_variable = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700653
Andi Kleenc16b63e02006-09-26 10:52:28 +0200654 if ((current->flags & PF_RANDOMIZE) &&
655 !(current->personality & ADDR_NO_RANDOMIZE)) {
Hector Marco-Gisbert4e7c22d2015-02-14 09:33:50 -0800656 random_variable = (unsigned long) get_random_int();
657 random_variable &= STACK_RND_MASK;
Andi Kleen913bd902006-03-25 16:29:09 +0100658 random_variable <<= PAGE_SHIFT;
659 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700660#ifdef CONFIG_STACK_GROWSUP
Andi Kleen913bd902006-03-25 16:29:09 +0100661 return PAGE_ALIGN(stack_top) + random_variable;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700662#else
Andi Kleen913bd902006-03-25 16:29:09 +0100663 return PAGE_ALIGN(stack_top) - random_variable;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700664#endif
665}
666
Al Viro71613c32012-10-20 22:00:48 -0400667static int load_elf_binary(struct linux_binprm *bprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700668{
669 struct file *interpreter = NULL; /* to shut gcc up */
670 unsigned long load_addr = 0, load_bias = 0;
671 int load_addr_set = 0;
672 char * elf_interpreter = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700673 unsigned long error;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100674 struct elf_phdr *elf_ppnt, *elf_phdata, *interp_elf_phdata = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700675 unsigned long elf_bss, elf_brk;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676 int retval, i;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100677 unsigned long elf_entry;
678 unsigned long interp_load_addr = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700679 unsigned long start_code, end_code, start_data, end_data;
David Daney1a530a62011-03-22 16:34:48 -0700680 unsigned long reloc_func_desc __maybe_unused = 0;
David Rientjes8de61e62006-12-06 20:40:16 -0800681 int executable_stack = EXSTACK_DEFAULT;
Al Viro71613c32012-10-20 22:00:48 -0400682 struct pt_regs *regs = current_pt_regs();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700683 struct {
684 struct elfhdr elf_ex;
685 struct elfhdr interp_elf_ex;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700686 } *loc;
Paul Burton774c1052014-09-11 08:30:16 +0100687 struct arch_elf_state arch_state = INIT_ARCH_ELF_STATE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700688
689 loc = kmalloc(sizeof(*loc), GFP_KERNEL);
690 if (!loc) {
691 retval = -ENOMEM;
692 goto out_ret;
693 }
694
695 /* Get the exec-header */
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700696 loc->elf_ex = *((struct elfhdr *)bprm->buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700697
698 retval = -ENOEXEC;
699 /* First of all, some simple consistency checks */
700 if (memcmp(loc->elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
701 goto out;
702
703 if (loc->elf_ex.e_type != ET_EXEC && loc->elf_ex.e_type != ET_DYN)
704 goto out;
705 if (!elf_check_arch(&loc->elf_ex))
706 goto out;
Al Viro72c2d532013-09-22 16:27:52 -0400707 if (!bprm->file->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700708 goto out;
709
Paul Burton6a8d3892014-09-11 08:30:14 +0100710 elf_phdata = load_elf_phdrs(&loc->elf_ex, bprm->file);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700711 if (!elf_phdata)
712 goto out;
713
Linus Torvalds1da177e2005-04-16 15:20:36 -0700714 elf_ppnt = elf_phdata;
715 elf_bss = 0;
716 elf_brk = 0;
717
718 start_code = ~0UL;
719 end_code = 0;
720 start_data = 0;
721 end_data = 0;
722
723 for (i = 0; i < loc->elf_ex.e_phnum; i++) {
724 if (elf_ppnt->p_type == PT_INTERP) {
725 /* This is the program interpreter used for
726 * shared libraries - for now assume that this
727 * is an a.out format binary
728 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700729 retval = -ENOEXEC;
730 if (elf_ppnt->p_filesz > PATH_MAX ||
731 elf_ppnt->p_filesz < 2)
Al Viroe7b9b552009-03-29 16:31:16 -0400732 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700733
734 retval = -ENOMEM;
Jesper Juhl792db3a2006-01-09 20:54:45 -0800735 elf_interpreter = kmalloc(elf_ppnt->p_filesz,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700736 GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700737 if (!elf_interpreter)
Al Viroe7b9b552009-03-29 16:31:16 -0400738 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700739
740 retval = kernel_read(bprm->file, elf_ppnt->p_offset,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700741 elf_interpreter,
742 elf_ppnt->p_filesz);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700743 if (retval != elf_ppnt->p_filesz) {
744 if (retval >= 0)
745 retval = -EIO;
746 goto out_free_interp;
747 }
748 /* make sure path is NULL terminated */
749 retval = -ENOEXEC;
750 if (elf_interpreter[elf_ppnt->p_filesz - 1] != '\0')
751 goto out_free_interp;
752
Linus Torvalds1da177e2005-04-16 15:20:36 -0700753 interpreter = open_exec(elf_interpreter);
754 retval = PTR_ERR(interpreter);
755 if (IS_ERR(interpreter))
756 goto out_free_interp;
Alexey Dobriyan1fb84492007-01-26 00:57:16 -0800757
758 /*
759 * If the binary is not readable then enforce
760 * mm->dumpable = 0 regardless of the interpreter's
761 * permissions.
762 */
Al Viro1b5d7832011-06-19 12:49:47 -0400763 would_dump(bprm, interpreter);
Alexey Dobriyan1fb84492007-01-26 00:57:16 -0800764
Maciej W. Rozyckib582ef52015-10-26 15:48:19 +0000765 /* Get the exec headers */
766 retval = kernel_read(interpreter, 0,
767 (void *)&loc->interp_elf_ex,
768 sizeof(loc->interp_elf_ex));
769 if (retval != sizeof(loc->interp_elf_ex)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700770 if (retval >= 0)
771 retval = -EIO;
772 goto out_free_dentry;
773 }
774
Linus Torvalds1da177e2005-04-16 15:20:36 -0700775 break;
776 }
777 elf_ppnt++;
778 }
779
780 elf_ppnt = elf_phdata;
781 for (i = 0; i < loc->elf_ex.e_phnum; i++, elf_ppnt++)
Paul Burton774c1052014-09-11 08:30:16 +0100782 switch (elf_ppnt->p_type) {
783 case PT_GNU_STACK:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700784 if (elf_ppnt->p_flags & PF_X)
785 executable_stack = EXSTACK_ENABLE_X;
786 else
787 executable_stack = EXSTACK_DISABLE_X;
788 break;
Paul Burton774c1052014-09-11 08:30:16 +0100789
790 case PT_LOPROC ... PT_HIPROC:
791 retval = arch_elf_pt_proc(&loc->elf_ex, elf_ppnt,
792 bprm->file, false,
793 &arch_state);
794 if (retval)
795 goto out_free_dentry;
796 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700797 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700798
799 /* Some simple consistency checks for the interpreter */
800 if (elf_interpreter) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700801 retval = -ELIBBAD;
Andi Kleend20894a2008-02-08 04:21:54 -0800802 /* Not an ELF interpreter */
803 if (memcmp(loc->interp_elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700804 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700805 /* Verify the interpreter has a valid arch */
Andi Kleend20894a2008-02-08 04:21:54 -0800806 if (!elf_check_arch(&loc->interp_elf_ex))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700807 goto out_free_dentry;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100808
809 /* Load the interpreter program headers */
810 interp_elf_phdata = load_elf_phdrs(&loc->interp_elf_ex,
811 interpreter);
812 if (!interp_elf_phdata)
813 goto out_free_dentry;
Paul Burton774c1052014-09-11 08:30:16 +0100814
815 /* Pass PT_LOPROC..PT_HIPROC headers to arch code */
816 elf_ppnt = interp_elf_phdata;
817 for (i = 0; i < loc->interp_elf_ex.e_phnum; i++, elf_ppnt++)
818 switch (elf_ppnt->p_type) {
819 case PT_LOPROC ... PT_HIPROC:
820 retval = arch_elf_pt_proc(&loc->interp_elf_ex,
821 elf_ppnt, interpreter,
822 true, &arch_state);
823 if (retval)
824 goto out_free_dentry;
825 break;
826 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700827 }
828
Paul Burton774c1052014-09-11 08:30:16 +0100829 /*
830 * Allow arch code to reject the ELF at this point, whilst it's
831 * still possible to return an error to the code that invoked
832 * the exec syscall.
833 */
834 retval = arch_check_elf(&loc->elf_ex, !!interpreter, &arch_state);
835 if (retval)
836 goto out_free_dentry;
837
Linus Torvalds1da177e2005-04-16 15:20:36 -0700838 /* Flush all traces of the currently running executable */
839 retval = flush_old_exec(bprm);
840 if (retval)
841 goto out_free_dentry;
842
Linus Torvalds1da177e2005-04-16 15:20:36 -0700843 /* Do this immediately, since STACK_TOP as used in setup_arg_pages
844 may depend on the personality. */
Paul Burton774c1052014-09-11 08:30:16 +0100845 SET_PERSONALITY2(loc->elf_ex, &arch_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700846 if (elf_read_implies_exec(loc->elf_ex, executable_stack))
847 current->personality |= READ_IMPLIES_EXEC;
848
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700849 if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700850 current->flags |= PF_RANDOMIZE;
Linus Torvalds221af7f2010-01-28 22:14:42 -0800851
852 setup_new_exec(bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700853
854 /* Do this so that we can load the interpreter, if need be. We will
855 change some of these later */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700856 retval = setup_arg_pages(bprm, randomize_stack_top(STACK_TOP),
857 executable_stack);
Al Viro19d860a2014-05-04 20:11:36 -0400858 if (retval < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700859 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700860
Linus Torvalds1da177e2005-04-16 15:20:36 -0700861 current->mm->start_stack = bprm->p;
862
André Goddard Rosaaf901ca2009-11-14 13:09:05 -0200863 /* Now we do a little grungy work by mmapping the ELF image into
Jiri Kosinacc503c12008-01-30 13:31:07 +0100864 the correct location in memory. */
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700865 for(i = 0, elf_ppnt = elf_phdata;
866 i < loc->elf_ex.e_phnum; i++, elf_ppnt++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700867 int elf_prot = 0, elf_flags;
868 unsigned long k, vaddr;
Michael Davidsona87938b2015-04-14 15:47:38 -0700869 unsigned long total_size = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700870
871 if (elf_ppnt->p_type != PT_LOAD)
872 continue;
873
874 if (unlikely (elf_brk > elf_bss)) {
875 unsigned long nbyte;
876
877 /* There was a PT_LOAD segment with p_memsz > p_filesz
878 before this one. Map anonymous pages, if needed,
879 and clear the area. */
Mikael Petterssonf670d0e2011-01-12 17:00:02 -0800880 retval = set_brk(elf_bss + load_bias,
881 elf_brk + load_bias);
Al Viro19d860a2014-05-04 20:11:36 -0400882 if (retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700883 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700884 nbyte = ELF_PAGEOFFSET(elf_bss);
885 if (nbyte) {
886 nbyte = ELF_MIN_ALIGN - nbyte;
887 if (nbyte > elf_brk - elf_bss)
888 nbyte = elf_brk - elf_bss;
889 if (clear_user((void __user *)elf_bss +
890 load_bias, nbyte)) {
891 /*
892 * This bss-zeroing can fail if the ELF
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700893 * file specifies odd protections. So
Linus Torvalds1da177e2005-04-16 15:20:36 -0700894 * we don't check the return value
895 */
896 }
897 }
898 }
899
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700900 if (elf_ppnt->p_flags & PF_R)
901 elf_prot |= PROT_READ;
902 if (elf_ppnt->p_flags & PF_W)
903 elf_prot |= PROT_WRITE;
904 if (elf_ppnt->p_flags & PF_X)
905 elf_prot |= PROT_EXEC;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700906
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700907 elf_flags = MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700908
909 vaddr = elf_ppnt->p_vaddr;
Kees Cook7eb968c2017-07-10 15:52:37 -0700910 /*
911 * If we are loading ET_EXEC or we have already performed
912 * the ET_DYN load_addr calculations, proceed normally.
913 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700914 if (loc->elf_ex.e_type == ET_EXEC || load_addr_set) {
915 elf_flags |= MAP_FIXED;
916 } else if (loc->elf_ex.e_type == ET_DYN) {
Kees Cook7eb968c2017-07-10 15:52:37 -0700917 /*
918 * This logic is run once for the first LOAD Program
919 * Header for ET_DYN binaries to calculate the
920 * randomization (load_bias) for all the LOAD
921 * Program Headers, and to calculate the entire
922 * size of the ELF mapping (total_size). (Note that
923 * load_addr_set is set to true later once the
924 * initial mapping is performed.)
925 *
926 * There are effectively two types of ET_DYN
927 * binaries: programs (i.e. PIE: ET_DYN with INTERP)
928 * and loaders (ET_DYN without INTERP, since they
929 * _are_ the ELF interpreter). The loaders must
930 * be loaded away from programs since the program
931 * may otherwise collide with the loader (especially
932 * for ET_EXEC which does not have a randomized
933 * position). For example to handle invocations of
934 * "./ld.so someprog" to test out a new version of
935 * the loader, the subsequent program that the
936 * loader loads must avoid the loader itself, so
937 * they cannot share the same load range. Sufficient
938 * room for the brk must be allocated with the
939 * loader as well, since brk must be available with
940 * the loader.
941 *
942 * Therefore, programs are loaded offset from
943 * ELF_ET_DYN_BASE and loaders are loaded into the
944 * independently randomized mmap region (0 load_bias
945 * without MAP_FIXED).
946 */
947 if (elf_interpreter) {
948 load_bias = ELF_ET_DYN_BASE;
949 if (current->flags & PF_RANDOMIZE)
950 load_bias += arch_mmap_rnd();
951 elf_flags |= MAP_FIXED;
952 } else
953 load_bias = 0;
954
955 /*
956 * Since load_bias is used for all subsequent loading
957 * calculations, we must lower it by the first vaddr
958 * so that the remaining calculations based on the
959 * ELF vaddrs will be correctly offset. The result
960 * is then page aligned.
961 */
962 load_bias = ELF_PAGESTART(load_bias - vaddr);
963
Michael Davidsona87938b2015-04-14 15:47:38 -0700964 total_size = total_mapping_size(elf_phdata,
965 loc->elf_ex.e_phnum);
966 if (!total_size) {
Andrew Morton2b1d3ae2015-05-28 15:44:24 -0700967 retval = -EINVAL;
Michael Davidsona87938b2015-04-14 15:47:38 -0700968 goto out_free_dentry;
969 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700970 }
971
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700972 error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt,
Michael Davidsona87938b2015-04-14 15:47:38 -0700973 elf_prot, elf_flags, total_size);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700974 if (BAD_ADDR(error)) {
Alexey Kuznetsovb140f2512007-05-08 00:31:57 -0700975 retval = IS_ERR((void *)error) ?
976 PTR_ERR((void*)error) : -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700977 goto out_free_dentry;
978 }
979
980 if (!load_addr_set) {
981 load_addr_set = 1;
982 load_addr = (elf_ppnt->p_vaddr - elf_ppnt->p_offset);
983 if (loc->elf_ex.e_type == ET_DYN) {
984 load_bias += error -
985 ELF_PAGESTART(load_bias + vaddr);
986 load_addr += load_bias;
987 reloc_func_desc = load_bias;
988 }
989 }
990 k = elf_ppnt->p_vaddr;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700991 if (k < start_code)
992 start_code = k;
993 if (start_data < k)
994 start_data = k;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700995
996 /*
997 * Check to see if the section's size will overflow the
998 * allowed task size. Note that p_filesz must always be
999 * <= p_memsz so it is only necessary to check p_memsz.
1000 */
Chuck Ebbertce510592006-07-03 00:24:14 -07001001 if (BAD_ADDR(k) || elf_ppnt->p_filesz > elf_ppnt->p_memsz ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07001002 elf_ppnt->p_memsz > TASK_SIZE ||
1003 TASK_SIZE - elf_ppnt->p_memsz < k) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001004 /* set_brk can never work. Avoid overflows. */
Alexey Kuznetsovb140f2512007-05-08 00:31:57 -07001005 retval = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001006 goto out_free_dentry;
1007 }
1008
1009 k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz;
1010
1011 if (k > elf_bss)
1012 elf_bss = k;
1013 if ((elf_ppnt->p_flags & PF_X) && end_code < k)
1014 end_code = k;
1015 if (end_data < k)
1016 end_data = k;
1017 k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz;
1018 if (k > elf_brk)
1019 elf_brk = k;
1020 }
1021
1022 loc->elf_ex.e_entry += load_bias;
1023 elf_bss += load_bias;
1024 elf_brk += load_bias;
1025 start_code += load_bias;
1026 end_code += load_bias;
1027 start_data += load_bias;
1028 end_data += load_bias;
1029
1030 /* Calling set_brk effectively mmaps the pages that we need
1031 * for the bss and break sections. We must do this before
1032 * mapping in the interpreter, to make sure it doesn't wind
1033 * up getting placed where the bss needs to go.
1034 */
1035 retval = set_brk(elf_bss, elf_brk);
Al Viro19d860a2014-05-04 20:11:36 -04001036 if (retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001037 goto out_free_dentry;
akpm@osdl.org6de50512005-10-11 08:29:08 -07001038 if (likely(elf_bss != elf_brk) && unlikely(padzero(elf_bss))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001039 retval = -EFAULT; /* Nobody gets to see this, but.. */
1040 goto out_free_dentry;
1041 }
1042
1043 if (elf_interpreter) {
Alan Cox6eec4822012-10-04 17:13:42 -07001044 unsigned long interp_map_addr = 0;
Jiri Kosinacc503c12008-01-30 13:31:07 +01001045
Andi Kleend20894a2008-02-08 04:21:54 -08001046 elf_entry = load_elf_interp(&loc->interp_elf_ex,
1047 interpreter,
1048 &interp_map_addr,
Paul Burtona9d9ef12014-09-11 08:30:15 +01001049 load_bias, interp_elf_phdata);
Andi Kleend20894a2008-02-08 04:21:54 -08001050 if (!IS_ERR((void *)elf_entry)) {
1051 /*
1052 * load_elf_interp() returns relocation
1053 * adjustment
1054 */
1055 interp_load_addr = elf_entry;
1056 elf_entry += loc->interp_elf_ex.e_entry;
Jiri Kosinacc503c12008-01-30 13:31:07 +01001057 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001058 if (BAD_ADDR(elf_entry)) {
Chuck Ebbertce510592006-07-03 00:24:14 -07001059 retval = IS_ERR((void *)elf_entry) ?
1060 (int)elf_entry : -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001061 goto out_free_dentry;
1062 }
1063 reloc_func_desc = interp_load_addr;
1064
1065 allow_write_access(interpreter);
1066 fput(interpreter);
1067 kfree(elf_interpreter);
1068 } else {
1069 elf_entry = loc->elf_ex.e_entry;
Suresh Siddha5342fba2006-02-26 04:18:28 +01001070 if (BAD_ADDR(elf_entry)) {
Chuck Ebbertce510592006-07-03 00:24:14 -07001071 retval = -EINVAL;
Suresh Siddha5342fba2006-02-26 04:18:28 +01001072 goto out_free_dentry;
1073 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001074 }
1075
Paul Burton774c1052014-09-11 08:30:16 +01001076 kfree(interp_elf_phdata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001077 kfree(elf_phdata);
1078
Linus Torvalds1da177e2005-04-16 15:20:36 -07001079 set_binfmt(&elf_format);
1080
Benjamin Herrenschmidt547ee842005-04-16 15:24:35 -07001081#ifdef ARCH_HAS_SETUP_ADDITIONAL_PAGES
Martin Schwidefskyfc5243d2008-12-25 13:38:35 +01001082 retval = arch_setup_additional_pages(bprm, !!elf_interpreter);
Al Viro19d860a2014-05-04 20:11:36 -04001083 if (retval < 0)
Roland McGrath18c8baf2005-04-28 15:17:19 -07001084 goto out;
Benjamin Herrenschmidt547ee842005-04-16 15:24:35 -07001085#endif /* ARCH_HAS_SETUP_ADDITIONAL_PAGES */
1086
David Howellsa6f76f22008-11-14 10:39:24 +11001087 install_exec_creds(bprm);
Ollie Wildb6a2fea2007-07-19 01:48:16 -07001088 retval = create_elf_tables(bprm, &loc->elf_ex,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001089 load_addr, interp_load_addr);
Al Viro19d860a2014-05-04 20:11:36 -04001090 if (retval < 0)
Ollie Wildb6a2fea2007-07-19 01:48:16 -07001091 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001092 /* N.B. passed_fileno might not be initialized? */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001093 current->mm->end_code = end_code;
1094 current->mm->start_code = start_code;
1095 current->mm->start_data = start_data;
1096 current->mm->end_data = end_data;
1097 current->mm->start_stack = bprm->p;
1098
Jiri Kosina4471a672011-04-14 15:22:09 -07001099 if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1)) {
Jiri Kosinac1d171a2008-01-30 13:30:40 +01001100 current->mm->brk = current->mm->start_brk =
1101 arch_randomize_brk(current->mm);
Kees Cook204db6e2015-04-14 15:48:12 -07001102#ifdef compat_brk_randomized
Jiri Kosina4471a672011-04-14 15:22:09 -07001103 current->brk_randomized = 1;
1104#endif
1105 }
Jiri Kosinac1d171a2008-01-30 13:30:40 +01001106
Linus Torvalds1da177e2005-04-16 15:20:36 -07001107 if (current->personality & MMAP_PAGE_ZERO) {
1108 /* Why this, you ask??? Well SVr4 maps page 0 as read-only,
1109 and some applications "depend" upon this behavior.
1110 Since we do not have the power to recompile these, we
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001111 emulate the SVr4 behavior. Sigh. */
Linus Torvalds6be5ceb2012-04-20 17:13:58 -07001112 error = vm_mmap(NULL, 0, PAGE_SIZE, PROT_READ | PROT_EXEC,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001113 MAP_FIXED | MAP_PRIVATE, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001114 }
1115
1116#ifdef ELF_PLAT_INIT
1117 /*
1118 * The ABI may specify that certain registers be set up in special
1119 * ways (on i386 %edx is the address of a DT_FINI function, for
1120 * example. In addition, it may also specify (eg, PowerPC64 ELF)
1121 * that the e_entry field is the address of the function descriptor
1122 * for the startup routine, rather than the address of the startup
1123 * routine itself. This macro performs whatever initialization to
1124 * the regs structure is required as well as any relocations to the
1125 * function descriptor entries when executing dynamically links apps.
1126 */
1127 ELF_PLAT_INIT(regs, reloc_func_desc);
1128#endif
1129
1130 start_thread(regs, elf_entry, bprm->p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001131 retval = 0;
1132out:
1133 kfree(loc);
1134out_ret:
1135 return retval;
1136
1137 /* error cleanup */
1138out_free_dentry:
Paul Burtona9d9ef12014-09-11 08:30:15 +01001139 kfree(interp_elf_phdata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001140 allow_write_access(interpreter);
1141 if (interpreter)
1142 fput(interpreter);
1143out_free_interp:
Jesper Juhlf99d49a2005-11-07 01:01:34 -08001144 kfree(elf_interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001145out_free_ph:
1146 kfree(elf_phdata);
1147 goto out;
1148}
1149
Josh Triplett69369a72014-04-03 14:48:27 -07001150#ifdef CONFIG_USELIB
Linus Torvalds1da177e2005-04-16 15:20:36 -07001151/* This is really simpleminded and specialized - we are loading an
1152 a.out library that is given an ELF header. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001153static int load_elf_library(struct file *file)
1154{
1155 struct elf_phdr *elf_phdata;
1156 struct elf_phdr *eppnt;
1157 unsigned long elf_bss, bss, len;
1158 int retval, error, i, j;
1159 struct elfhdr elf_ex;
1160
1161 error = -ENOEXEC;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001162 retval = kernel_read(file, 0, (char *)&elf_ex, sizeof(elf_ex));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163 if (retval != sizeof(elf_ex))
1164 goto out;
1165
1166 if (memcmp(elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
1167 goto out;
1168
1169 /* First of all, some simple consistency checks */
1170 if (elf_ex.e_type != ET_EXEC || elf_ex.e_phnum > 2 ||
Al Viro72c2d532013-09-22 16:27:52 -04001171 !elf_check_arch(&elf_ex) || !file->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001172 goto out;
1173
1174 /* Now read in all of the header information */
1175
1176 j = sizeof(struct elf_phdr) * elf_ex.e_phnum;
1177 /* j < ELF_MIN_ALIGN because elf_ex.e_phnum <= 2 */
1178
1179 error = -ENOMEM;
1180 elf_phdata = kmalloc(j, GFP_KERNEL);
1181 if (!elf_phdata)
1182 goto out;
1183
1184 eppnt = elf_phdata;
1185 error = -ENOEXEC;
1186 retval = kernel_read(file, elf_ex.e_phoff, (char *)eppnt, j);
1187 if (retval != j)
1188 goto out_free_ph;
1189
1190 for (j = 0, i = 0; i<elf_ex.e_phnum; i++)
1191 if ((eppnt + i)->p_type == PT_LOAD)
1192 j++;
1193 if (j != 1)
1194 goto out_free_ph;
1195
1196 while (eppnt->p_type != PT_LOAD)
1197 eppnt++;
1198
1199 /* Now use mmap to map the library into memory. */
Linus Torvalds6be5ceb2012-04-20 17:13:58 -07001200 error = vm_mmap(file,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001201 ELF_PAGESTART(eppnt->p_vaddr),
1202 (eppnt->p_filesz +
1203 ELF_PAGEOFFSET(eppnt->p_vaddr)),
1204 PROT_READ | PROT_WRITE | PROT_EXEC,
1205 MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE,
1206 (eppnt->p_offset -
1207 ELF_PAGEOFFSET(eppnt->p_vaddr)));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001208 if (error != ELF_PAGESTART(eppnt->p_vaddr))
1209 goto out_free_ph;
1210
1211 elf_bss = eppnt->p_vaddr + eppnt->p_filesz;
1212 if (padzero(elf_bss)) {
1213 error = -EFAULT;
1214 goto out_free_ph;
1215 }
1216
Oscar Salvadora0b71d12018-07-13 16:59:13 -07001217 len = ELF_PAGEALIGN(eppnt->p_filesz + eppnt->p_vaddr);
1218 bss = ELF_PAGEALIGN(eppnt->p_memsz + eppnt->p_vaddr);
Michal Hockocac93392016-05-23 16:25:39 -07001219 if (bss > len) {
1220 error = vm_brk(len, bss - len);
1221 if (BAD_ADDR(error))
1222 goto out_free_ph;
1223 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001224 error = 0;
1225
1226out_free_ph:
1227 kfree(elf_phdata);
1228out:
1229 return error;
1230}
Josh Triplett69369a72014-04-03 14:48:27 -07001231#endif /* #ifdef CONFIG_USELIB */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001232
Christoph Hellwig698ba7b2009-12-15 16:47:37 -08001233#ifdef CONFIG_ELF_CORE
Linus Torvalds1da177e2005-04-16 15:20:36 -07001234/*
1235 * ELF core dumper
1236 *
1237 * Modelled on fs/exec.c:aout_core_dump()
1238 * Jeremy Fitzhardinge <jeremy@sw.oz.au>
1239 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001240
1241/*
Jason Baron909af762012-03-23 15:02:51 -07001242 * The purpose of always_dump_vma() is to make sure that special kernel mappings
1243 * that are useful for post-mortem analysis are included in every core dump.
1244 * In that way we ensure that the core dump is fully interpretable later
1245 * without matching up the same kernel and hardware config to see what PC values
1246 * meant. These special mappings include - vDSO, vsyscall, and other
1247 * architecture specific mappings
1248 */
1249static bool always_dump_vma(struct vm_area_struct *vma)
1250{
1251 /* Any vsyscall mappings? */
1252 if (vma == get_gate_vma(vma->vm_mm))
1253 return true;
Andy Lutomirski78d683e2014-05-19 15:58:32 -07001254
1255 /*
1256 * Assume that all vmas with a .name op should always be dumped.
1257 * If this changes, a new vm_ops field can easily be added.
1258 */
1259 if (vma->vm_ops && vma->vm_ops->name && vma->vm_ops->name(vma))
1260 return true;
1261
Jason Baron909af762012-03-23 15:02:51 -07001262 /*
1263 * arch_vma_name() returns non-NULL for special architecture mappings,
1264 * such as vDSO sections.
1265 */
1266 if (arch_vma_name(vma))
1267 return true;
1268
1269 return false;
1270}
1271
1272/*
Roland McGrath82df3972007-10-16 23:27:02 -07001273 * Decide what to dump of a segment, part, all or none.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001274 */
Roland McGrath82df3972007-10-16 23:27:02 -07001275static unsigned long vma_dump_size(struct vm_area_struct *vma,
1276 unsigned long mm_flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001277{
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001278#define FILTER(type) (mm_flags & (1UL << MMF_DUMP_##type))
1279
Jason Baron909af762012-03-23 15:02:51 -07001280 /* always dump the vdso and vsyscall sections */
1281 if (always_dump_vma(vma))
Roland McGrath82df3972007-10-16 23:27:02 -07001282 goto whole;
Roland McGrathe5b97dd2007-01-26 00:56:48 -08001283
Konstantin Khlebnikov0103bd12012-10-08 16:28:59 -07001284 if (vma->vm_flags & VM_DONTDUMP)
Jason Baronaccb61f2012-03-23 15:02:51 -07001285 return 0;
1286
Ross Zwisler50378352015-10-05 16:33:36 -06001287 /* support for DAX */
1288 if (vma_is_dax(vma)) {
1289 if ((vma->vm_flags & VM_SHARED) && FILTER(DAX_SHARED))
1290 goto whole;
1291 if (!(vma->vm_flags & VM_SHARED) && FILTER(DAX_PRIVATE))
1292 goto whole;
1293 return 0;
1294 }
1295
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001296 /* Hugetlb memory check */
1297 if (vma->vm_flags & VM_HUGETLB) {
1298 if ((vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_SHARED))
1299 goto whole;
1300 if (!(vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_PRIVATE))
1301 goto whole;
Naoya Horiguchi23d9e482013-04-17 15:58:28 -07001302 return 0;
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001303 }
1304
Linus Torvalds1da177e2005-04-16 15:20:36 -07001305 /* Do not dump I/O mapped devices or special mappings */
Konstantin Khlebnikov314e51b2012-10-08 16:29:02 -07001306 if (vma->vm_flags & VM_IO)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001307 return 0;
1308
Kawai, Hidehiroa1b59e82007-07-19 01:48:29 -07001309 /* By default, dump shared memory if mapped from an anonymous file. */
1310 if (vma->vm_flags & VM_SHARED) {
Al Viro496ad9a2013-01-23 17:07:38 -05001311 if (file_inode(vma->vm_file)->i_nlink == 0 ?
Roland McGrath82df3972007-10-16 23:27:02 -07001312 FILTER(ANON_SHARED) : FILTER(MAPPED_SHARED))
1313 goto whole;
1314 return 0;
Kawai, Hidehiroa1b59e82007-07-19 01:48:29 -07001315 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001316
Roland McGrath82df3972007-10-16 23:27:02 -07001317 /* Dump segments that have been written to. */
1318 if (vma->anon_vma && FILTER(ANON_PRIVATE))
1319 goto whole;
1320 if (vma->vm_file == NULL)
1321 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001322
Roland McGrath82df3972007-10-16 23:27:02 -07001323 if (FILTER(MAPPED_PRIVATE))
1324 goto whole;
1325
1326 /*
1327 * If this looks like the beginning of a DSO or executable mapping,
1328 * check for an ELF header. If we find one, dump the first page to
1329 * aid in determining what was mapped here.
1330 */
Roland McGrath92dc07b2009-02-06 17:34:07 -08001331 if (FILTER(ELF_HEADERS) &&
1332 vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) {
Roland McGrath82df3972007-10-16 23:27:02 -07001333 u32 __user *header = (u32 __user *) vma->vm_start;
1334 u32 word;
Roland McGrath92dc07b2009-02-06 17:34:07 -08001335 mm_segment_t fs = get_fs();
Roland McGrath82df3972007-10-16 23:27:02 -07001336 /*
1337 * Doing it this way gets the constant folded by GCC.
1338 */
1339 union {
1340 u32 cmp;
1341 char elfmag[SELFMAG];
1342 } magic;
1343 BUILD_BUG_ON(SELFMAG != sizeof word);
1344 magic.elfmag[EI_MAG0] = ELFMAG0;
1345 magic.elfmag[EI_MAG1] = ELFMAG1;
1346 magic.elfmag[EI_MAG2] = ELFMAG2;
1347 magic.elfmag[EI_MAG3] = ELFMAG3;
Roland McGrath92dc07b2009-02-06 17:34:07 -08001348 /*
1349 * Switch to the user "segment" for get_user(),
1350 * then put back what elf_core_dump() had in place.
1351 */
1352 set_fs(USER_DS);
1353 if (unlikely(get_user(word, header)))
1354 word = 0;
1355 set_fs(fs);
1356 if (word == magic.cmp)
Roland McGrath82df3972007-10-16 23:27:02 -07001357 return PAGE_SIZE;
1358 }
1359
1360#undef FILTER
1361
1362 return 0;
1363
1364whole:
1365 return vma->vm_end - vma->vm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001366}
1367
Linus Torvalds1da177e2005-04-16 15:20:36 -07001368/* An ELF note in memory */
1369struct memelfnote
1370{
1371 const char *name;
1372 int type;
1373 unsigned int datasz;
1374 void *data;
1375};
1376
1377static int notesize(struct memelfnote *en)
1378{
1379 int sz;
1380
1381 sz = sizeof(struct elf_note);
1382 sz += roundup(strlen(en->name) + 1, 4);
1383 sz += roundup(en->datasz, 4);
1384
1385 return sz;
1386}
1387
Al Viroecc8c772013-10-05 15:32:35 -04001388static int writenote(struct memelfnote *men, struct coredump_params *cprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001389{
1390 struct elf_note en;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001391 en.n_namesz = strlen(men->name) + 1;
1392 en.n_descsz = men->datasz;
1393 en.n_type = men->type;
1394
Al Viroecc8c772013-10-05 15:32:35 -04001395 return dump_emit(cprm, &en, sizeof(en)) &&
Al Viro22a8cb82013-10-08 11:05:01 -04001396 dump_emit(cprm, men->name, en.n_namesz) && dump_align(cprm, 4) &&
1397 dump_emit(cprm, men->data, men->datasz) && dump_align(cprm, 4);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001398}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001399
Roland McGrath3aba4812008-01-30 13:31:44 +01001400static void fill_elf_header(struct elfhdr *elf, int segs,
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001401 u16 machine, u32 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001402{
Cyrill Gorcunov6970c8e2008-04-29 01:01:18 -07001403 memset(elf, 0, sizeof(*elf));
1404
Linus Torvalds1da177e2005-04-16 15:20:36 -07001405 memcpy(elf->e_ident, ELFMAG, SELFMAG);
1406 elf->e_ident[EI_CLASS] = ELF_CLASS;
1407 elf->e_ident[EI_DATA] = ELF_DATA;
1408 elf->e_ident[EI_VERSION] = EV_CURRENT;
1409 elf->e_ident[EI_OSABI] = ELF_OSABI;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001410
1411 elf->e_type = ET_CORE;
Roland McGrath3aba4812008-01-30 13:31:44 +01001412 elf->e_machine = machine;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001413 elf->e_version = EV_CURRENT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001414 elf->e_phoff = sizeof(struct elfhdr);
Roland McGrath3aba4812008-01-30 13:31:44 +01001415 elf->e_flags = flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001416 elf->e_ehsize = sizeof(struct elfhdr);
1417 elf->e_phentsize = sizeof(struct elf_phdr);
1418 elf->e_phnum = segs;
Cyrill Gorcunov6970c8e2008-04-29 01:01:18 -07001419
Linus Torvalds1da177e2005-04-16 15:20:36 -07001420 return;
1421}
1422
Andrew Morton8d6b5eee2006-09-25 23:32:04 -07001423static void fill_elf_note_phdr(struct elf_phdr *phdr, int sz, loff_t offset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001424{
1425 phdr->p_type = PT_NOTE;
1426 phdr->p_offset = offset;
1427 phdr->p_vaddr = 0;
1428 phdr->p_paddr = 0;
1429 phdr->p_filesz = sz;
1430 phdr->p_memsz = 0;
1431 phdr->p_flags = 0;
1432 phdr->p_align = 0;
1433 return;
1434}
1435
1436static void fill_note(struct memelfnote *note, const char *name, int type,
1437 unsigned int sz, void *data)
1438{
1439 note->name = name;
1440 note->type = type;
1441 note->datasz = sz;
1442 note->data = data;
1443 return;
1444}
1445
1446/*
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001447 * fill up all the fields in prstatus from the given task struct, except
1448 * registers which need to be filled up separately.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001449 */
1450static void fill_prstatus(struct elf_prstatus *prstatus,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001451 struct task_struct *p, long signr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001452{
1453 prstatus->pr_info.si_signo = prstatus->pr_cursig = signr;
1454 prstatus->pr_sigpend = p->pending.signal.sig[0];
1455 prstatus->pr_sighold = p->blocked.sig[0];
Oleg Nesterov3b34fc52009-06-17 16:27:38 -07001456 rcu_read_lock();
1457 prstatus->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1458 rcu_read_unlock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001459 prstatus->pr_pid = task_pid_vnr(p);
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001460 prstatus->pr_pgrp = task_pgrp_vnr(p);
1461 prstatus->pr_sid = task_session_vnr(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001462 if (thread_group_leader(p)) {
Frank Mayharf06febc2008-09-12 09:54:39 -07001463 struct task_cputime cputime;
1464
Linus Torvalds1da177e2005-04-16 15:20:36 -07001465 /*
Frank Mayharf06febc2008-09-12 09:54:39 -07001466 * This is the record for the group leader. It shows the
1467 * group-wide total, not its individual thread total.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001468 */
Frank Mayharf06febc2008-09-12 09:54:39 -07001469 thread_group_cputime(p, &cputime);
1470 cputime_to_timeval(cputime.utime, &prstatus->pr_utime);
1471 cputime_to_timeval(cputime.stime, &prstatus->pr_stime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001472 } else {
Frederic Weisbecker6fac4822012-11-13 14:20:55 +01001473 cputime_t utime, stime;
1474
1475 task_cputime(p, &utime, &stime);
1476 cputime_to_timeval(utime, &prstatus->pr_utime);
1477 cputime_to_timeval(stime, &prstatus->pr_stime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001478 }
1479 cputime_to_timeval(p->signal->cutime, &prstatus->pr_cutime);
1480 cputime_to_timeval(p->signal->cstime, &prstatus->pr_cstime);
1481}
1482
1483static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p,
1484 struct mm_struct *mm)
1485{
David Howellsc69e8d92008-11-14 10:39:19 +11001486 const struct cred *cred;
Greg Kroah-Hartmana84a5052005-05-11 00:10:44 -07001487 unsigned int i, len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001488
1489 /* first copy the parameters from user space */
1490 memset(psinfo, 0, sizeof(struct elf_prpsinfo));
1491
1492 len = mm->arg_end - mm->arg_start;
1493 if (len >= ELF_PRARGSZ)
1494 len = ELF_PRARGSZ-1;
1495 if (copy_from_user(&psinfo->pr_psargs,
1496 (const char __user *)mm->arg_start, len))
1497 return -EFAULT;
1498 for(i = 0; i < len; i++)
1499 if (psinfo->pr_psargs[i] == 0)
1500 psinfo->pr_psargs[i] = ' ';
1501 psinfo->pr_psargs[len] = 0;
1502
Oleg Nesterov3b34fc52009-06-17 16:27:38 -07001503 rcu_read_lock();
1504 psinfo->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1505 rcu_read_unlock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001506 psinfo->pr_pid = task_pid_vnr(p);
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001507 psinfo->pr_pgrp = task_pgrp_vnr(p);
1508 psinfo->pr_sid = task_session_vnr(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001509
1510 i = p->state ? ffz(~p->state) + 1 : 0;
1511 psinfo->pr_state = i;
Carsten Otte55148542006-03-25 03:08:22 -08001512 psinfo->pr_sname = (i > 5) ? '.' : "RSDTZW"[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001513 psinfo->pr_zomb = psinfo->pr_sname == 'Z';
1514 psinfo->pr_nice = task_nice(p);
1515 psinfo->pr_flag = p->flags;
David Howellsc69e8d92008-11-14 10:39:19 +11001516 rcu_read_lock();
1517 cred = __task_cred(p);
Eric W. Biedermanebc887b2012-02-07 18:36:10 -08001518 SET_UID(psinfo->pr_uid, from_kuid_munged(cred->user_ns, cred->uid));
1519 SET_GID(psinfo->pr_gid, from_kgid_munged(cred->user_ns, cred->gid));
David Howellsc69e8d92008-11-14 10:39:19 +11001520 rcu_read_unlock();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001521 strncpy(psinfo->pr_fname, p->comm, sizeof(psinfo->pr_fname));
1522
1523 return 0;
1524}
1525
Roland McGrath3aba4812008-01-30 13:31:44 +01001526static void fill_auxv_note(struct memelfnote *note, struct mm_struct *mm)
1527{
1528 elf_addr_t *auxv = (elf_addr_t *) mm->saved_auxv;
1529 int i = 0;
1530 do
1531 i += 2;
1532 while (auxv[i - 2] != AT_NULL);
1533 fill_note(note, "CORE", NT_AUXV, i * sizeof(elf_addr_t), auxv);
1534}
1535
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001536static void fill_siginfo_note(struct memelfnote *note, user_siginfo_t *csigdata,
Al Viroce395962013-10-13 17:23:53 -04001537 const siginfo_t *siginfo)
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001538{
1539 mm_segment_t old_fs = get_fs();
1540 set_fs(KERNEL_DS);
1541 copy_siginfo_to_user((user_siginfo_t __user *) csigdata, siginfo);
1542 set_fs(old_fs);
1543 fill_note(note, "CORE", NT_SIGINFO, sizeof(*csigdata), csigdata);
1544}
1545
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001546#define MAX_FILE_NOTE_SIZE (4*1024*1024)
1547/*
1548 * Format of NT_FILE note:
1549 *
1550 * long count -- how many files are mapped
1551 * long page_size -- units for file_ofs
1552 * array of [COUNT] elements of
1553 * long start
1554 * long end
1555 * long file_ofs
1556 * followed by COUNT filenames in ASCII: "FILE1" NUL "FILE2" NUL...
1557 */
Dan Aloni72023652013-09-30 13:45:02 -07001558static int fill_files_note(struct memelfnote *note)
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001559{
1560 struct vm_area_struct *vma;
1561 unsigned count, size, names_ofs, remaining, n;
1562 user_long_t *data;
1563 user_long_t *start_end_ofs;
1564 char *name_base, *name_curpos;
1565
1566 /* *Estimated* file count and total data size needed */
1567 count = current->mm->map_count;
1568 size = count * 64;
1569
1570 names_ofs = (2 + 3 * count) * sizeof(data[0]);
1571 alloc:
1572 if (size >= MAX_FILE_NOTE_SIZE) /* paranoia check */
Dan Aloni72023652013-09-30 13:45:02 -07001573 return -EINVAL;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001574 size = round_up(size, PAGE_SIZE);
1575 data = vmalloc(size);
1576 if (!data)
Dan Aloni72023652013-09-30 13:45:02 -07001577 return -ENOMEM;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001578
1579 start_end_ofs = data + 2;
1580 name_base = name_curpos = ((char *)data) + names_ofs;
1581 remaining = size - names_ofs;
1582 count = 0;
1583 for (vma = current->mm->mmap; vma != NULL; vma = vma->vm_next) {
1584 struct file *file;
1585 const char *filename;
1586
1587 file = vma->vm_file;
1588 if (!file)
1589 continue;
Miklos Szeredi9bf39ab2015-06-19 10:29:13 +02001590 filename = file_path(file, name_curpos, remaining);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001591 if (IS_ERR(filename)) {
1592 if (PTR_ERR(filename) == -ENAMETOOLONG) {
1593 vfree(data);
1594 size = size * 5 / 4;
1595 goto alloc;
1596 }
1597 continue;
1598 }
1599
Miklos Szeredi9bf39ab2015-06-19 10:29:13 +02001600 /* file_path() fills at the end, move name down */
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001601 /* n = strlen(filename) + 1: */
1602 n = (name_curpos + remaining) - filename;
1603 remaining = filename - name_curpos;
1604 memmove(name_curpos, filename, n);
1605 name_curpos += n;
1606
1607 *start_end_ofs++ = vma->vm_start;
1608 *start_end_ofs++ = vma->vm_end;
1609 *start_end_ofs++ = vma->vm_pgoff;
1610 count++;
1611 }
1612
1613 /* Now we know exact count of files, can store it */
1614 data[0] = count;
1615 data[1] = PAGE_SIZE;
1616 /*
1617 * Count usually is less than current->mm->map_count,
1618 * we need to move filenames down.
1619 */
1620 n = current->mm->map_count - count;
1621 if (n != 0) {
1622 unsigned shift_bytes = n * 3 * sizeof(data[0]);
1623 memmove(name_base - shift_bytes, name_base,
1624 name_curpos - name_base);
1625 name_curpos -= shift_bytes;
1626 }
1627
1628 size = name_curpos - (char *)data;
1629 fill_note(note, "CORE", NT_FILE, size, data);
Dan Aloni72023652013-09-30 13:45:02 -07001630 return 0;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001631}
1632
Roland McGrath4206d3a2008-01-30 13:31:45 +01001633#ifdef CORE_DUMP_USE_REGSET
1634#include <linux/regset.h>
1635
1636struct elf_thread_core_info {
1637 struct elf_thread_core_info *next;
1638 struct task_struct *task;
1639 struct elf_prstatus prstatus;
1640 struct memelfnote notes[0];
1641};
1642
1643struct elf_note_info {
1644 struct elf_thread_core_info *thread;
1645 struct memelfnote psinfo;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001646 struct memelfnote signote;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001647 struct memelfnote auxv;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001648 struct memelfnote files;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001649 user_siginfo_t csigdata;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001650 size_t size;
1651 int thread_notes;
1652};
1653
Roland McGrathd31472b2008-03-04 14:28:30 -08001654/*
1655 * When a regset has a writeback hook, we call it on each thread before
1656 * dumping user memory. On register window machines, this makes sure the
1657 * user memory backing the register data is up to date before we read it.
1658 */
1659static void do_thread_regset_writeback(struct task_struct *task,
1660 const struct user_regset *regset)
1661{
1662 if (regset->writeback)
1663 regset->writeback(task, regset, 1);
1664}
1665
H. J. Lu0953f65d2012-02-14 13:34:52 -08001666#ifndef PR_REG_SIZE
1667#define PR_REG_SIZE(S) sizeof(S)
1668#endif
1669
1670#ifndef PRSTATUS_SIZE
1671#define PRSTATUS_SIZE(S) sizeof(S)
1672#endif
1673
1674#ifndef PR_REG_PTR
1675#define PR_REG_PTR(S) (&((S)->pr_reg))
1676#endif
1677
1678#ifndef SET_PR_FPVALID
1679#define SET_PR_FPVALID(S, V) ((S)->pr_fpvalid = (V))
1680#endif
1681
Roland McGrath4206d3a2008-01-30 13:31:45 +01001682static int fill_thread_core_info(struct elf_thread_core_info *t,
1683 const struct user_regset_view *view,
1684 long signr, size_t *total)
1685{
1686 unsigned int i;
1687
1688 /*
1689 * NT_PRSTATUS is the one special case, because the regset data
1690 * goes into the pr_reg field inside the note contents, rather
1691 * than being the whole note contents. We fill the reset in here.
1692 * We assume that regset 0 is NT_PRSTATUS.
1693 */
1694 fill_prstatus(&t->prstatus, t->task, signr);
1695 (void) view->regsets[0].get(t->task, &view->regsets[0],
H. J. Lu0953f65d2012-02-14 13:34:52 -08001696 0, PR_REG_SIZE(t->prstatus.pr_reg),
1697 PR_REG_PTR(&t->prstatus), NULL);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001698
1699 fill_note(&t->notes[0], "CORE", NT_PRSTATUS,
H. J. Lu0953f65d2012-02-14 13:34:52 -08001700 PRSTATUS_SIZE(t->prstatus), &t->prstatus);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001701 *total += notesize(&t->notes[0]);
1702
Roland McGrathd31472b2008-03-04 14:28:30 -08001703 do_thread_regset_writeback(t->task, &view->regsets[0]);
1704
Roland McGrath4206d3a2008-01-30 13:31:45 +01001705 /*
1706 * Each other regset might generate a note too. For each regset
1707 * that has no core_note_type or is inactive, we leave t->notes[i]
1708 * all zero and we'll know to skip writing it later.
1709 */
1710 for (i = 1; i < view->n; ++i) {
1711 const struct user_regset *regset = &view->regsets[i];
Roland McGrathd31472b2008-03-04 14:28:30 -08001712 do_thread_regset_writeback(t->task, regset);
H. Peter Anvinc8e25252012-03-02 10:43:48 -08001713 if (regset->core_note_type && regset->get &&
Maciej W. Rozycki0b726a42018-05-15 23:32:45 +01001714 (!regset->active || regset->active(t->task, regset) > 0)) {
Roland McGrath4206d3a2008-01-30 13:31:45 +01001715 int ret;
1716 size_t size = regset->n * regset->size;
1717 void *data = kmalloc(size, GFP_KERNEL);
1718 if (unlikely(!data))
1719 return 0;
1720 ret = regset->get(t->task, regset,
1721 0, size, data, NULL);
1722 if (unlikely(ret))
1723 kfree(data);
1724 else {
1725 if (regset->core_note_type != NT_PRFPREG)
1726 fill_note(&t->notes[i], "LINUX",
1727 regset->core_note_type,
1728 size, data);
1729 else {
H. J. Lu0953f65d2012-02-14 13:34:52 -08001730 SET_PR_FPVALID(&t->prstatus, 1);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001731 fill_note(&t->notes[i], "CORE",
1732 NT_PRFPREG, size, data);
1733 }
1734 *total += notesize(&t->notes[i]);
1735 }
1736 }
1737 }
1738
1739 return 1;
1740}
1741
1742static int fill_note_info(struct elfhdr *elf, int phdrs,
1743 struct elf_note_info *info,
Al Viroec579412013-10-13 17:57:29 -04001744 const siginfo_t *siginfo, struct pt_regs *regs)
Roland McGrath4206d3a2008-01-30 13:31:45 +01001745{
1746 struct task_struct *dump_task = current;
1747 const struct user_regset_view *view = task_user_regset_view(dump_task);
1748 struct elf_thread_core_info *t;
1749 struct elf_prpsinfo *psinfo;
Oleg Nesterov83914442008-07-25 01:47:45 -07001750 struct core_thread *ct;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001751 unsigned int i;
1752
1753 info->size = 0;
1754 info->thread = NULL;
1755
1756 psinfo = kmalloc(sizeof(*psinfo), GFP_KERNEL);
Alan Cox6899e922012-12-17 16:02:09 -08001757 if (psinfo == NULL) {
1758 info->psinfo.data = NULL; /* So we don't free this wrongly */
Roland McGrath4206d3a2008-01-30 13:31:45 +01001759 return 0;
Alan Cox6899e922012-12-17 16:02:09 -08001760 }
Roland McGrath4206d3a2008-01-30 13:31:45 +01001761
Amerigo Wange2dbe122009-07-01 01:06:26 -04001762 fill_note(&info->psinfo, "CORE", NT_PRPSINFO, sizeof(*psinfo), psinfo);
1763
Roland McGrath4206d3a2008-01-30 13:31:45 +01001764 /*
1765 * Figure out how many notes we're going to need for each thread.
1766 */
1767 info->thread_notes = 0;
1768 for (i = 0; i < view->n; ++i)
1769 if (view->regsets[i].core_note_type != 0)
1770 ++info->thread_notes;
1771
1772 /*
1773 * Sanity check. We rely on regset 0 being in NT_PRSTATUS,
1774 * since it is our one special case.
1775 */
1776 if (unlikely(info->thread_notes == 0) ||
1777 unlikely(view->regsets[0].core_note_type != NT_PRSTATUS)) {
1778 WARN_ON(1);
1779 return 0;
1780 }
1781
1782 /*
1783 * Initialize the ELF file header.
1784 */
1785 fill_elf_header(elf, phdrs,
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001786 view->e_machine, view->e_flags);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001787
1788 /*
1789 * Allocate a structure for each thread.
1790 */
Oleg Nesterov83914442008-07-25 01:47:45 -07001791 for (ct = &dump_task->mm->core_state->dumper; ct; ct = ct->next) {
1792 t = kzalloc(offsetof(struct elf_thread_core_info,
1793 notes[info->thread_notes]),
1794 GFP_KERNEL);
1795 if (unlikely(!t))
1796 return 0;
Oleg Nesterov24d52882008-07-25 01:47:40 -07001797
Oleg Nesterov83914442008-07-25 01:47:45 -07001798 t->task = ct->task;
1799 if (ct->task == dump_task || !info->thread) {
1800 t->next = info->thread;
1801 info->thread = t;
1802 } else {
1803 /*
1804 * Make sure to keep the original task at
1805 * the head of the list.
1806 */
1807 t->next = info->thread->next;
1808 info->thread->next = t;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001809 }
Oleg Nesterov83914442008-07-25 01:47:45 -07001810 }
Roland McGrath4206d3a2008-01-30 13:31:45 +01001811
1812 /*
1813 * Now fill in each thread's information.
1814 */
1815 for (t = info->thread; t != NULL; t = t->next)
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07001816 if (!fill_thread_core_info(t, view, siginfo->si_signo, &info->size))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001817 return 0;
1818
1819 /*
1820 * Fill in the two process-wide notes.
1821 */
1822 fill_psinfo(psinfo, dump_task->group_leader, dump_task->mm);
1823 info->size += notesize(&info->psinfo);
1824
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001825 fill_siginfo_note(&info->signote, &info->csigdata, siginfo);
1826 info->size += notesize(&info->signote);
1827
Roland McGrath4206d3a2008-01-30 13:31:45 +01001828 fill_auxv_note(&info->auxv, current->mm);
1829 info->size += notesize(&info->auxv);
1830
Dan Aloni72023652013-09-30 13:45:02 -07001831 if (fill_files_note(&info->files) == 0)
1832 info->size += notesize(&info->files);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001833
Roland McGrath4206d3a2008-01-30 13:31:45 +01001834 return 1;
1835}
1836
1837static size_t get_note_info_size(struct elf_note_info *info)
1838{
1839 return info->size;
1840}
1841
1842/*
1843 * Write all the notes for each thread. When writing the first thread, the
1844 * process-wide notes are interleaved after the first thread-specific note.
1845 */
1846static int write_note_info(struct elf_note_info *info,
Al Viroecc8c772013-10-05 15:32:35 -04001847 struct coredump_params *cprm)
Roland McGrath4206d3a2008-01-30 13:31:45 +01001848{
Fabian Frederickb219e252014-06-04 16:12:14 -07001849 bool first = true;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001850 struct elf_thread_core_info *t = info->thread;
1851
1852 do {
1853 int i;
1854
Al Viroecc8c772013-10-05 15:32:35 -04001855 if (!writenote(&t->notes[0], cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001856 return 0;
1857
Al Viroecc8c772013-10-05 15:32:35 -04001858 if (first && !writenote(&info->psinfo, cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001859 return 0;
Al Viroecc8c772013-10-05 15:32:35 -04001860 if (first && !writenote(&info->signote, cprm))
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001861 return 0;
Al Viroecc8c772013-10-05 15:32:35 -04001862 if (first && !writenote(&info->auxv, cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001863 return 0;
Dan Aloni72023652013-09-30 13:45:02 -07001864 if (first && info->files.data &&
Al Viroecc8c772013-10-05 15:32:35 -04001865 !writenote(&info->files, cprm))
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001866 return 0;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001867
1868 for (i = 1; i < info->thread_notes; ++i)
1869 if (t->notes[i].data &&
Al Viroecc8c772013-10-05 15:32:35 -04001870 !writenote(&t->notes[i], cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001871 return 0;
1872
Fabian Frederickb219e252014-06-04 16:12:14 -07001873 first = false;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001874 t = t->next;
1875 } while (t);
1876
1877 return 1;
1878}
1879
1880static void free_note_info(struct elf_note_info *info)
1881{
1882 struct elf_thread_core_info *threads = info->thread;
1883 while (threads) {
1884 unsigned int i;
1885 struct elf_thread_core_info *t = threads;
1886 threads = t->next;
1887 WARN_ON(t->notes[0].data && t->notes[0].data != &t->prstatus);
1888 for (i = 1; i < info->thread_notes; ++i)
1889 kfree(t->notes[i].data);
1890 kfree(t);
1891 }
1892 kfree(info->psinfo.data);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001893 vfree(info->files.data);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001894}
1895
1896#else
1897
Linus Torvalds1da177e2005-04-16 15:20:36 -07001898/* Here is the structure in which status of each thread is captured. */
1899struct elf_thread_status
1900{
1901 struct list_head list;
1902 struct elf_prstatus prstatus; /* NT_PRSTATUS */
1903 elf_fpregset_t fpu; /* NT_PRFPREG */
1904 struct task_struct *thread;
1905#ifdef ELF_CORE_COPY_XFPREGS
Mark Nelson5b20cd82007-10-16 23:25:39 -07001906 elf_fpxregset_t xfpu; /* ELF_CORE_XFPREG_TYPE */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001907#endif
1908 struct memelfnote notes[3];
1909 int num_notes;
1910};
1911
1912/*
1913 * In order to add the specific thread information for the elf file format,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001914 * we need to keep a linked list of every threads pr_status and then create
1915 * a single section for them in the final core file.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001916 */
1917static int elf_dump_thread_status(long signr, struct elf_thread_status *t)
1918{
1919 int sz = 0;
1920 struct task_struct *p = t->thread;
1921 t->num_notes = 0;
1922
1923 fill_prstatus(&t->prstatus, p, signr);
1924 elf_core_copy_task_regs(p, &t->prstatus.pr_reg);
1925
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001926 fill_note(&t->notes[0], "CORE", NT_PRSTATUS, sizeof(t->prstatus),
1927 &(t->prstatus));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001928 t->num_notes++;
1929 sz += notesize(&t->notes[0]);
1930
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001931 if ((t->prstatus.pr_fpvalid = elf_core_copy_task_fpregs(p, NULL,
1932 &t->fpu))) {
1933 fill_note(&t->notes[1], "CORE", NT_PRFPREG, sizeof(t->fpu),
1934 &(t->fpu));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001935 t->num_notes++;
1936 sz += notesize(&t->notes[1]);
1937 }
1938
1939#ifdef ELF_CORE_COPY_XFPREGS
1940 if (elf_core_copy_task_xfpregs(p, &t->xfpu)) {
Mark Nelson5b20cd82007-10-16 23:25:39 -07001941 fill_note(&t->notes[2], "LINUX", ELF_CORE_XFPREG_TYPE,
1942 sizeof(t->xfpu), &t->xfpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001943 t->num_notes++;
1944 sz += notesize(&t->notes[2]);
1945 }
1946#endif
1947 return sz;
1948}
1949
Roland McGrath3aba4812008-01-30 13:31:44 +01001950struct elf_note_info {
1951 struct memelfnote *notes;
Dan Aloni72023652013-09-30 13:45:02 -07001952 struct memelfnote *notes_files;
Roland McGrath3aba4812008-01-30 13:31:44 +01001953 struct elf_prstatus *prstatus; /* NT_PRSTATUS */
1954 struct elf_prpsinfo *psinfo; /* NT_PRPSINFO */
1955 struct list_head thread_list;
1956 elf_fpregset_t *fpu;
1957#ifdef ELF_CORE_COPY_XFPREGS
1958 elf_fpxregset_t *xfpu;
1959#endif
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001960 user_siginfo_t csigdata;
Roland McGrath3aba4812008-01-30 13:31:44 +01001961 int thread_status_size;
1962 int numnote;
1963};
1964
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001965static int elf_note_info_init(struct elf_note_info *info)
Roland McGrath3aba4812008-01-30 13:31:44 +01001966{
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001967 memset(info, 0, sizeof(*info));
Roland McGrath3aba4812008-01-30 13:31:44 +01001968 INIT_LIST_HEAD(&info->thread_list);
1969
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001970 /* Allocate space for ELF notes */
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001971 info->notes = kmalloc(8 * sizeof(struct memelfnote), GFP_KERNEL);
Roland McGrath3aba4812008-01-30 13:31:44 +01001972 if (!info->notes)
1973 return 0;
1974 info->psinfo = kmalloc(sizeof(*info->psinfo), GFP_KERNEL);
1975 if (!info->psinfo)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10001976 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01001977 info->prstatus = kmalloc(sizeof(*info->prstatus), GFP_KERNEL);
1978 if (!info->prstatus)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10001979 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01001980 info->fpu = kmalloc(sizeof(*info->fpu), GFP_KERNEL);
1981 if (!info->fpu)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10001982 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01001983#ifdef ELF_CORE_COPY_XFPREGS
1984 info->xfpu = kmalloc(sizeof(*info->xfpu), GFP_KERNEL);
1985 if (!info->xfpu)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10001986 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01001987#endif
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001988 return 1;
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001989}
Roland McGrath3aba4812008-01-30 13:31:44 +01001990
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001991static int fill_note_info(struct elfhdr *elf, int phdrs,
1992 struct elf_note_info *info,
Al Viroec579412013-10-13 17:57:29 -04001993 const siginfo_t *siginfo, struct pt_regs *regs)
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001994{
1995 struct list_head *t;
Al Viroafabada2013-10-14 07:39:56 -04001996 struct core_thread *ct;
1997 struct elf_thread_status *ets;
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001998
1999 if (!elf_note_info_init(info))
2000 return 0;
2001
Al Viroafabada2013-10-14 07:39:56 -04002002 for (ct = current->mm->core_state->dumper.next;
2003 ct; ct = ct->next) {
2004 ets = kzalloc(sizeof(*ets), GFP_KERNEL);
2005 if (!ets)
2006 return 0;
Oleg Nesterov24d52882008-07-25 01:47:40 -07002007
Al Viroafabada2013-10-14 07:39:56 -04002008 ets->thread = ct->task;
2009 list_add(&ets->list, &info->thread_list);
2010 }
Oleg Nesterov83914442008-07-25 01:47:45 -07002011
Al Viroafabada2013-10-14 07:39:56 -04002012 list_for_each(t, &info->thread_list) {
2013 int sz;
Oleg Nesterov83914442008-07-25 01:47:45 -07002014
Al Viroafabada2013-10-14 07:39:56 -04002015 ets = list_entry(t, struct elf_thread_status, list);
2016 sz = elf_dump_thread_status(siginfo->si_signo, ets);
2017 info->thread_status_size += sz;
Roland McGrath3aba4812008-01-30 13:31:44 +01002018 }
2019 /* now collect the dump for the current */
2020 memset(info->prstatus, 0, sizeof(*info->prstatus));
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07002021 fill_prstatus(info->prstatus, current, siginfo->si_signo);
Roland McGrath3aba4812008-01-30 13:31:44 +01002022 elf_core_copy_regs(&info->prstatus->pr_reg, regs);
2023
2024 /* Set up header */
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08002025 fill_elf_header(elf, phdrs, ELF_ARCH, ELF_CORE_EFLAGS);
Roland McGrath3aba4812008-01-30 13:31:44 +01002026
2027 /*
2028 * Set up the notes in similar form to SVR4 core dumps made
2029 * with info from their /proc.
2030 */
2031
2032 fill_note(info->notes + 0, "CORE", NT_PRSTATUS,
2033 sizeof(*info->prstatus), info->prstatus);
2034 fill_psinfo(info->psinfo, current->group_leader, current->mm);
2035 fill_note(info->notes + 1, "CORE", NT_PRPSINFO,
2036 sizeof(*info->psinfo), info->psinfo);
2037
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07002038 fill_siginfo_note(info->notes + 2, &info->csigdata, siginfo);
2039 fill_auxv_note(info->notes + 3, current->mm);
Dan Aloni72023652013-09-30 13:45:02 -07002040 info->numnote = 4;
Roland McGrath3aba4812008-01-30 13:31:44 +01002041
Dan Aloni72023652013-09-30 13:45:02 -07002042 if (fill_files_note(info->notes + info->numnote) == 0) {
2043 info->notes_files = info->notes + info->numnote;
2044 info->numnote++;
2045 }
Roland McGrath3aba4812008-01-30 13:31:44 +01002046
2047 /* Try to dump the FPU. */
2048 info->prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, regs,
2049 info->fpu);
2050 if (info->prstatus->pr_fpvalid)
2051 fill_note(info->notes + info->numnote++,
2052 "CORE", NT_PRFPREG, sizeof(*info->fpu), info->fpu);
2053#ifdef ELF_CORE_COPY_XFPREGS
2054 if (elf_core_copy_task_xfpregs(current, info->xfpu))
2055 fill_note(info->notes + info->numnote++,
2056 "LINUX", ELF_CORE_XFPREG_TYPE,
2057 sizeof(*info->xfpu), info->xfpu);
2058#endif
2059
2060 return 1;
Roland McGrath3aba4812008-01-30 13:31:44 +01002061}
2062
2063static size_t get_note_info_size(struct elf_note_info *info)
2064{
2065 int sz = 0;
2066 int i;
2067
2068 for (i = 0; i < info->numnote; i++)
2069 sz += notesize(info->notes + i);
2070
2071 sz += info->thread_status_size;
2072
2073 return sz;
2074}
2075
2076static int write_note_info(struct elf_note_info *info,
Al Viroecc8c772013-10-05 15:32:35 -04002077 struct coredump_params *cprm)
Roland McGrath3aba4812008-01-30 13:31:44 +01002078{
2079 int i;
2080 struct list_head *t;
2081
2082 for (i = 0; i < info->numnote; i++)
Al Viroecc8c772013-10-05 15:32:35 -04002083 if (!writenote(info->notes + i, cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002084 return 0;
2085
2086 /* write out the thread status notes section */
2087 list_for_each(t, &info->thread_list) {
2088 struct elf_thread_status *tmp =
2089 list_entry(t, struct elf_thread_status, list);
2090
2091 for (i = 0; i < tmp->num_notes; i++)
Al Viroecc8c772013-10-05 15:32:35 -04002092 if (!writenote(&tmp->notes[i], cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002093 return 0;
2094 }
2095
2096 return 1;
2097}
2098
2099static void free_note_info(struct elf_note_info *info)
2100{
2101 while (!list_empty(&info->thread_list)) {
2102 struct list_head *tmp = info->thread_list.next;
2103 list_del(tmp);
2104 kfree(list_entry(tmp, struct elf_thread_status, list));
2105 }
2106
Dan Aloni72023652013-09-30 13:45:02 -07002107 /* Free data possibly allocated by fill_files_note(): */
2108 if (info->notes_files)
2109 vfree(info->notes_files->data);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07002110
Roland McGrath3aba4812008-01-30 13:31:44 +01002111 kfree(info->prstatus);
2112 kfree(info->psinfo);
2113 kfree(info->notes);
2114 kfree(info->fpu);
2115#ifdef ELF_CORE_COPY_XFPREGS
2116 kfree(info->xfpu);
2117#endif
2118}
2119
Roland McGrath4206d3a2008-01-30 13:31:45 +01002120#endif
2121
Roland McGrathf47aef52007-01-26 00:56:49 -08002122static struct vm_area_struct *first_vma(struct task_struct *tsk,
2123 struct vm_area_struct *gate_vma)
2124{
2125 struct vm_area_struct *ret = tsk->mm->mmap;
2126
2127 if (ret)
2128 return ret;
2129 return gate_vma;
2130}
2131/*
2132 * Helper function for iterating across a vma list. It ensures that the caller
2133 * will visit `gate_vma' prior to terminating the search.
2134 */
2135static struct vm_area_struct *next_vma(struct vm_area_struct *this_vma,
2136 struct vm_area_struct *gate_vma)
2137{
2138 struct vm_area_struct *ret;
2139
2140 ret = this_vma->vm_next;
2141 if (ret)
2142 return ret;
2143 if (this_vma == gate_vma)
2144 return NULL;
2145 return gate_vma;
2146}
2147
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002148static void fill_extnum_info(struct elfhdr *elf, struct elf_shdr *shdr4extnum,
2149 elf_addr_t e_shoff, int segs)
2150{
2151 elf->e_shoff = e_shoff;
2152 elf->e_shentsize = sizeof(*shdr4extnum);
2153 elf->e_shnum = 1;
2154 elf->e_shstrndx = SHN_UNDEF;
2155
2156 memset(shdr4extnum, 0, sizeof(*shdr4extnum));
2157
2158 shdr4extnum->sh_type = SHT_NULL;
2159 shdr4extnum->sh_size = elf->e_shnum;
2160 shdr4extnum->sh_link = elf->e_shstrndx;
2161 shdr4extnum->sh_info = segs;
2162}
2163
Linus Torvalds1da177e2005-04-16 15:20:36 -07002164/*
2165 * Actual dumper
2166 *
2167 * This is a two-pass process; first we find the offsets of the bits,
2168 * and then they are actually written out. If we run out of core limit
2169 * we just truncate.
2170 */
Masami Hiramatsuf6151df2009-12-17 15:27:16 -08002171static int elf_core_dump(struct coredump_params *cprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002172{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002173 int has_dumped = 0;
2174 mm_segment_t fs;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002175 int segs, i;
2176 size_t vma_data_size = 0;
Roland McGrathf47aef52007-01-26 00:56:49 -08002177 struct vm_area_struct *vma, *gate_vma;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002178 struct elfhdr *elf = NULL;
Al Virocdc3d562013-10-05 22:24:29 -04002179 loff_t offset = 0, dataoff;
Dan Aloni72023652013-09-30 13:45:02 -07002180 struct elf_note_info info = { };
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002181 struct elf_phdr *phdr4note = NULL;
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002182 struct elf_shdr *shdr4extnum = NULL;
2183 Elf_Half e_phnum;
2184 elf_addr_t e_shoff;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002185 elf_addr_t *vma_filesz = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002186
2187 /*
2188 * We no longer stop all VM operations.
2189 *
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002190 * This is because those proceses that could possibly change map_count
2191 * or the mmap / vma pages are now blocked in do_exit on current
2192 * finishing this core dump.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002193 *
2194 * Only ptrace can touch these memory addresses, but it doesn't change
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002195 * the map_count or the pages allocated. So no possibility of crashing
Linus Torvalds1da177e2005-04-16 15:20:36 -07002196 * exists while dumping the mm->vm_next areas to the core file.
2197 */
2198
2199 /* alloc memory for large data structures: too large to be on stack */
2200 elf = kmalloc(sizeof(*elf), GFP_KERNEL);
2201 if (!elf)
WANG Cong5f719552008-05-06 12:45:35 +08002202 goto out;
KAMEZAWA Hiroyuki341c87b2009-06-30 11:41:23 -07002203 /*
2204 * The number of segs are recored into ELF header as 16bit value.
2205 * Please check DEFAULT_MAX_MAP_COUNT definition when you modify here.
2206 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002207 segs = current->mm->map_count;
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002208 segs += elf_core_extra_phdrs();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002209
Stephen Wilson31db58b2011-03-13 15:49:15 -04002210 gate_vma = get_gate_vma(current->mm);
Roland McGrathf47aef52007-01-26 00:56:49 -08002211 if (gate_vma != NULL)
2212 segs++;
2213
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002214 /* for notes section */
2215 segs++;
2216
2217 /* If segs > PN_XNUM(0xffff), then e_phnum overflows. To avoid
2218 * this, kernel supports extended numbering. Have a look at
2219 * include/linux/elf.h for further information. */
2220 e_phnum = segs > PN_XNUM ? PN_XNUM : segs;
2221
Roland McGrath3aba4812008-01-30 13:31:44 +01002222 /*
2223 * Collect all the non-memory information about the process for the
2224 * notes. This also sets up the file header.
2225 */
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07002226 if (!fill_note_info(elf, e_phnum, &info, cprm->siginfo, cprm->regs))
Roland McGrath3aba4812008-01-30 13:31:44 +01002227 goto cleanup;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002228
2229 has_dumped = 1;
Oleg Nesterov079148b2013-04-30 15:28:16 -07002230
Linus Torvalds1da177e2005-04-16 15:20:36 -07002231 fs = get_fs();
2232 set_fs(KERNEL_DS);
2233
Linus Torvalds1da177e2005-04-16 15:20:36 -07002234 offset += sizeof(*elf); /* Elf header */
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002235 offset += segs * sizeof(struct elf_phdr); /* Program headers */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002236
2237 /* Write notes phdr entry */
2238 {
Roland McGrath3aba4812008-01-30 13:31:44 +01002239 size_t sz = get_note_info_size(&info);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002240
Michael Ellermane5501492007-09-19 14:38:12 +10002241 sz += elf_coredump_extra_notes_size();
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +01002242
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002243 phdr4note = kmalloc(sizeof(*phdr4note), GFP_KERNEL);
2244 if (!phdr4note)
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -08002245 goto end_coredump;
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002246
2247 fill_elf_note_phdr(phdr4note, sz, offset);
2248 offset += sz;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002249 }
2250
Linus Torvalds1da177e2005-04-16 15:20:36 -07002251 dataoff = offset = roundup(offset, ELF_EXEC_PAGESIZE);
2252
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002253 vma_filesz = kmalloc_array(segs - 1, sizeof(*vma_filesz), GFP_KERNEL);
2254 if (!vma_filesz)
2255 goto end_coredump;
2256
2257 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
2258 vma = next_vma(vma, gate_vma)) {
2259 unsigned long dump_size;
2260
2261 dump_size = vma_dump_size(vma, cprm->mm_flags);
2262 vma_filesz[i++] = dump_size;
2263 vma_data_size += dump_size;
2264 }
2265
2266 offset += vma_data_size;
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002267 offset += elf_core_extra_data_size();
2268 e_shoff = offset;
2269
2270 if (e_phnum == PN_XNUM) {
2271 shdr4extnum = kmalloc(sizeof(*shdr4extnum), GFP_KERNEL);
2272 if (!shdr4extnum)
2273 goto end_coredump;
2274 fill_extnum_info(elf, shdr4extnum, e_shoff, segs);
2275 }
2276
2277 offset = dataoff;
2278
Al Viroecc8c772013-10-05 15:32:35 -04002279 if (!dump_emit(cprm, elf, sizeof(*elf)))
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002280 goto end_coredump;
2281
Al Viroecc8c772013-10-05 15:32:35 -04002282 if (!dump_emit(cprm, phdr4note, sizeof(*phdr4note)))
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002283 goto end_coredump;
2284
Linus Torvalds1da177e2005-04-16 15:20:36 -07002285 /* Write program headers for segments dump */
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002286 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
Roland McGrathf47aef52007-01-26 00:56:49 -08002287 vma = next_vma(vma, gate_vma)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002288 struct elf_phdr phdr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002289
2290 phdr.p_type = PT_LOAD;
2291 phdr.p_offset = offset;
2292 phdr.p_vaddr = vma->vm_start;
2293 phdr.p_paddr = 0;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002294 phdr.p_filesz = vma_filesz[i++];
Roland McGrath82df3972007-10-16 23:27:02 -07002295 phdr.p_memsz = vma->vm_end - vma->vm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002296 offset += phdr.p_filesz;
2297 phdr.p_flags = vma->vm_flags & VM_READ ? PF_R : 0;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002298 if (vma->vm_flags & VM_WRITE)
2299 phdr.p_flags |= PF_W;
2300 if (vma->vm_flags & VM_EXEC)
2301 phdr.p_flags |= PF_X;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002302 phdr.p_align = ELF_EXEC_PAGESIZE;
2303
Al Viroecc8c772013-10-05 15:32:35 -04002304 if (!dump_emit(cprm, &phdr, sizeof(phdr)))
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -08002305 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002306 }
2307
Al Viro506f21c2013-10-05 17:22:57 -04002308 if (!elf_core_write_extra_phdrs(cprm, offset))
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002309 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002310
2311 /* write out the notes section */
Al Viroecc8c772013-10-05 15:32:35 -04002312 if (!write_note_info(&info, cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002313 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002314
Al Virocdc3d562013-10-05 22:24:29 -04002315 if (elf_coredump_extra_notes_write(cprm))
Michael Ellermane5501492007-09-19 14:38:12 +10002316 goto end_coredump;
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +01002317
Andi Kleend025c9d2006-09-30 23:29:28 -07002318 /* Align to page */
Al Viro9b56d542013-10-08 09:26:08 -04002319 if (!dump_skip(cprm, dataoff - cprm->written))
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002320 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002321
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002322 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
Roland McGrathf47aef52007-01-26 00:56:49 -08002323 vma = next_vma(vma, gate_vma)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002324 unsigned long addr;
Roland McGrath82df3972007-10-16 23:27:02 -07002325 unsigned long end;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002326
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002327 end = vma->vm_start + vma_filesz[i++];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002328
Roland McGrath82df3972007-10-16 23:27:02 -07002329 for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002330 struct page *page;
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002331 int stop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002332
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002333 page = get_dump_page(addr);
2334 if (page) {
2335 void *kaddr = kmap(page);
Al Viro13046ec2013-10-05 18:08:47 -04002336 stop = !dump_emit(cprm, kaddr, PAGE_SIZE);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002337 kunmap(page);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002338 page_cache_release(page);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002339 } else
Al Viro9b56d542013-10-08 09:26:08 -04002340 stop = !dump_skip(cprm, PAGE_SIZE);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002341 if (stop)
2342 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002343 }
2344 }
Dave Kleikamp878f37e2017-01-11 13:25:00 -06002345 dump_truncate(cprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002346
Al Viroaa3e7ea2013-10-05 17:50:15 -04002347 if (!elf_core_write_extra_data(cprm))
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002348 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002349
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002350 if (e_phnum == PN_XNUM) {
Al Viro13046ec2013-10-05 18:08:47 -04002351 if (!dump_emit(cprm, shdr4extnum, sizeof(*shdr4extnum)))
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002352 goto end_coredump;
2353 }
2354
Linus Torvalds1da177e2005-04-16 15:20:36 -07002355end_coredump:
2356 set_fs(fs);
2357
2358cleanup:
Roland McGrath3aba4812008-01-30 13:31:44 +01002359 free_note_info(&info);
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002360 kfree(shdr4extnum);
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002361 kfree(vma_filesz);
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002362 kfree(phdr4note);
WANG Cong5f719552008-05-06 12:45:35 +08002363 kfree(elf);
2364out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002365 return has_dumped;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002366}
2367
Christoph Hellwig698ba7b2009-12-15 16:47:37 -08002368#endif /* CONFIG_ELF_CORE */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002369
2370static int __init init_elf_binfmt(void)
2371{
Al Viro8fc3dc52012-03-17 03:05:16 -04002372 register_binfmt(&elf_format);
2373 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002374}
2375
2376static void __exit exit_elf_binfmt(void)
2377{
2378 /* Remove the COFF and ELF loaders. */
2379 unregister_binfmt(&elf_format);
2380}
2381
2382core_initcall(init_elf_binfmt);
2383module_exit(exit_elf_binfmt);
2384MODULE_LICENSE("GPL");