blob: 3edca6cb9a3397eb23b3614d88226f5a49282439 [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>
Ingo Molnarf7ccbae2017-02-08 18:51:30 +010038#include <linux/sched/coredump.h>
Ingo Molnar68db0cf2017-02-08 18:51:37 +010039#include <linux/sched/task_stack.h>
Ingo Molnar32ef5512017-02-05 11:48:36 +010040#include <linux/sched/cputime.h>
Ingo Molnar5b825c32017-02-02 17:54:15 +010041#include <linux/cred.h>
Ross Zwisler50378352015-10-05 16:33:36 -060042#include <linux/dax.h>
Linus Torvalds7c0f6ba2016-12-24 11:46:01 -080043#include <linux/uaccess.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070044#include <asm/param.h>
45#include <asm/page.h>
46
Denys Vlasenko2aa362c2012-10-04 17:15:36 -070047#ifndef user_long_t
48#define user_long_t long
49#endif
Denys Vlasenko49ae4d42012-10-04 17:15:35 -070050#ifndef user_siginfo_t
51#define user_siginfo_t siginfo_t
52#endif
53
Nicolas Pitre47552002017-08-16 16:05:13 -040054/* That's for binfmt_elf_fdpic to deal with */
55#ifndef elf_check_fdpic
56#define elf_check_fdpic(ex) false
57#endif
58
Al Viro71613c32012-10-20 22:00:48 -040059static int load_elf_binary(struct linux_binprm *bprm);
Andrew Mortonbb1ad822008-01-30 13:31:07 +010060static unsigned long elf_map(struct file *, unsigned long, struct elf_phdr *,
61 int, int, unsigned long);
Linus Torvalds1da177e2005-04-16 15:20:36 -070062
Josh Triplett69369a72014-04-03 14:48:27 -070063#ifdef CONFIG_USELIB
64static int load_elf_library(struct file *);
65#else
66#define load_elf_library NULL
67#endif
68
Linus Torvalds1da177e2005-04-16 15:20:36 -070069/*
70 * If we don't support core dumping, then supply a NULL so we
71 * don't even try.
72 */
Christoph Hellwig698ba7b2009-12-15 16:47:37 -080073#ifdef CONFIG_ELF_CORE
Masami Hiramatsuf6151df2009-12-17 15:27:16 -080074static int elf_core_dump(struct coredump_params *cprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -070075#else
76#define elf_core_dump NULL
77#endif
78
79#if ELF_EXEC_PAGESIZE > PAGE_SIZE
Jesper Juhlf4e5cc22006-06-23 02:05:35 -070080#define ELF_MIN_ALIGN ELF_EXEC_PAGESIZE
Linus Torvalds1da177e2005-04-16 15:20:36 -070081#else
Jesper Juhlf4e5cc22006-06-23 02:05:35 -070082#define ELF_MIN_ALIGN PAGE_SIZE
Linus Torvalds1da177e2005-04-16 15:20:36 -070083#endif
84
85#ifndef ELF_CORE_EFLAGS
86#define ELF_CORE_EFLAGS 0
87#endif
88
89#define ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(ELF_MIN_ALIGN-1))
90#define ELF_PAGEOFFSET(_v) ((_v) & (ELF_MIN_ALIGN-1))
91#define ELF_PAGEALIGN(_v) (((_v) + ELF_MIN_ALIGN - 1) & ~(ELF_MIN_ALIGN - 1))
92
93static struct linux_binfmt elf_format = {
Mikael Petterssonf670d0e2011-01-12 17:00:02 -080094 .module = THIS_MODULE,
95 .load_binary = load_elf_binary,
96 .load_shlib = load_elf_library,
97 .core_dump = elf_core_dump,
98 .min_coredump = ELF_EXEC_PAGESIZE,
Linus Torvalds1da177e2005-04-16 15:20:36 -070099};
100
Andrew Mortond4e3cc32007-07-21 04:37:32 -0700101#define BAD_ADDR(x) ((unsigned long)(x) >= TASK_SIZE)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800103static int set_brk(unsigned long start, unsigned long end, int prot)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700104{
105 start = ELF_PAGEALIGN(start);
106 end = ELF_PAGEALIGN(end);
107 if (end > start) {
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800108 /*
109 * Map the last of the bss segment.
110 * If the header is requesting these pages to be
111 * executable, honour that (ppc32 needs this).
112 */
113 int error = vm_brk_flags(start, end - start,
114 prot & PROT_EXEC ? VM_EXEC : 0);
Linus Torvalds5d22fc22016-05-27 15:57:31 -0700115 if (error)
116 return error;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700117 }
118 current->mm->start_brk = current->mm->brk = end;
119 return 0;
120}
121
Linus Torvalds1da177e2005-04-16 15:20:36 -0700122/* We need to explicitly zero any fractional pages
123 after the data section (i.e. bss). This would
124 contain the junk from the file that should not
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700125 be in memory
126 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700127static int padzero(unsigned long elf_bss)
128{
129 unsigned long nbyte;
130
131 nbyte = ELF_PAGEOFFSET(elf_bss);
132 if (nbyte) {
133 nbyte = ELF_MIN_ALIGN - nbyte;
134 if (clear_user((void __user *) elf_bss, nbyte))
135 return -EFAULT;
136 }
137 return 0;
138}
139
Ohad Ben-Cohen09c6dd32008-02-03 18:05:15 +0200140/* Let's use some macros to make this stack manipulation a little clearer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700141#ifdef CONFIG_STACK_GROWSUP
142#define STACK_ADD(sp, items) ((elf_addr_t __user *)(sp) + (items))
143#define STACK_ROUND(sp, items) \
144 ((15 + (unsigned long) ((sp) + (items))) &~ 15UL)
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700145#define STACK_ALLOC(sp, len) ({ \
146 elf_addr_t __user *old_sp = (elf_addr_t __user *)sp; sp += len; \
147 old_sp; })
Linus Torvalds1da177e2005-04-16 15:20:36 -0700148#else
149#define STACK_ADD(sp, items) ((elf_addr_t __user *)(sp) - (items))
150#define STACK_ROUND(sp, items) \
151 (((unsigned long) (sp - items)) &~ 15UL)
152#define STACK_ALLOC(sp, len) ({ sp -= len ; sp; })
153#endif
154
Nathan Lynch483fad12008-07-22 04:48:46 +1000155#ifndef ELF_BASE_PLATFORM
156/*
157 * AT_BASE_PLATFORM indicates the "real" hardware/microarchitecture.
158 * If the arch defines ELF_BASE_PLATFORM (in asm/elf.h), the value
159 * will be copied to the user stack in the same manner as AT_PLATFORM.
160 */
161#define ELF_BASE_PLATFORM NULL
162#endif
163
Linus Torvalds1da177e2005-04-16 15:20:36 -0700164static int
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700165create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec,
Andi Kleend20894a2008-02-08 04:21:54 -0800166 unsigned long load_addr, unsigned long interp_load_addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700167{
168 unsigned long p = bprm->p;
169 int argc = bprm->argc;
170 int envc = bprm->envc;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700171 elf_addr_t __user *sp;
172 elf_addr_t __user *u_platform;
Nathan Lynch483fad12008-07-22 04:48:46 +1000173 elf_addr_t __user *u_base_platform;
Kees Cookf06295b2009-01-07 18:08:52 -0800174 elf_addr_t __user *u_rand_bytes;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700175 const char *k_platform = ELF_PLATFORM;
Nathan Lynch483fad12008-07-22 04:48:46 +1000176 const char *k_base_platform = ELF_BASE_PLATFORM;
Kees Cookf06295b2009-01-07 18:08:52 -0800177 unsigned char k_rand_bytes[16];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700178 int items;
179 elf_addr_t *elf_info;
180 int ei_index = 0;
David Howells86a264a2008-11-14 10:39:18 +1100181 const struct cred *cred = current_cred();
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700182 struct vm_area_struct *vma;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700183
184 /*
Franck Bui-Huud68c9d62007-10-16 23:30:24 -0700185 * In some cases (e.g. Hyper-Threading), we want to avoid L1
186 * evictions by the processes running on the same package. One
187 * thing we can do is to shuffle the initial stack for them.
188 */
189
190 p = arch_align_stack(p);
191
192 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700193 * If this architecture has a platform capability string, copy it
194 * to userspace. In some cases (Sparc), this info is impossible
195 * for userspace to get any other way, in others (i386) it is
196 * merely difficult.
197 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700198 u_platform = NULL;
199 if (k_platform) {
200 size_t len = strlen(k_platform) + 1;
201
Linus Torvalds1da177e2005-04-16 15:20:36 -0700202 u_platform = (elf_addr_t __user *)STACK_ALLOC(p, len);
203 if (__copy_to_user(u_platform, k_platform, len))
204 return -EFAULT;
205 }
206
Nathan Lynch483fad12008-07-22 04:48:46 +1000207 /*
208 * If this architecture has a "base" platform capability
209 * string, copy it to userspace.
210 */
211 u_base_platform = NULL;
212 if (k_base_platform) {
213 size_t len = strlen(k_base_platform) + 1;
214
215 u_base_platform = (elf_addr_t __user *)STACK_ALLOC(p, len);
216 if (__copy_to_user(u_base_platform, k_base_platform, len))
217 return -EFAULT;
218 }
219
Kees Cookf06295b2009-01-07 18:08:52 -0800220 /*
221 * Generate 16 random bytes for userspace PRNG seeding.
222 */
223 get_random_bytes(k_rand_bytes, sizeof(k_rand_bytes));
224 u_rand_bytes = (elf_addr_t __user *)
225 STACK_ALLOC(p, sizeof(k_rand_bytes));
226 if (__copy_to_user(u_rand_bytes, k_rand_bytes, sizeof(k_rand_bytes)))
227 return -EFAULT;
228
Linus Torvalds1da177e2005-04-16 15:20:36 -0700229 /* Create the ELF interpreter info */
Jesper Juhl785d5572006-06-23 02:05:35 -0700230 elf_info = (elf_addr_t *)current->mm->saved_auxv;
Olaf Hering4f9a58d2007-10-16 23:30:12 -0700231 /* update AT_VECTOR_SIZE_BASE if the number of NEW_AUX_ENT() changes */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700232#define NEW_AUX_ENT(id, val) \
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700233 do { \
Jesper Juhl785d5572006-06-23 02:05:35 -0700234 elf_info[ei_index++] = id; \
235 elf_info[ei_index++] = val; \
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700236 } while (0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700237
238#ifdef ARCH_DLINFO
239 /*
240 * ARCH_DLINFO must come first so PPC can do its special alignment of
241 * AUXV.
Olaf Hering4f9a58d2007-10-16 23:30:12 -0700242 * update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT() in
243 * ARCH_DLINFO changes
Linus Torvalds1da177e2005-04-16 15:20:36 -0700244 */
245 ARCH_DLINFO;
246#endif
247 NEW_AUX_ENT(AT_HWCAP, ELF_HWCAP);
248 NEW_AUX_ENT(AT_PAGESZ, ELF_EXEC_PAGESIZE);
249 NEW_AUX_ENT(AT_CLKTCK, CLOCKS_PER_SEC);
250 NEW_AUX_ENT(AT_PHDR, load_addr + exec->e_phoff);
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700251 NEW_AUX_ENT(AT_PHENT, sizeof(struct elf_phdr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700252 NEW_AUX_ENT(AT_PHNUM, exec->e_phnum);
253 NEW_AUX_ENT(AT_BASE, interp_load_addr);
254 NEW_AUX_ENT(AT_FLAGS, 0);
255 NEW_AUX_ENT(AT_ENTRY, exec->e_entry);
Eric W. Biedermanebc887b2012-02-07 18:36:10 -0800256 NEW_AUX_ENT(AT_UID, from_kuid_munged(cred->user_ns, cred->uid));
257 NEW_AUX_ENT(AT_EUID, from_kuid_munged(cred->user_ns, cred->euid));
258 NEW_AUX_ENT(AT_GID, from_kgid_munged(cred->user_ns, cred->gid));
259 NEW_AUX_ENT(AT_EGID, from_kgid_munged(cred->user_ns, cred->egid));
Kees Cookc425e182017-07-18 15:25:22 -0700260 NEW_AUX_ENT(AT_SECURE, bprm->secureexec);
Kees Cookf06295b2009-01-07 18:08:52 -0800261 NEW_AUX_ENT(AT_RANDOM, (elf_addr_t)(unsigned long)u_rand_bytes);
Michael Neuling21713642013-04-17 17:33:11 +0000262#ifdef ELF_HWCAP2
263 NEW_AUX_ENT(AT_HWCAP2, ELF_HWCAP2);
264#endif
John Reiser65191082008-07-21 14:21:32 -0700265 NEW_AUX_ENT(AT_EXECFN, bprm->exec);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700266 if (k_platform) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700267 NEW_AUX_ENT(AT_PLATFORM,
Jesper Juhl785d5572006-06-23 02:05:35 -0700268 (elf_addr_t)(unsigned long)u_platform);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700269 }
Nathan Lynch483fad12008-07-22 04:48:46 +1000270 if (k_base_platform) {
271 NEW_AUX_ENT(AT_BASE_PLATFORM,
272 (elf_addr_t)(unsigned long)u_base_platform);
273 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700274 if (bprm->interp_flags & BINPRM_FLAGS_EXECFD) {
Jesper Juhl785d5572006-06-23 02:05:35 -0700275 NEW_AUX_ENT(AT_EXECFD, bprm->interp_data);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700276 }
277#undef NEW_AUX_ENT
278 /* AT_NULL is zero; clear the rest too */
279 memset(&elf_info[ei_index], 0,
280 sizeof current->mm->saved_auxv - ei_index * sizeof elf_info[0]);
281
282 /* And advance past the AT_NULL entry. */
283 ei_index += 2;
284
285 sp = STACK_ADD(p, ei_index);
286
Andi Kleend20894a2008-02-08 04:21:54 -0800287 items = (argc + 1) + (envc + 1) + 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700288 bprm->p = STACK_ROUND(sp, items);
289
290 /* Point sp at the lowest address on the stack */
291#ifdef CONFIG_STACK_GROWSUP
292 sp = (elf_addr_t __user *)bprm->p - items - ei_index;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700293 bprm->exec = (unsigned long)sp; /* XXX: PARISC HACK */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700294#else
295 sp = (elf_addr_t __user *)bprm->p;
296#endif
297
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700298
299 /*
300 * Grow the stack manually; some architectures have a limit on how
301 * far ahead a user-space access may be in order to grow the stack.
302 */
303 vma = find_extend_vma(current->mm, bprm->p);
304 if (!vma)
305 return -EFAULT;
306
Linus Torvalds1da177e2005-04-16 15:20:36 -0700307 /* Now, let's put argc (and argv, envp if appropriate) on the stack */
308 if (__put_user(argc, sp++))
309 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700310
Kees Cook67c67772017-07-10 15:52:54 -0700311 /* Populate list of argv pointers back to argv strings. */
Greg Kroah-Hartmana84a5052005-05-11 00:10:44 -0700312 p = current->mm->arg_end = current->mm->arg_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700313 while (argc-- > 0) {
314 size_t len;
Kees Cook67c67772017-07-10 15:52:54 -0700315 if (__put_user((elf_addr_t)p, sp++))
Heiko Carstens841d5fb2006-12-06 20:36:35 -0800316 return -EFAULT;
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700317 len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);
318 if (!len || len > MAX_ARG_STRLEN)
WANG Cong23c49712008-05-08 21:52:33 +0800319 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700320 p += len;
321 }
Kees Cook67c67772017-07-10 15:52:54 -0700322 if (__put_user(0, sp++))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700323 return -EFAULT;
Kees Cook67c67772017-07-10 15:52:54 -0700324 current->mm->arg_end = p;
325
326 /* Populate list of envp pointers back to envp strings. */
327 current->mm->env_end = current->mm->env_start = p;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700328 while (envc-- > 0) {
329 size_t len;
Kees Cook67c67772017-07-10 15:52:54 -0700330 if (__put_user((elf_addr_t)p, sp++))
Heiko Carstens841d5fb2006-12-06 20:36:35 -0800331 return -EFAULT;
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700332 len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);
333 if (!len || len > MAX_ARG_STRLEN)
WANG Cong23c49712008-05-08 21:52:33 +0800334 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700335 p += len;
336 }
Kees Cook67c67772017-07-10 15:52:54 -0700337 if (__put_user(0, sp++))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700338 return -EFAULT;
339 current->mm->env_end = p;
340
341 /* Put the elf_info on the stack in the right place. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700342 if (copy_to_user(sp, elf_info, ei_index * sizeof(elf_addr_t)))
343 return -EFAULT;
344 return 0;
345}
346
James Hoganc07380b2011-05-09 10:58:40 +0100347#ifndef elf_map
348
Linus Torvalds1da177e2005-04-16 15:20:36 -0700349static unsigned long elf_map(struct file *filep, unsigned long addr,
Jiri Kosinacc503c12008-01-30 13:31:07 +0100350 struct elf_phdr *eppnt, int prot, int type,
351 unsigned long total_size)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700352{
353 unsigned long map_addr;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100354 unsigned long size = eppnt->p_filesz + ELF_PAGEOFFSET(eppnt->p_vaddr);
355 unsigned long off = eppnt->p_offset - ELF_PAGEOFFSET(eppnt->p_vaddr);
356 addr = ELF_PAGESTART(addr);
357 size = ELF_PAGEALIGN(size);
Jan Kratochvil60bfba72007-07-15 23:40:06 -0700358
Andrew Mortond4e3cc32007-07-21 04:37:32 -0700359 /* mmap() will return -EINVAL if given a zero size, but a
360 * segment with zero filesize is perfectly valid */
Jiri Kosinacc503c12008-01-30 13:31:07 +0100361 if (!size)
362 return addr;
363
Jiri Kosinacc503c12008-01-30 13:31:07 +0100364 /*
365 * total_size is the size of the ELF (interpreter) image.
366 * The _first_ mmap needs to know the full size, otherwise
367 * randomization might put this image into an overlapping
368 * position with the ELF binary image. (since size < total_size)
369 * So we first map the 'big' image - and unmap the remainder at
370 * the end. (which unmap is needed for ELF images with holes.)
371 */
372 if (total_size) {
373 total_size = ELF_PAGEALIGN(total_size);
Al Viro5a5e4c22012-05-30 01:49:38 -0400374 map_addr = vm_mmap(filep, addr, total_size, prot, type, off);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100375 if (!BAD_ADDR(map_addr))
Al Viro5a5e4c22012-05-30 01:49:38 -0400376 vm_munmap(map_addr+size, total_size-size);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100377 } else
Al Viro5a5e4c22012-05-30 01:49:38 -0400378 map_addr = vm_mmap(filep, addr, size, prot, type, off);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100379
Linus Torvalds1da177e2005-04-16 15:20:36 -0700380 return(map_addr);
381}
382
James Hoganc07380b2011-05-09 10:58:40 +0100383#endif /* !elf_map */
384
Jiri Kosinacc503c12008-01-30 13:31:07 +0100385static unsigned long total_mapping_size(struct elf_phdr *cmds, int nr)
386{
387 int i, first_idx = -1, last_idx = -1;
388
389 for (i = 0; i < nr; i++) {
390 if (cmds[i].p_type == PT_LOAD) {
391 last_idx = i;
392 if (first_idx == -1)
393 first_idx = i;
394 }
395 }
396 if (first_idx == -1)
397 return 0;
398
399 return cmds[last_idx].p_vaddr + cmds[last_idx].p_memsz -
400 ELF_PAGESTART(cmds[first_idx].p_vaddr);
401}
402
Paul Burton6a8d3892014-09-11 08:30:14 +0100403/**
404 * load_elf_phdrs() - load ELF program headers
405 * @elf_ex: ELF header of the binary whose program headers should be loaded
406 * @elf_file: the opened ELF binary file
407 *
408 * Loads ELF program headers from the binary file elf_file, which has the ELF
409 * header pointed to by elf_ex, into a newly allocated array. The caller is
410 * responsible for freeing the allocated data. Returns an ERR_PTR upon failure.
411 */
412static struct elf_phdr *load_elf_phdrs(struct elfhdr *elf_ex,
413 struct file *elf_file)
414{
415 struct elf_phdr *elf_phdata = NULL;
416 int retval, size, err = -1;
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +0200417 loff_t pos = elf_ex->e_phoff;
Paul Burton6a8d3892014-09-11 08:30:14 +0100418
419 /*
420 * If the size of this structure has changed, then punt, since
421 * we will be doing the wrong thing.
422 */
423 if (elf_ex->e_phentsize != sizeof(struct elf_phdr))
424 goto out;
425
426 /* Sanity check the number of program headers... */
427 if (elf_ex->e_phnum < 1 ||
428 elf_ex->e_phnum > 65536U / sizeof(struct elf_phdr))
429 goto out;
430
431 /* ...and their total size. */
432 size = sizeof(struct elf_phdr) * elf_ex->e_phnum;
433 if (size > ELF_MIN_ALIGN)
434 goto out;
435
436 elf_phdata = kmalloc(size, GFP_KERNEL);
437 if (!elf_phdata)
438 goto out;
439
440 /* Read in the program headers */
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +0200441 retval = kernel_read(elf_file, elf_phdata, size, &pos);
Paul Burton6a8d3892014-09-11 08:30:14 +0100442 if (retval != size) {
443 err = (retval < 0) ? retval : -EIO;
444 goto out;
445 }
446
447 /* Success! */
448 err = 0;
449out:
450 if (err) {
451 kfree(elf_phdata);
452 elf_phdata = NULL;
453 }
454 return elf_phdata;
455}
Jiri Kosinacc503c12008-01-30 13:31:07 +0100456
Paul Burton774c1052014-09-11 08:30:16 +0100457#ifndef CONFIG_ARCH_BINFMT_ELF_STATE
458
459/**
460 * struct arch_elf_state - arch-specific ELF loading state
461 *
462 * This structure is used to preserve architecture specific data during
463 * the loading of an ELF file, throughout the checking of architecture
464 * specific ELF headers & through to the point where the ELF load is
465 * known to be proceeding (ie. SET_PERSONALITY).
466 *
467 * This implementation is a dummy for architectures which require no
468 * specific state.
469 */
470struct arch_elf_state {
471};
472
473#define INIT_ARCH_ELF_STATE {}
474
475/**
476 * arch_elf_pt_proc() - check a PT_LOPROC..PT_HIPROC ELF program header
477 * @ehdr: The main ELF header
478 * @phdr: The program header to check
479 * @elf: The open ELF file
480 * @is_interp: True if the phdr is from the interpreter of the ELF being
481 * loaded, else false.
482 * @state: Architecture-specific state preserved throughout the process
483 * of loading the ELF.
484 *
485 * Inspects the program header phdr to validate its correctness and/or
486 * suitability for the system. Called once per ELF program header in the
487 * range PT_LOPROC to PT_HIPROC, for both the ELF being loaded and its
488 * interpreter.
489 *
490 * Return: Zero to proceed with the ELF load, non-zero to fail the ELF load
491 * with that return code.
492 */
493static inline int arch_elf_pt_proc(struct elfhdr *ehdr,
494 struct elf_phdr *phdr,
495 struct file *elf, bool is_interp,
496 struct arch_elf_state *state)
497{
498 /* Dummy implementation, always proceed */
499 return 0;
500}
501
502/**
Maciej W. Rozycki54d157142015-10-26 15:47:57 +0000503 * arch_check_elf() - check an ELF executable
Paul Burton774c1052014-09-11 08:30:16 +0100504 * @ehdr: The main ELF header
505 * @has_interp: True if the ELF has an interpreter, else false.
Maciej W. Rozyckieb4bc072015-11-13 00:47:48 +0000506 * @interp_ehdr: The interpreter's ELF header
Paul Burton774c1052014-09-11 08:30:16 +0100507 * @state: Architecture-specific state preserved throughout the process
508 * of loading the ELF.
509 *
510 * Provides a final opportunity for architecture code to reject the loading
511 * of the ELF & cause an exec syscall to return an error. This is called after
512 * all program headers to be checked by arch_elf_pt_proc have been.
513 *
514 * Return: Zero to proceed with the ELF load, non-zero to fail the ELF load
515 * with that return code.
516 */
517static inline int arch_check_elf(struct elfhdr *ehdr, bool has_interp,
Maciej W. Rozyckieb4bc072015-11-13 00:47:48 +0000518 struct elfhdr *interp_ehdr,
Paul Burton774c1052014-09-11 08:30:16 +0100519 struct arch_elf_state *state)
520{
521 /* Dummy implementation, always proceed */
522 return 0;
523}
524
525#endif /* !CONFIG_ARCH_BINFMT_ELF_STATE */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700526
527/* This is much more generalized than the library routine read function,
528 so we keep this separate. Technically the library read function
529 is only provided so that we can read a.out libraries that have
530 an ELF header */
531
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700532static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
Jiri Kosinacc503c12008-01-30 13:31:07 +0100533 struct file *interpreter, unsigned long *interp_map_addr,
Paul Burtona9d9ef12014-09-11 08:30:15 +0100534 unsigned long no_base, struct elf_phdr *interp_elf_phdata)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700535{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700536 struct elf_phdr *eppnt;
537 unsigned long load_addr = 0;
538 int load_addr_set = 0;
539 unsigned long last_bss = 0, elf_bss = 0;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800540 int bss_prot = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700541 unsigned long error = ~0UL;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100542 unsigned long total_size;
Paul Burton6a8d3892014-09-11 08:30:14 +0100543 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700544
545 /* First of all, some simple consistency checks */
546 if (interp_elf_ex->e_type != ET_EXEC &&
547 interp_elf_ex->e_type != ET_DYN)
548 goto out;
Nicolas Pitre47552002017-08-16 16:05:13 -0400549 if (!elf_check_arch(interp_elf_ex) ||
550 elf_check_fdpic(interp_elf_ex))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700551 goto out;
Al Viro72c2d532013-09-22 16:27:52 -0400552 if (!interpreter->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553 goto out;
554
Paul Burtona9d9ef12014-09-11 08:30:15 +0100555 total_size = total_mapping_size(interp_elf_phdata,
556 interp_elf_ex->e_phnum);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100557 if (!total_size) {
558 error = -EINVAL;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100559 goto out;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100560 }
561
Paul Burtona9d9ef12014-09-11 08:30:15 +0100562 eppnt = interp_elf_phdata;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700563 for (i = 0; i < interp_elf_ex->e_phnum; i++, eppnt++) {
564 if (eppnt->p_type == PT_LOAD) {
565 int elf_type = MAP_PRIVATE | MAP_DENYWRITE;
566 int elf_prot = 0;
567 unsigned long vaddr = 0;
568 unsigned long k, map_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700569
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700570 if (eppnt->p_flags & PF_R)
571 elf_prot = PROT_READ;
572 if (eppnt->p_flags & PF_W)
573 elf_prot |= PROT_WRITE;
574 if (eppnt->p_flags & PF_X)
575 elf_prot |= PROT_EXEC;
576 vaddr = eppnt->p_vaddr;
577 if (interp_elf_ex->e_type == ET_EXEC || load_addr_set)
578 elf_type |= MAP_FIXED;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100579 else if (no_base && interp_elf_ex->e_type == ET_DYN)
580 load_addr = -vaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700581
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700582 map_addr = elf_map(interpreter, load_addr + vaddr,
Andrew Mortonbb1ad822008-01-30 13:31:07 +0100583 eppnt, elf_prot, elf_type, total_size);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100584 total_size = 0;
585 if (!*interp_map_addr)
586 *interp_map_addr = map_addr;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700587 error = map_addr;
588 if (BAD_ADDR(map_addr))
Paul Burtona9d9ef12014-09-11 08:30:15 +0100589 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700590
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700591 if (!load_addr_set &&
592 interp_elf_ex->e_type == ET_DYN) {
593 load_addr = map_addr - ELF_PAGESTART(vaddr);
594 load_addr_set = 1;
595 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700596
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700597 /*
598 * Check to see if the section's size will overflow the
599 * allowed task size. Note that p_filesz must always be
600 * <= p_memsize so it's only necessary to check p_memsz.
601 */
602 k = load_addr + eppnt->p_vaddr;
Chuck Ebbertce510592006-07-03 00:24:14 -0700603 if (BAD_ADDR(k) ||
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700604 eppnt->p_filesz > eppnt->p_memsz ||
605 eppnt->p_memsz > TASK_SIZE ||
606 TASK_SIZE - eppnt->p_memsz < k) {
607 error = -ENOMEM;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100608 goto out;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700609 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700610
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700611 /*
612 * Find the end of the file mapping for this phdr, and
613 * keep track of the largest address we see for this.
614 */
615 k = load_addr + eppnt->p_vaddr + eppnt->p_filesz;
616 if (k > elf_bss)
617 elf_bss = k;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700618
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700619 /*
620 * Do the same thing for the memory mapping - between
621 * elf_bss and last_bss is the bss section.
622 */
Kees Cook0036d1f2016-08-02 14:04:51 -0700623 k = load_addr + eppnt->p_vaddr + eppnt->p_memsz;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800624 if (k > last_bss) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700625 last_bss = k;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800626 bss_prot = elf_prot;
627 }
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700628 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700629 }
630
Kees Cook0036d1f2016-08-02 14:04:51 -0700631 /*
632 * Now fill out the bss section: first pad the last page from
633 * the file up to the page boundary, and zero it from elf_bss
634 * up to the end of the page.
635 */
636 if (padzero(elf_bss)) {
637 error = -EFAULT;
638 goto out;
639 }
640 /*
641 * Next, align both the file and mem bss up to the page size,
642 * since this is where elf_bss was just zeroed up to, and where
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800643 * last_bss will end after the vm_brk_flags() below.
Kees Cook0036d1f2016-08-02 14:04:51 -0700644 */
645 elf_bss = ELF_PAGEALIGN(elf_bss);
646 last_bss = ELF_PAGEALIGN(last_bss);
647 /* Finally, if there is still more bss to allocate, do it. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700648 if (last_bss > elf_bss) {
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800649 error = vm_brk_flags(elf_bss, last_bss - elf_bss,
650 bss_prot & PROT_EXEC ? VM_EXEC : 0);
Linus Torvalds5d22fc22016-05-27 15:57:31 -0700651 if (error)
Paul Burtona9d9ef12014-09-11 08:30:15 +0100652 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700653 }
654
Jiri Kosinacc503c12008-01-30 13:31:07 +0100655 error = load_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700656out:
657 return error;
658}
659
Linus Torvalds1da177e2005-04-16 15:20:36 -0700660/*
661 * These are the functions used to load ELF style executables and shared
662 * libraries. There is no binary dependent code anywhere else.
663 */
664
Andi Kleen913bd902006-03-25 16:29:09 +0100665#ifndef STACK_RND_MASK
James Bottomleyd1cabd632007-03-16 13:38:35 -0800666#define STACK_RND_MASK (0x7ff >> (PAGE_SHIFT - 12)) /* 8MB of VA */
Andi Kleen913bd902006-03-25 16:29:09 +0100667#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700668
669static unsigned long randomize_stack_top(unsigned long stack_top)
670{
Hector Marco-Gisbert4e7c22d2015-02-14 09:33:50 -0800671 unsigned long random_variable = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700672
Oleg Nesterov01578e32017-08-15 17:40:11 +0200673 if (current->flags & PF_RANDOMIZE) {
Daniel Cashman5ef11c32016-02-26 15:19:37 -0800674 random_variable = get_random_long();
Hector Marco-Gisbert4e7c22d2015-02-14 09:33:50 -0800675 random_variable &= STACK_RND_MASK;
Andi Kleen913bd902006-03-25 16:29:09 +0100676 random_variable <<= PAGE_SHIFT;
677 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700678#ifdef CONFIG_STACK_GROWSUP
Andi Kleen913bd902006-03-25 16:29:09 +0100679 return PAGE_ALIGN(stack_top) + random_variable;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700680#else
Andi Kleen913bd902006-03-25 16:29:09 +0100681 return PAGE_ALIGN(stack_top) - random_variable;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700682#endif
683}
684
Al Viro71613c32012-10-20 22:00:48 -0400685static int load_elf_binary(struct linux_binprm *bprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700686{
687 struct file *interpreter = NULL; /* to shut gcc up */
688 unsigned long load_addr = 0, load_bias = 0;
689 int load_addr_set = 0;
690 char * elf_interpreter = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700691 unsigned long error;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100692 struct elf_phdr *elf_ppnt, *elf_phdata, *interp_elf_phdata = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700693 unsigned long elf_bss, elf_brk;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800694 int bss_prot = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700695 int retval, i;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100696 unsigned long elf_entry;
697 unsigned long interp_load_addr = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700698 unsigned long start_code, end_code, start_data, end_data;
David Daney1a530a62011-03-22 16:34:48 -0700699 unsigned long reloc_func_desc __maybe_unused = 0;
David Rientjes8de61e62006-12-06 20:40:16 -0800700 int executable_stack = EXSTACK_DEFAULT;
Al Viro71613c32012-10-20 22:00:48 -0400701 struct pt_regs *regs = current_pt_regs();
Linus Torvalds1da177e2005-04-16 15:20:36 -0700702 struct {
703 struct elfhdr elf_ex;
704 struct elfhdr interp_elf_ex;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700705 } *loc;
Paul Burton774c1052014-09-11 08:30:16 +0100706 struct arch_elf_state arch_state = INIT_ARCH_ELF_STATE;
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +0200707 loff_t pos;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700708
709 loc = kmalloc(sizeof(*loc), GFP_KERNEL);
710 if (!loc) {
711 retval = -ENOMEM;
712 goto out_ret;
713 }
714
715 /* Get the exec-header */
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700716 loc->elf_ex = *((struct elfhdr *)bprm->buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700717
718 retval = -ENOEXEC;
719 /* First of all, some simple consistency checks */
720 if (memcmp(loc->elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
721 goto out;
722
723 if (loc->elf_ex.e_type != ET_EXEC && loc->elf_ex.e_type != ET_DYN)
724 goto out;
725 if (!elf_check_arch(&loc->elf_ex))
726 goto out;
Nicolas Pitre47552002017-08-16 16:05:13 -0400727 if (elf_check_fdpic(&loc->elf_ex))
728 goto out;
Al Viro72c2d532013-09-22 16:27:52 -0400729 if (!bprm->file->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700730 goto out;
731
Paul Burton6a8d3892014-09-11 08:30:14 +0100732 elf_phdata = load_elf_phdrs(&loc->elf_ex, bprm->file);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700733 if (!elf_phdata)
734 goto out;
735
Linus Torvalds1da177e2005-04-16 15:20:36 -0700736 elf_ppnt = elf_phdata;
737 elf_bss = 0;
738 elf_brk = 0;
739
740 start_code = ~0UL;
741 end_code = 0;
742 start_data = 0;
743 end_data = 0;
744
745 for (i = 0; i < loc->elf_ex.e_phnum; i++) {
746 if (elf_ppnt->p_type == PT_INTERP) {
747 /* This is the program interpreter used for
748 * shared libraries - for now assume that this
749 * is an a.out format binary
750 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700751 retval = -ENOEXEC;
752 if (elf_ppnt->p_filesz > PATH_MAX ||
753 elf_ppnt->p_filesz < 2)
Al Viroe7b9b552009-03-29 16:31:16 -0400754 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700755
756 retval = -ENOMEM;
Jesper Juhl792db3a2006-01-09 20:54:45 -0800757 elf_interpreter = kmalloc(elf_ppnt->p_filesz,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700758 GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700759 if (!elf_interpreter)
Al Viroe7b9b552009-03-29 16:31:16 -0400760 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700761
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +0200762 pos = elf_ppnt->p_offset;
763 retval = kernel_read(bprm->file, elf_interpreter,
764 elf_ppnt->p_filesz, &pos);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700765 if (retval != elf_ppnt->p_filesz) {
766 if (retval >= 0)
767 retval = -EIO;
768 goto out_free_interp;
769 }
770 /* make sure path is NULL terminated */
771 retval = -ENOEXEC;
772 if (elf_interpreter[elf_ppnt->p_filesz - 1] != '\0')
773 goto out_free_interp;
774
Linus Torvalds1da177e2005-04-16 15:20:36 -0700775 interpreter = open_exec(elf_interpreter);
776 retval = PTR_ERR(interpreter);
777 if (IS_ERR(interpreter))
778 goto out_free_interp;
Alexey Dobriyan1fb84492007-01-26 00:57:16 -0800779
780 /*
781 * If the binary is not readable then enforce
782 * mm->dumpable = 0 regardless of the interpreter's
783 * permissions.
784 */
Al Viro1b5d7832011-06-19 12:49:47 -0400785 would_dump(bprm, interpreter);
Alexey Dobriyan1fb84492007-01-26 00:57:16 -0800786
Maciej W. Rozyckib582ef52015-10-26 15:48:19 +0000787 /* Get the exec headers */
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +0200788 pos = 0;
789 retval = kernel_read(interpreter, &loc->interp_elf_ex,
790 sizeof(loc->interp_elf_ex), &pos);
Maciej W. Rozyckib582ef52015-10-26 15:48:19 +0000791 if (retval != sizeof(loc->interp_elf_ex)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700792 if (retval >= 0)
793 retval = -EIO;
794 goto out_free_dentry;
795 }
796
Linus Torvalds1da177e2005-04-16 15:20:36 -0700797 break;
798 }
799 elf_ppnt++;
800 }
801
802 elf_ppnt = elf_phdata;
803 for (i = 0; i < loc->elf_ex.e_phnum; i++, elf_ppnt++)
Paul Burton774c1052014-09-11 08:30:16 +0100804 switch (elf_ppnt->p_type) {
805 case PT_GNU_STACK:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700806 if (elf_ppnt->p_flags & PF_X)
807 executable_stack = EXSTACK_ENABLE_X;
808 else
809 executable_stack = EXSTACK_DISABLE_X;
810 break;
Paul Burton774c1052014-09-11 08:30:16 +0100811
812 case PT_LOPROC ... PT_HIPROC:
813 retval = arch_elf_pt_proc(&loc->elf_ex, elf_ppnt,
814 bprm->file, false,
815 &arch_state);
816 if (retval)
817 goto out_free_dentry;
818 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700819 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700820
821 /* Some simple consistency checks for the interpreter */
822 if (elf_interpreter) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700823 retval = -ELIBBAD;
Andi Kleend20894a2008-02-08 04:21:54 -0800824 /* Not an ELF interpreter */
825 if (memcmp(loc->interp_elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700826 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700827 /* Verify the interpreter has a valid arch */
Nicolas Pitre47552002017-08-16 16:05:13 -0400828 if (!elf_check_arch(&loc->interp_elf_ex) ||
829 elf_check_fdpic(&loc->interp_elf_ex))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700830 goto out_free_dentry;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100831
832 /* Load the interpreter program headers */
833 interp_elf_phdata = load_elf_phdrs(&loc->interp_elf_ex,
834 interpreter);
835 if (!interp_elf_phdata)
836 goto out_free_dentry;
Paul Burton774c1052014-09-11 08:30:16 +0100837
838 /* Pass PT_LOPROC..PT_HIPROC headers to arch code */
839 elf_ppnt = interp_elf_phdata;
840 for (i = 0; i < loc->interp_elf_ex.e_phnum; i++, elf_ppnt++)
841 switch (elf_ppnt->p_type) {
842 case PT_LOPROC ... PT_HIPROC:
843 retval = arch_elf_pt_proc(&loc->interp_elf_ex,
844 elf_ppnt, interpreter,
845 true, &arch_state);
846 if (retval)
847 goto out_free_dentry;
848 break;
849 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700850 }
851
Paul Burton774c1052014-09-11 08:30:16 +0100852 /*
853 * Allow arch code to reject the ELF at this point, whilst it's
854 * still possible to return an error to the code that invoked
855 * the exec syscall.
856 */
Maciej W. Rozyckieb4bc072015-11-13 00:47:48 +0000857 retval = arch_check_elf(&loc->elf_ex,
858 !!interpreter, &loc->interp_elf_ex,
859 &arch_state);
Paul Burton774c1052014-09-11 08:30:16 +0100860 if (retval)
861 goto out_free_dentry;
862
Linus Torvalds1da177e2005-04-16 15:20:36 -0700863 /* Flush all traces of the currently running executable */
864 retval = flush_old_exec(bprm);
865 if (retval)
866 goto out_free_dentry;
867
Linus Torvalds1da177e2005-04-16 15:20:36 -0700868 /* Do this immediately, since STACK_TOP as used in setup_arg_pages
869 may depend on the personality. */
Paul Burton774c1052014-09-11 08:30:16 +0100870 SET_PERSONALITY2(loc->elf_ex, &arch_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700871 if (elf_read_implies_exec(loc->elf_ex, executable_stack))
872 current->personality |= READ_IMPLIES_EXEC;
873
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700874 if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700875 current->flags |= PF_RANDOMIZE;
Linus Torvalds221af7f2010-01-28 22:14:42 -0800876
877 setup_new_exec(bprm);
Linus Torvalds9f834ec2016-08-22 16:41:46 -0700878 install_exec_creds(bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700879
880 /* Do this so that we can load the interpreter, if need be. We will
881 change some of these later */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700882 retval = setup_arg_pages(bprm, randomize_stack_top(STACK_TOP),
883 executable_stack);
Al Viro19d860a2014-05-04 20:11:36 -0400884 if (retval < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700885 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700886
Linus Torvalds1da177e2005-04-16 15:20:36 -0700887 current->mm->start_stack = bprm->p;
888
André Goddard Rosaaf901ca2009-11-14 13:09:05 -0200889 /* Now we do a little grungy work by mmapping the ELF image into
Jiri Kosinacc503c12008-01-30 13:31:07 +0100890 the correct location in memory. */
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700891 for(i = 0, elf_ppnt = elf_phdata;
892 i < loc->elf_ex.e_phnum; i++, elf_ppnt++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700893 int elf_prot = 0, elf_flags;
894 unsigned long k, vaddr;
Michael Davidsona87938b2015-04-14 15:47:38 -0700895 unsigned long total_size = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700896
897 if (elf_ppnt->p_type != PT_LOAD)
898 continue;
899
900 if (unlikely (elf_brk > elf_bss)) {
901 unsigned long nbyte;
902
903 /* There was a PT_LOAD segment with p_memsz > p_filesz
904 before this one. Map anonymous pages, if needed,
905 and clear the area. */
Mikael Petterssonf670d0e2011-01-12 17:00:02 -0800906 retval = set_brk(elf_bss + load_bias,
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800907 elf_brk + load_bias,
908 bss_prot);
Al Viro19d860a2014-05-04 20:11:36 -0400909 if (retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700910 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700911 nbyte = ELF_PAGEOFFSET(elf_bss);
912 if (nbyte) {
913 nbyte = ELF_MIN_ALIGN - nbyte;
914 if (nbyte > elf_brk - elf_bss)
915 nbyte = elf_brk - elf_bss;
916 if (clear_user((void __user *)elf_bss +
917 load_bias, nbyte)) {
918 /*
919 * This bss-zeroing can fail if the ELF
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700920 * file specifies odd protections. So
Linus Torvalds1da177e2005-04-16 15:20:36 -0700921 * we don't check the return value
922 */
923 }
924 }
925 }
926
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700927 if (elf_ppnt->p_flags & PF_R)
928 elf_prot |= PROT_READ;
929 if (elf_ppnt->p_flags & PF_W)
930 elf_prot |= PROT_WRITE;
931 if (elf_ppnt->p_flags & PF_X)
932 elf_prot |= PROT_EXEC;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700933
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700934 elf_flags = MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700935
936 vaddr = elf_ppnt->p_vaddr;
Kees Cookeab09532017-07-10 15:52:37 -0700937 /*
938 * If we are loading ET_EXEC or we have already performed
939 * the ET_DYN load_addr calculations, proceed normally.
940 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700941 if (loc->elf_ex.e_type == ET_EXEC || load_addr_set) {
942 elf_flags |= MAP_FIXED;
943 } else if (loc->elf_ex.e_type == ET_DYN) {
Kees Cookeab09532017-07-10 15:52:37 -0700944 /*
945 * This logic is run once for the first LOAD Program
946 * Header for ET_DYN binaries to calculate the
947 * randomization (load_bias) for all the LOAD
948 * Program Headers, and to calculate the entire
949 * size of the ELF mapping (total_size). (Note that
950 * load_addr_set is set to true later once the
951 * initial mapping is performed.)
952 *
953 * There are effectively two types of ET_DYN
954 * binaries: programs (i.e. PIE: ET_DYN with INTERP)
955 * and loaders (ET_DYN without INTERP, since they
956 * _are_ the ELF interpreter). The loaders must
957 * be loaded away from programs since the program
958 * may otherwise collide with the loader (especially
959 * for ET_EXEC which does not have a randomized
960 * position). For example to handle invocations of
961 * "./ld.so someprog" to test out a new version of
962 * the loader, the subsequent program that the
963 * loader loads must avoid the loader itself, so
964 * they cannot share the same load range. Sufficient
965 * room for the brk must be allocated with the
966 * loader as well, since brk must be available with
967 * the loader.
968 *
969 * Therefore, programs are loaded offset from
970 * ELF_ET_DYN_BASE and loaders are loaded into the
971 * independently randomized mmap region (0 load_bias
972 * without MAP_FIXED).
973 */
974 if (elf_interpreter) {
975 load_bias = ELF_ET_DYN_BASE;
976 if (current->flags & PF_RANDOMIZE)
977 load_bias += arch_mmap_rnd();
978 elf_flags |= MAP_FIXED;
979 } else
980 load_bias = 0;
981
982 /*
983 * Since load_bias is used for all subsequent loading
984 * calculations, we must lower it by the first vaddr
985 * so that the remaining calculations based on the
986 * ELF vaddrs will be correctly offset. The result
987 * is then page aligned.
988 */
989 load_bias = ELF_PAGESTART(load_bias - vaddr);
990
Michael Davidsona87938b2015-04-14 15:47:38 -0700991 total_size = total_mapping_size(elf_phdata,
992 loc->elf_ex.e_phnum);
993 if (!total_size) {
Andrew Morton2b1d3ae2015-05-28 15:44:24 -0700994 retval = -EINVAL;
Michael Davidsona87938b2015-04-14 15:47:38 -0700995 goto out_free_dentry;
996 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700997 }
998
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700999 error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt,
Michael Davidsona87938b2015-04-14 15:47:38 -07001000 elf_prot, elf_flags, total_size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001001 if (BAD_ADDR(error)) {
Alexey Kuznetsovb140f2512007-05-08 00:31:57 -07001002 retval = IS_ERR((void *)error) ?
1003 PTR_ERR((void*)error) : -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001004 goto out_free_dentry;
1005 }
1006
1007 if (!load_addr_set) {
1008 load_addr_set = 1;
1009 load_addr = (elf_ppnt->p_vaddr - elf_ppnt->p_offset);
1010 if (loc->elf_ex.e_type == ET_DYN) {
1011 load_bias += error -
1012 ELF_PAGESTART(load_bias + vaddr);
1013 load_addr += load_bias;
1014 reloc_func_desc = load_bias;
1015 }
1016 }
1017 k = elf_ppnt->p_vaddr;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001018 if (k < start_code)
1019 start_code = k;
1020 if (start_data < k)
1021 start_data = k;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001022
1023 /*
1024 * Check to see if the section's size will overflow the
1025 * allowed task size. Note that p_filesz must always be
1026 * <= p_memsz so it is only necessary to check p_memsz.
1027 */
Chuck Ebbertce510592006-07-03 00:24:14 -07001028 if (BAD_ADDR(k) || elf_ppnt->p_filesz > elf_ppnt->p_memsz ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07001029 elf_ppnt->p_memsz > TASK_SIZE ||
1030 TASK_SIZE - elf_ppnt->p_memsz < k) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001031 /* set_brk can never work. Avoid overflows. */
Alexey Kuznetsovb140f2512007-05-08 00:31:57 -07001032 retval = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001033 goto out_free_dentry;
1034 }
1035
1036 k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz;
1037
1038 if (k > elf_bss)
1039 elf_bss = k;
1040 if ((elf_ppnt->p_flags & PF_X) && end_code < k)
1041 end_code = k;
1042 if (end_data < k)
1043 end_data = k;
1044 k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz;
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001045 if (k > elf_brk) {
1046 bss_prot = elf_prot;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001047 elf_brk = k;
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001048 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001049 }
1050
1051 loc->elf_ex.e_entry += load_bias;
1052 elf_bss += load_bias;
1053 elf_brk += load_bias;
1054 start_code += load_bias;
1055 end_code += load_bias;
1056 start_data += load_bias;
1057 end_data += load_bias;
1058
1059 /* Calling set_brk effectively mmaps the pages that we need
1060 * for the bss and break sections. We must do this before
1061 * mapping in the interpreter, to make sure it doesn't wind
1062 * up getting placed where the bss needs to go.
1063 */
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001064 retval = set_brk(elf_bss, elf_brk, bss_prot);
Al Viro19d860a2014-05-04 20:11:36 -04001065 if (retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001066 goto out_free_dentry;
akpm@osdl.org6de50512005-10-11 08:29:08 -07001067 if (likely(elf_bss != elf_brk) && unlikely(padzero(elf_bss))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001068 retval = -EFAULT; /* Nobody gets to see this, but.. */
1069 goto out_free_dentry;
1070 }
1071
1072 if (elf_interpreter) {
Alan Cox6eec4822012-10-04 17:13:42 -07001073 unsigned long interp_map_addr = 0;
Jiri Kosinacc503c12008-01-30 13:31:07 +01001074
Andi Kleend20894a2008-02-08 04:21:54 -08001075 elf_entry = load_elf_interp(&loc->interp_elf_ex,
1076 interpreter,
1077 &interp_map_addr,
Paul Burtona9d9ef12014-09-11 08:30:15 +01001078 load_bias, interp_elf_phdata);
Andi Kleend20894a2008-02-08 04:21:54 -08001079 if (!IS_ERR((void *)elf_entry)) {
1080 /*
1081 * load_elf_interp() returns relocation
1082 * adjustment
1083 */
1084 interp_load_addr = elf_entry;
1085 elf_entry += loc->interp_elf_ex.e_entry;
Jiri Kosinacc503c12008-01-30 13:31:07 +01001086 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001087 if (BAD_ADDR(elf_entry)) {
Chuck Ebbertce510592006-07-03 00:24:14 -07001088 retval = IS_ERR((void *)elf_entry) ?
1089 (int)elf_entry : -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001090 goto out_free_dentry;
1091 }
1092 reloc_func_desc = interp_load_addr;
1093
1094 allow_write_access(interpreter);
1095 fput(interpreter);
1096 kfree(elf_interpreter);
1097 } else {
1098 elf_entry = loc->elf_ex.e_entry;
Suresh Siddha5342fba2006-02-26 04:18:28 +01001099 if (BAD_ADDR(elf_entry)) {
Chuck Ebbertce510592006-07-03 00:24:14 -07001100 retval = -EINVAL;
Suresh Siddha5342fba2006-02-26 04:18:28 +01001101 goto out_free_dentry;
1102 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001103 }
1104
Paul Burton774c1052014-09-11 08:30:16 +01001105 kfree(interp_elf_phdata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001106 kfree(elf_phdata);
1107
Linus Torvalds1da177e2005-04-16 15:20:36 -07001108 set_binfmt(&elf_format);
1109
Benjamin Herrenschmidt547ee842005-04-16 15:24:35 -07001110#ifdef ARCH_HAS_SETUP_ADDITIONAL_PAGES
Martin Schwidefskyfc5243d2008-12-25 13:38:35 +01001111 retval = arch_setup_additional_pages(bprm, !!elf_interpreter);
Al Viro19d860a2014-05-04 20:11:36 -04001112 if (retval < 0)
Roland McGrath18c8baff2005-04-28 15:17:19 -07001113 goto out;
Benjamin Herrenschmidt547ee842005-04-16 15:24:35 -07001114#endif /* ARCH_HAS_SETUP_ADDITIONAL_PAGES */
1115
Ollie Wildb6a2fea2007-07-19 01:48:16 -07001116 retval = create_elf_tables(bprm, &loc->elf_ex,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001117 load_addr, interp_load_addr);
Al Viro19d860a2014-05-04 20:11:36 -04001118 if (retval < 0)
Ollie Wildb6a2fea2007-07-19 01:48:16 -07001119 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001120 /* N.B. passed_fileno might not be initialized? */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001121 current->mm->end_code = end_code;
1122 current->mm->start_code = start_code;
1123 current->mm->start_data = start_data;
1124 current->mm->end_data = end_data;
1125 current->mm->start_stack = bprm->p;
1126
Jiri Kosina4471a672011-04-14 15:22:09 -07001127 if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1)) {
Jiri Kosinac1d171a2008-01-30 13:30:40 +01001128 current->mm->brk = current->mm->start_brk =
1129 arch_randomize_brk(current->mm);
Kees Cook204db6e2015-04-14 15:48:12 -07001130#ifdef compat_brk_randomized
Jiri Kosina4471a672011-04-14 15:22:09 -07001131 current->brk_randomized = 1;
1132#endif
1133 }
Jiri Kosinac1d171a2008-01-30 13:30:40 +01001134
Linus Torvalds1da177e2005-04-16 15:20:36 -07001135 if (current->personality & MMAP_PAGE_ZERO) {
1136 /* Why this, you ask??? Well SVr4 maps page 0 as read-only,
1137 and some applications "depend" upon this behavior.
1138 Since we do not have the power to recompile these, we
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001139 emulate the SVr4 behavior. Sigh. */
Linus Torvalds6be5ceb2012-04-20 17:13:58 -07001140 error = vm_mmap(NULL, 0, PAGE_SIZE, PROT_READ | PROT_EXEC,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001141 MAP_FIXED | MAP_PRIVATE, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001142 }
1143
1144#ifdef ELF_PLAT_INIT
1145 /*
1146 * The ABI may specify that certain registers be set up in special
1147 * ways (on i386 %edx is the address of a DT_FINI function, for
1148 * example. In addition, it may also specify (eg, PowerPC64 ELF)
1149 * that the e_entry field is the address of the function descriptor
1150 * for the startup routine, rather than the address of the startup
1151 * routine itself. This macro performs whatever initialization to
1152 * the regs structure is required as well as any relocations to the
1153 * function descriptor entries when executing dynamically links apps.
1154 */
1155 ELF_PLAT_INIT(regs, reloc_func_desc);
1156#endif
1157
Kees Cookb8383832018-04-10 16:34:57 -07001158 finalize_exec(bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001159 start_thread(regs, elf_entry, bprm->p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001160 retval = 0;
1161out:
1162 kfree(loc);
1163out_ret:
1164 return retval;
1165
1166 /* error cleanup */
1167out_free_dentry:
Paul Burtona9d9ef12014-09-11 08:30:15 +01001168 kfree(interp_elf_phdata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001169 allow_write_access(interpreter);
1170 if (interpreter)
1171 fput(interpreter);
1172out_free_interp:
Jesper Juhlf99d49a2005-11-07 01:01:34 -08001173 kfree(elf_interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001174out_free_ph:
1175 kfree(elf_phdata);
1176 goto out;
1177}
1178
Josh Triplett69369a72014-04-03 14:48:27 -07001179#ifdef CONFIG_USELIB
Linus Torvalds1da177e2005-04-16 15:20:36 -07001180/* This is really simpleminded and specialized - we are loading an
1181 a.out library that is given an ELF header. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001182static int load_elf_library(struct file *file)
1183{
1184 struct elf_phdr *elf_phdata;
1185 struct elf_phdr *eppnt;
1186 unsigned long elf_bss, bss, len;
1187 int retval, error, i, j;
1188 struct elfhdr elf_ex;
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +02001189 loff_t pos = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001190
1191 error = -ENOEXEC;
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +02001192 retval = kernel_read(file, &elf_ex, sizeof(elf_ex), &pos);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001193 if (retval != sizeof(elf_ex))
1194 goto out;
1195
1196 if (memcmp(elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
1197 goto out;
1198
1199 /* First of all, some simple consistency checks */
1200 if (elf_ex.e_type != ET_EXEC || elf_ex.e_phnum > 2 ||
Al Viro72c2d532013-09-22 16:27:52 -04001201 !elf_check_arch(&elf_ex) || !file->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001202 goto out;
Nicolas Pitre47552002017-08-16 16:05:13 -04001203 if (elf_check_fdpic(&elf_ex))
1204 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001205
1206 /* Now read in all of the header information */
1207
1208 j = sizeof(struct elf_phdr) * elf_ex.e_phnum;
1209 /* j < ELF_MIN_ALIGN because elf_ex.e_phnum <= 2 */
1210
1211 error = -ENOMEM;
1212 elf_phdata = kmalloc(j, GFP_KERNEL);
1213 if (!elf_phdata)
1214 goto out;
1215
1216 eppnt = elf_phdata;
1217 error = -ENOEXEC;
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +02001218 pos = elf_ex.e_phoff;
1219 retval = kernel_read(file, eppnt, j, &pos);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001220 if (retval != j)
1221 goto out_free_ph;
1222
1223 for (j = 0, i = 0; i<elf_ex.e_phnum; i++)
1224 if ((eppnt + i)->p_type == PT_LOAD)
1225 j++;
1226 if (j != 1)
1227 goto out_free_ph;
1228
1229 while (eppnt->p_type != PT_LOAD)
1230 eppnt++;
1231
1232 /* Now use mmap to map the library into memory. */
Linus Torvalds6be5ceb2012-04-20 17:13:58 -07001233 error = vm_mmap(file,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001234 ELF_PAGESTART(eppnt->p_vaddr),
1235 (eppnt->p_filesz +
1236 ELF_PAGEOFFSET(eppnt->p_vaddr)),
1237 PROT_READ | PROT_WRITE | PROT_EXEC,
1238 MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE,
1239 (eppnt->p_offset -
1240 ELF_PAGEOFFSET(eppnt->p_vaddr)));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001241 if (error != ELF_PAGESTART(eppnt->p_vaddr))
1242 goto out_free_ph;
1243
1244 elf_bss = eppnt->p_vaddr + eppnt->p_filesz;
1245 if (padzero(elf_bss)) {
1246 error = -EFAULT;
1247 goto out_free_ph;
1248 }
1249
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001250 len = ELF_PAGESTART(eppnt->p_filesz + eppnt->p_vaddr +
1251 ELF_MIN_ALIGN - 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001252 bss = eppnt->p_memsz + eppnt->p_vaddr;
Michal Hockoecc2bc82016-05-23 16:25:39 -07001253 if (bss > len) {
1254 error = vm_brk(len, bss - len);
Linus Torvalds5d22fc22016-05-27 15:57:31 -07001255 if (error)
Michal Hockoecc2bc82016-05-23 16:25:39 -07001256 goto out_free_ph;
1257 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001258 error = 0;
1259
1260out_free_ph:
1261 kfree(elf_phdata);
1262out:
1263 return error;
1264}
Josh Triplett69369a72014-04-03 14:48:27 -07001265#endif /* #ifdef CONFIG_USELIB */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001266
Christoph Hellwig698ba7b2009-12-15 16:47:37 -08001267#ifdef CONFIG_ELF_CORE
Linus Torvalds1da177e2005-04-16 15:20:36 -07001268/*
1269 * ELF core dumper
1270 *
1271 * Modelled on fs/exec.c:aout_core_dump()
1272 * Jeremy Fitzhardinge <jeremy@sw.oz.au>
1273 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001274
1275/*
Jason Baron909af762012-03-23 15:02:51 -07001276 * The purpose of always_dump_vma() is to make sure that special kernel mappings
1277 * that are useful for post-mortem analysis are included in every core dump.
1278 * In that way we ensure that the core dump is fully interpretable later
1279 * without matching up the same kernel and hardware config to see what PC values
1280 * meant. These special mappings include - vDSO, vsyscall, and other
1281 * architecture specific mappings
1282 */
1283static bool always_dump_vma(struct vm_area_struct *vma)
1284{
1285 /* Any vsyscall mappings? */
1286 if (vma == get_gate_vma(vma->vm_mm))
1287 return true;
Andy Lutomirski78d683e2014-05-19 15:58:32 -07001288
1289 /*
1290 * Assume that all vmas with a .name op should always be dumped.
1291 * If this changes, a new vm_ops field can easily be added.
1292 */
1293 if (vma->vm_ops && vma->vm_ops->name && vma->vm_ops->name(vma))
1294 return true;
1295
Jason Baron909af762012-03-23 15:02:51 -07001296 /*
1297 * arch_vma_name() returns non-NULL for special architecture mappings,
1298 * such as vDSO sections.
1299 */
1300 if (arch_vma_name(vma))
1301 return true;
1302
1303 return false;
1304}
1305
1306/*
Roland McGrath82df3972007-10-16 23:27:02 -07001307 * Decide what to dump of a segment, part, all or none.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001308 */
Roland McGrath82df3972007-10-16 23:27:02 -07001309static unsigned long vma_dump_size(struct vm_area_struct *vma,
1310 unsigned long mm_flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001311{
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001312#define FILTER(type) (mm_flags & (1UL << MMF_DUMP_##type))
1313
Jason Baron909af762012-03-23 15:02:51 -07001314 /* always dump the vdso and vsyscall sections */
1315 if (always_dump_vma(vma))
Roland McGrath82df3972007-10-16 23:27:02 -07001316 goto whole;
Roland McGrathe5b97dd2007-01-26 00:56:48 -08001317
Konstantin Khlebnikov0103bd12012-10-08 16:28:59 -07001318 if (vma->vm_flags & VM_DONTDUMP)
Jason Baronaccb61f2012-03-23 15:02:51 -07001319 return 0;
1320
Ross Zwisler50378352015-10-05 16:33:36 -06001321 /* support for DAX */
1322 if (vma_is_dax(vma)) {
1323 if ((vma->vm_flags & VM_SHARED) && FILTER(DAX_SHARED))
1324 goto whole;
1325 if (!(vma->vm_flags & VM_SHARED) && FILTER(DAX_PRIVATE))
1326 goto whole;
1327 return 0;
1328 }
1329
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001330 /* Hugetlb memory check */
1331 if (vma->vm_flags & VM_HUGETLB) {
1332 if ((vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_SHARED))
1333 goto whole;
1334 if (!(vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_PRIVATE))
1335 goto whole;
Naoya Horiguchi23d9e482013-04-17 15:58:28 -07001336 return 0;
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001337 }
1338
Linus Torvalds1da177e2005-04-16 15:20:36 -07001339 /* Do not dump I/O mapped devices or special mappings */
Konstantin Khlebnikov314e51b2012-10-08 16:29:02 -07001340 if (vma->vm_flags & VM_IO)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001341 return 0;
1342
Kawai, Hidehiroa1b59e82007-07-19 01:48:29 -07001343 /* By default, dump shared memory if mapped from an anonymous file. */
1344 if (vma->vm_flags & VM_SHARED) {
Al Viro496ad9a2013-01-23 17:07:38 -05001345 if (file_inode(vma->vm_file)->i_nlink == 0 ?
Roland McGrath82df3972007-10-16 23:27:02 -07001346 FILTER(ANON_SHARED) : FILTER(MAPPED_SHARED))
1347 goto whole;
1348 return 0;
Kawai, Hidehiroa1b59e82007-07-19 01:48:29 -07001349 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001350
Roland McGrath82df3972007-10-16 23:27:02 -07001351 /* Dump segments that have been written to. */
1352 if (vma->anon_vma && FILTER(ANON_PRIVATE))
1353 goto whole;
1354 if (vma->vm_file == NULL)
1355 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001356
Roland McGrath82df3972007-10-16 23:27:02 -07001357 if (FILTER(MAPPED_PRIVATE))
1358 goto whole;
1359
1360 /*
1361 * If this looks like the beginning of a DSO or executable mapping,
1362 * check for an ELF header. If we find one, dump the first page to
1363 * aid in determining what was mapped here.
1364 */
Roland McGrath92dc07b2009-02-06 17:34:07 -08001365 if (FILTER(ELF_HEADERS) &&
1366 vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) {
Roland McGrath82df3972007-10-16 23:27:02 -07001367 u32 __user *header = (u32 __user *) vma->vm_start;
1368 u32 word;
Roland McGrath92dc07b2009-02-06 17:34:07 -08001369 mm_segment_t fs = get_fs();
Roland McGrath82df3972007-10-16 23:27:02 -07001370 /*
1371 * Doing it this way gets the constant folded by GCC.
1372 */
1373 union {
1374 u32 cmp;
1375 char elfmag[SELFMAG];
1376 } magic;
1377 BUILD_BUG_ON(SELFMAG != sizeof word);
1378 magic.elfmag[EI_MAG0] = ELFMAG0;
1379 magic.elfmag[EI_MAG1] = ELFMAG1;
1380 magic.elfmag[EI_MAG2] = ELFMAG2;
1381 magic.elfmag[EI_MAG3] = ELFMAG3;
Roland McGrath92dc07b2009-02-06 17:34:07 -08001382 /*
1383 * Switch to the user "segment" for get_user(),
1384 * then put back what elf_core_dump() had in place.
1385 */
1386 set_fs(USER_DS);
1387 if (unlikely(get_user(word, header)))
1388 word = 0;
1389 set_fs(fs);
1390 if (word == magic.cmp)
Roland McGrath82df3972007-10-16 23:27:02 -07001391 return PAGE_SIZE;
1392 }
1393
1394#undef FILTER
1395
1396 return 0;
1397
1398whole:
1399 return vma->vm_end - vma->vm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001400}
1401
Linus Torvalds1da177e2005-04-16 15:20:36 -07001402/* An ELF note in memory */
1403struct memelfnote
1404{
1405 const char *name;
1406 int type;
1407 unsigned int datasz;
1408 void *data;
1409};
1410
1411static int notesize(struct memelfnote *en)
1412{
1413 int sz;
1414
1415 sz = sizeof(struct elf_note);
1416 sz += roundup(strlen(en->name) + 1, 4);
1417 sz += roundup(en->datasz, 4);
1418
1419 return sz;
1420}
1421
Al Viroecc8c772013-10-05 15:32:35 -04001422static int writenote(struct memelfnote *men, struct coredump_params *cprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001423{
1424 struct elf_note en;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001425 en.n_namesz = strlen(men->name) + 1;
1426 en.n_descsz = men->datasz;
1427 en.n_type = men->type;
1428
Al Viroecc8c772013-10-05 15:32:35 -04001429 return dump_emit(cprm, &en, sizeof(en)) &&
Al Viro22a8cb82013-10-08 11:05:01 -04001430 dump_emit(cprm, men->name, en.n_namesz) && dump_align(cprm, 4) &&
1431 dump_emit(cprm, men->data, men->datasz) && dump_align(cprm, 4);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001432}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001433
Roland McGrath3aba4812008-01-30 13:31:44 +01001434static void fill_elf_header(struct elfhdr *elf, int segs,
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001435 u16 machine, u32 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001436{
Cyrill Gorcunov6970c8e2008-04-29 01:01:18 -07001437 memset(elf, 0, sizeof(*elf));
1438
Linus Torvalds1da177e2005-04-16 15:20:36 -07001439 memcpy(elf->e_ident, ELFMAG, SELFMAG);
1440 elf->e_ident[EI_CLASS] = ELF_CLASS;
1441 elf->e_ident[EI_DATA] = ELF_DATA;
1442 elf->e_ident[EI_VERSION] = EV_CURRENT;
1443 elf->e_ident[EI_OSABI] = ELF_OSABI;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001444
1445 elf->e_type = ET_CORE;
Roland McGrath3aba4812008-01-30 13:31:44 +01001446 elf->e_machine = machine;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001447 elf->e_version = EV_CURRENT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001448 elf->e_phoff = sizeof(struct elfhdr);
Roland McGrath3aba4812008-01-30 13:31:44 +01001449 elf->e_flags = flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001450 elf->e_ehsize = sizeof(struct elfhdr);
1451 elf->e_phentsize = sizeof(struct elf_phdr);
1452 elf->e_phnum = segs;
Cyrill Gorcunov6970c8e2008-04-29 01:01:18 -07001453
Linus Torvalds1da177e2005-04-16 15:20:36 -07001454 return;
1455}
1456
Andrew Morton8d6b5eee2006-09-25 23:32:04 -07001457static void fill_elf_note_phdr(struct elf_phdr *phdr, int sz, loff_t offset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001458{
1459 phdr->p_type = PT_NOTE;
1460 phdr->p_offset = offset;
1461 phdr->p_vaddr = 0;
1462 phdr->p_paddr = 0;
1463 phdr->p_filesz = sz;
1464 phdr->p_memsz = 0;
1465 phdr->p_flags = 0;
1466 phdr->p_align = 0;
1467 return;
1468}
1469
1470static void fill_note(struct memelfnote *note, const char *name, int type,
1471 unsigned int sz, void *data)
1472{
1473 note->name = name;
1474 note->type = type;
1475 note->datasz = sz;
1476 note->data = data;
1477 return;
1478}
1479
1480/*
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001481 * fill up all the fields in prstatus from the given task struct, except
1482 * registers which need to be filled up separately.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001483 */
1484static void fill_prstatus(struct elf_prstatus *prstatus,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001485 struct task_struct *p, long signr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001486{
1487 prstatus->pr_info.si_signo = prstatus->pr_cursig = signr;
1488 prstatus->pr_sigpend = p->pending.signal.sig[0];
1489 prstatus->pr_sighold = p->blocked.sig[0];
Oleg Nesterov3b34fc52009-06-17 16:27:38 -07001490 rcu_read_lock();
1491 prstatus->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1492 rcu_read_unlock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001493 prstatus->pr_pid = task_pid_vnr(p);
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001494 prstatus->pr_pgrp = task_pgrp_vnr(p);
1495 prstatus->pr_sid = task_session_vnr(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001496 if (thread_group_leader(p)) {
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001497 struct task_cputime cputime;
Frank Mayharf06febc2008-09-12 09:54:39 -07001498
Linus Torvalds1da177e2005-04-16 15:20:36 -07001499 /*
Frank Mayharf06febc2008-09-12 09:54:39 -07001500 * This is the record for the group leader. It shows the
1501 * group-wide total, not its individual thread total.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001502 */
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001503 thread_group_cputime(p, &cputime);
1504 prstatus->pr_utime = ns_to_timeval(cputime.utime);
1505 prstatus->pr_stime = ns_to_timeval(cputime.stime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001506 } else {
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001507 u64 utime, stime;
Frederic Weisbecker6fac4822012-11-13 14:20:55 +01001508
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001509 task_cputime(p, &utime, &stime);
1510 prstatus->pr_utime = ns_to_timeval(utime);
1511 prstatus->pr_stime = ns_to_timeval(stime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001512 }
Frederic Weisbecker5613fda2017-01-31 04:09:23 +01001513
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001514 prstatus->pr_cutime = ns_to_timeval(p->signal->cutime);
1515 prstatus->pr_cstime = ns_to_timeval(p->signal->cstime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001516}
1517
1518static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p,
1519 struct mm_struct *mm)
1520{
David Howellsc69e8d92008-11-14 10:39:19 +11001521 const struct cred *cred;
Greg Kroah-Hartmana84a5052005-05-11 00:10:44 -07001522 unsigned int i, len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001523
1524 /* first copy the parameters from user space */
1525 memset(psinfo, 0, sizeof(struct elf_prpsinfo));
1526
1527 len = mm->arg_end - mm->arg_start;
1528 if (len >= ELF_PRARGSZ)
1529 len = ELF_PRARGSZ-1;
1530 if (copy_from_user(&psinfo->pr_psargs,
1531 (const char __user *)mm->arg_start, len))
1532 return -EFAULT;
1533 for(i = 0; i < len; i++)
1534 if (psinfo->pr_psargs[i] == 0)
1535 psinfo->pr_psargs[i] = ' ';
1536 psinfo->pr_psargs[len] = 0;
1537
Oleg Nesterov3b34fc52009-06-17 16:27:38 -07001538 rcu_read_lock();
1539 psinfo->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1540 rcu_read_unlock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001541 psinfo->pr_pid = task_pid_vnr(p);
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001542 psinfo->pr_pgrp = task_pgrp_vnr(p);
1543 psinfo->pr_sid = task_session_vnr(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001544
1545 i = p->state ? ffz(~p->state) + 1 : 0;
1546 psinfo->pr_state = i;
Carsten Otte55148542006-03-25 03:08:22 -08001547 psinfo->pr_sname = (i > 5) ? '.' : "RSDTZW"[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001548 psinfo->pr_zomb = psinfo->pr_sname == 'Z';
1549 psinfo->pr_nice = task_nice(p);
1550 psinfo->pr_flag = p->flags;
David Howellsc69e8d92008-11-14 10:39:19 +11001551 rcu_read_lock();
1552 cred = __task_cred(p);
Eric W. Biedermanebc887b2012-02-07 18:36:10 -08001553 SET_UID(psinfo->pr_uid, from_kuid_munged(cred->user_ns, cred->uid));
1554 SET_GID(psinfo->pr_gid, from_kgid_munged(cred->user_ns, cred->gid));
David Howellsc69e8d92008-11-14 10:39:19 +11001555 rcu_read_unlock();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001556 strncpy(psinfo->pr_fname, p->comm, sizeof(psinfo->pr_fname));
1557
1558 return 0;
1559}
1560
Roland McGrath3aba4812008-01-30 13:31:44 +01001561static void fill_auxv_note(struct memelfnote *note, struct mm_struct *mm)
1562{
1563 elf_addr_t *auxv = (elf_addr_t *) mm->saved_auxv;
1564 int i = 0;
1565 do
1566 i += 2;
1567 while (auxv[i - 2] != AT_NULL);
1568 fill_note(note, "CORE", NT_AUXV, i * sizeof(elf_addr_t), auxv);
1569}
1570
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001571static void fill_siginfo_note(struct memelfnote *note, user_siginfo_t *csigdata,
Al Viroce395962013-10-13 17:23:53 -04001572 const siginfo_t *siginfo)
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001573{
1574 mm_segment_t old_fs = get_fs();
1575 set_fs(KERNEL_DS);
1576 copy_siginfo_to_user((user_siginfo_t __user *) csigdata, siginfo);
1577 set_fs(old_fs);
1578 fill_note(note, "CORE", NT_SIGINFO, sizeof(*csigdata), csigdata);
1579}
1580
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001581#define MAX_FILE_NOTE_SIZE (4*1024*1024)
1582/*
1583 * Format of NT_FILE note:
1584 *
1585 * long count -- how many files are mapped
1586 * long page_size -- units for file_ofs
1587 * array of [COUNT] elements of
1588 * long start
1589 * long end
1590 * long file_ofs
1591 * followed by COUNT filenames in ASCII: "FILE1" NUL "FILE2" NUL...
1592 */
Dan Aloni72023652013-09-30 13:45:02 -07001593static int fill_files_note(struct memelfnote *note)
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001594{
1595 struct vm_area_struct *vma;
1596 unsigned count, size, names_ofs, remaining, n;
1597 user_long_t *data;
1598 user_long_t *start_end_ofs;
1599 char *name_base, *name_curpos;
1600
1601 /* *Estimated* file count and total data size needed */
1602 count = current->mm->map_count;
Alexey Dobriyan60c9d922018-02-06 15:39:13 -08001603 if (count > UINT_MAX / 64)
1604 return -EINVAL;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001605 size = count * 64;
1606
1607 names_ofs = (2 + 3 * count) * sizeof(data[0]);
1608 alloc:
1609 if (size >= MAX_FILE_NOTE_SIZE) /* paranoia check */
Dan Aloni72023652013-09-30 13:45:02 -07001610 return -EINVAL;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001611 size = round_up(size, PAGE_SIZE);
1612 data = vmalloc(size);
1613 if (!data)
Dan Aloni72023652013-09-30 13:45:02 -07001614 return -ENOMEM;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001615
1616 start_end_ofs = data + 2;
1617 name_base = name_curpos = ((char *)data) + names_ofs;
1618 remaining = size - names_ofs;
1619 count = 0;
1620 for (vma = current->mm->mmap; vma != NULL; vma = vma->vm_next) {
1621 struct file *file;
1622 const char *filename;
1623
1624 file = vma->vm_file;
1625 if (!file)
1626 continue;
Miklos Szeredi9bf39ab2015-06-19 10:29:13 +02001627 filename = file_path(file, name_curpos, remaining);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001628 if (IS_ERR(filename)) {
1629 if (PTR_ERR(filename) == -ENAMETOOLONG) {
1630 vfree(data);
1631 size = size * 5 / 4;
1632 goto alloc;
1633 }
1634 continue;
1635 }
1636
Miklos Szeredi9bf39ab2015-06-19 10:29:13 +02001637 /* file_path() fills at the end, move name down */
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001638 /* n = strlen(filename) + 1: */
1639 n = (name_curpos + remaining) - filename;
1640 remaining = filename - name_curpos;
1641 memmove(name_curpos, filename, n);
1642 name_curpos += n;
1643
1644 *start_end_ofs++ = vma->vm_start;
1645 *start_end_ofs++ = vma->vm_end;
1646 *start_end_ofs++ = vma->vm_pgoff;
1647 count++;
1648 }
1649
1650 /* Now we know exact count of files, can store it */
1651 data[0] = count;
1652 data[1] = PAGE_SIZE;
1653 /*
1654 * Count usually is less than current->mm->map_count,
1655 * we need to move filenames down.
1656 */
1657 n = current->mm->map_count - count;
1658 if (n != 0) {
1659 unsigned shift_bytes = n * 3 * sizeof(data[0]);
1660 memmove(name_base - shift_bytes, name_base,
1661 name_curpos - name_base);
1662 name_curpos -= shift_bytes;
1663 }
1664
1665 size = name_curpos - (char *)data;
1666 fill_note(note, "CORE", NT_FILE, size, data);
Dan Aloni72023652013-09-30 13:45:02 -07001667 return 0;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001668}
1669
Roland McGrath4206d3a2008-01-30 13:31:45 +01001670#ifdef CORE_DUMP_USE_REGSET
1671#include <linux/regset.h>
1672
1673struct elf_thread_core_info {
1674 struct elf_thread_core_info *next;
1675 struct task_struct *task;
1676 struct elf_prstatus prstatus;
1677 struct memelfnote notes[0];
1678};
1679
1680struct elf_note_info {
1681 struct elf_thread_core_info *thread;
1682 struct memelfnote psinfo;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001683 struct memelfnote signote;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001684 struct memelfnote auxv;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001685 struct memelfnote files;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001686 user_siginfo_t csigdata;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001687 size_t size;
1688 int thread_notes;
1689};
1690
Roland McGrathd31472b2008-03-04 14:28:30 -08001691/*
1692 * When a regset has a writeback hook, we call it on each thread before
1693 * dumping user memory. On register window machines, this makes sure the
1694 * user memory backing the register data is up to date before we read it.
1695 */
1696static void do_thread_regset_writeback(struct task_struct *task,
1697 const struct user_regset *regset)
1698{
1699 if (regset->writeback)
1700 regset->writeback(task, regset, 1);
1701}
1702
H. J. Lu0953f65d2012-02-14 13:34:52 -08001703#ifndef PRSTATUS_SIZE
Dmitry Safonov90954e72016-09-05 16:33:06 +03001704#define PRSTATUS_SIZE(S, R) sizeof(S)
H. J. Lu0953f65d2012-02-14 13:34:52 -08001705#endif
1706
1707#ifndef SET_PR_FPVALID
Dmitry Safonov90954e72016-09-05 16:33:06 +03001708#define SET_PR_FPVALID(S, V, R) ((S)->pr_fpvalid = (V))
H. J. Lu0953f65d2012-02-14 13:34:52 -08001709#endif
1710
Roland McGrath4206d3a2008-01-30 13:31:45 +01001711static int fill_thread_core_info(struct elf_thread_core_info *t,
1712 const struct user_regset_view *view,
1713 long signr, size_t *total)
1714{
1715 unsigned int i;
Dave Martin27e64b42017-10-31 15:50:53 +00001716 unsigned int regset0_size = regset_size(t->task, &view->regsets[0]);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001717
1718 /*
1719 * NT_PRSTATUS is the one special case, because the regset data
1720 * goes into the pr_reg field inside the note contents, rather
1721 * than being the whole note contents. We fill the reset in here.
1722 * We assume that regset 0 is NT_PRSTATUS.
1723 */
1724 fill_prstatus(&t->prstatus, t->task, signr);
Dave Martin27e64b42017-10-31 15:50:53 +00001725 (void) view->regsets[0].get(t->task, &view->regsets[0], 0, regset0_size,
Dmitry Safonov90954e72016-09-05 16:33:06 +03001726 &t->prstatus.pr_reg, NULL);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001727
1728 fill_note(&t->notes[0], "CORE", NT_PRSTATUS,
Dave Martin27e64b42017-10-31 15:50:53 +00001729 PRSTATUS_SIZE(t->prstatus, regset0_size), &t->prstatus);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001730 *total += notesize(&t->notes[0]);
1731
Roland McGrathd31472b2008-03-04 14:28:30 -08001732 do_thread_regset_writeback(t->task, &view->regsets[0]);
1733
Roland McGrath4206d3a2008-01-30 13:31:45 +01001734 /*
1735 * Each other regset might generate a note too. For each regset
1736 * that has no core_note_type or is inactive, we leave t->notes[i]
1737 * all zero and we'll know to skip writing it later.
1738 */
1739 for (i = 1; i < view->n; ++i) {
1740 const struct user_regset *regset = &view->regsets[i];
Roland McGrathd31472b2008-03-04 14:28:30 -08001741 do_thread_regset_writeback(t->task, regset);
H. Peter Anvinc8e25252012-03-02 10:43:48 -08001742 if (regset->core_note_type && regset->get &&
Roland McGrath4206d3a2008-01-30 13:31:45 +01001743 (!regset->active || regset->active(t->task, regset))) {
1744 int ret;
Dave Martin27e64b42017-10-31 15:50:53 +00001745 size_t size = regset_size(t->task, regset);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001746 void *data = kmalloc(size, GFP_KERNEL);
1747 if (unlikely(!data))
1748 return 0;
1749 ret = regset->get(t->task, regset,
1750 0, size, data, NULL);
1751 if (unlikely(ret))
1752 kfree(data);
1753 else {
1754 if (regset->core_note_type != NT_PRFPREG)
1755 fill_note(&t->notes[i], "LINUX",
1756 regset->core_note_type,
1757 size, data);
1758 else {
Dmitry Safonov90954e72016-09-05 16:33:06 +03001759 SET_PR_FPVALID(&t->prstatus,
Dave Martin27e64b42017-10-31 15:50:53 +00001760 1, regset0_size);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001761 fill_note(&t->notes[i], "CORE",
1762 NT_PRFPREG, size, data);
1763 }
1764 *total += notesize(&t->notes[i]);
1765 }
1766 }
1767 }
1768
1769 return 1;
1770}
1771
1772static int fill_note_info(struct elfhdr *elf, int phdrs,
1773 struct elf_note_info *info,
Al Viroec579412013-10-13 17:57:29 -04001774 const siginfo_t *siginfo, struct pt_regs *regs)
Roland McGrath4206d3a2008-01-30 13:31:45 +01001775{
1776 struct task_struct *dump_task = current;
1777 const struct user_regset_view *view = task_user_regset_view(dump_task);
1778 struct elf_thread_core_info *t;
1779 struct elf_prpsinfo *psinfo;
Oleg Nesterov83914442008-07-25 01:47:45 -07001780 struct core_thread *ct;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001781 unsigned int i;
1782
1783 info->size = 0;
1784 info->thread = NULL;
1785
1786 psinfo = kmalloc(sizeof(*psinfo), GFP_KERNEL);
Alan Cox6899e922012-12-17 16:02:09 -08001787 if (psinfo == NULL) {
1788 info->psinfo.data = NULL; /* So we don't free this wrongly */
Roland McGrath4206d3a2008-01-30 13:31:45 +01001789 return 0;
Alan Cox6899e922012-12-17 16:02:09 -08001790 }
Roland McGrath4206d3a2008-01-30 13:31:45 +01001791
Amerigo Wange2dbe122009-07-01 01:06:26 -04001792 fill_note(&info->psinfo, "CORE", NT_PRPSINFO, sizeof(*psinfo), psinfo);
1793
Roland McGrath4206d3a2008-01-30 13:31:45 +01001794 /*
1795 * Figure out how many notes we're going to need for each thread.
1796 */
1797 info->thread_notes = 0;
1798 for (i = 0; i < view->n; ++i)
1799 if (view->regsets[i].core_note_type != 0)
1800 ++info->thread_notes;
1801
1802 /*
1803 * Sanity check. We rely on regset 0 being in NT_PRSTATUS,
1804 * since it is our one special case.
1805 */
1806 if (unlikely(info->thread_notes == 0) ||
1807 unlikely(view->regsets[0].core_note_type != NT_PRSTATUS)) {
1808 WARN_ON(1);
1809 return 0;
1810 }
1811
1812 /*
1813 * Initialize the ELF file header.
1814 */
1815 fill_elf_header(elf, phdrs,
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001816 view->e_machine, view->e_flags);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001817
1818 /*
1819 * Allocate a structure for each thread.
1820 */
Oleg Nesterov83914442008-07-25 01:47:45 -07001821 for (ct = &dump_task->mm->core_state->dumper; ct; ct = ct->next) {
1822 t = kzalloc(offsetof(struct elf_thread_core_info,
1823 notes[info->thread_notes]),
1824 GFP_KERNEL);
1825 if (unlikely(!t))
1826 return 0;
Oleg Nesterov24d52882008-07-25 01:47:40 -07001827
Oleg Nesterov83914442008-07-25 01:47:45 -07001828 t->task = ct->task;
1829 if (ct->task == dump_task || !info->thread) {
1830 t->next = info->thread;
1831 info->thread = t;
1832 } else {
1833 /*
1834 * Make sure to keep the original task at
1835 * the head of the list.
1836 */
1837 t->next = info->thread->next;
1838 info->thread->next = t;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001839 }
Oleg Nesterov83914442008-07-25 01:47:45 -07001840 }
Roland McGrath4206d3a2008-01-30 13:31:45 +01001841
1842 /*
1843 * Now fill in each thread's information.
1844 */
1845 for (t = info->thread; t != NULL; t = t->next)
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07001846 if (!fill_thread_core_info(t, view, siginfo->si_signo, &info->size))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001847 return 0;
1848
1849 /*
1850 * Fill in the two process-wide notes.
1851 */
1852 fill_psinfo(psinfo, dump_task->group_leader, dump_task->mm);
1853 info->size += notesize(&info->psinfo);
1854
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001855 fill_siginfo_note(&info->signote, &info->csigdata, siginfo);
1856 info->size += notesize(&info->signote);
1857
Roland McGrath4206d3a2008-01-30 13:31:45 +01001858 fill_auxv_note(&info->auxv, current->mm);
1859 info->size += notesize(&info->auxv);
1860
Dan Aloni72023652013-09-30 13:45:02 -07001861 if (fill_files_note(&info->files) == 0)
1862 info->size += notesize(&info->files);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001863
Roland McGrath4206d3a2008-01-30 13:31:45 +01001864 return 1;
1865}
1866
1867static size_t get_note_info_size(struct elf_note_info *info)
1868{
1869 return info->size;
1870}
1871
1872/*
1873 * Write all the notes for each thread. When writing the first thread, the
1874 * process-wide notes are interleaved after the first thread-specific note.
1875 */
1876static int write_note_info(struct elf_note_info *info,
Al Viroecc8c772013-10-05 15:32:35 -04001877 struct coredump_params *cprm)
Roland McGrath4206d3a2008-01-30 13:31:45 +01001878{
Fabian Frederickb219e252014-06-04 16:12:14 -07001879 bool first = true;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001880 struct elf_thread_core_info *t = info->thread;
1881
1882 do {
1883 int i;
1884
Al Viroecc8c772013-10-05 15:32:35 -04001885 if (!writenote(&t->notes[0], cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001886 return 0;
1887
Al Viroecc8c772013-10-05 15:32:35 -04001888 if (first && !writenote(&info->psinfo, cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001889 return 0;
Al Viroecc8c772013-10-05 15:32:35 -04001890 if (first && !writenote(&info->signote, cprm))
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001891 return 0;
Al Viroecc8c772013-10-05 15:32:35 -04001892 if (first && !writenote(&info->auxv, cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001893 return 0;
Dan Aloni72023652013-09-30 13:45:02 -07001894 if (first && info->files.data &&
Al Viroecc8c772013-10-05 15:32:35 -04001895 !writenote(&info->files, cprm))
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001896 return 0;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001897
1898 for (i = 1; i < info->thread_notes; ++i)
1899 if (t->notes[i].data &&
Al Viroecc8c772013-10-05 15:32:35 -04001900 !writenote(&t->notes[i], cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001901 return 0;
1902
Fabian Frederickb219e252014-06-04 16:12:14 -07001903 first = false;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001904 t = t->next;
1905 } while (t);
1906
1907 return 1;
1908}
1909
1910static void free_note_info(struct elf_note_info *info)
1911{
1912 struct elf_thread_core_info *threads = info->thread;
1913 while (threads) {
1914 unsigned int i;
1915 struct elf_thread_core_info *t = threads;
1916 threads = t->next;
1917 WARN_ON(t->notes[0].data && t->notes[0].data != &t->prstatus);
1918 for (i = 1; i < info->thread_notes; ++i)
1919 kfree(t->notes[i].data);
1920 kfree(t);
1921 }
1922 kfree(info->psinfo.data);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001923 vfree(info->files.data);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001924}
1925
1926#else
1927
Linus Torvalds1da177e2005-04-16 15:20:36 -07001928/* Here is the structure in which status of each thread is captured. */
1929struct elf_thread_status
1930{
1931 struct list_head list;
1932 struct elf_prstatus prstatus; /* NT_PRSTATUS */
1933 elf_fpregset_t fpu; /* NT_PRFPREG */
1934 struct task_struct *thread;
1935#ifdef ELF_CORE_COPY_XFPREGS
Mark Nelson5b20cd82007-10-16 23:25:39 -07001936 elf_fpxregset_t xfpu; /* ELF_CORE_XFPREG_TYPE */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001937#endif
1938 struct memelfnote notes[3];
1939 int num_notes;
1940};
1941
1942/*
1943 * In order to add the specific thread information for the elf file format,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001944 * we need to keep a linked list of every threads pr_status and then create
1945 * a single section for them in the final core file.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001946 */
1947static int elf_dump_thread_status(long signr, struct elf_thread_status *t)
1948{
1949 int sz = 0;
1950 struct task_struct *p = t->thread;
1951 t->num_notes = 0;
1952
1953 fill_prstatus(&t->prstatus, p, signr);
1954 elf_core_copy_task_regs(p, &t->prstatus.pr_reg);
1955
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001956 fill_note(&t->notes[0], "CORE", NT_PRSTATUS, sizeof(t->prstatus),
1957 &(t->prstatus));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001958 t->num_notes++;
1959 sz += notesize(&t->notes[0]);
1960
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001961 if ((t->prstatus.pr_fpvalid = elf_core_copy_task_fpregs(p, NULL,
1962 &t->fpu))) {
1963 fill_note(&t->notes[1], "CORE", NT_PRFPREG, sizeof(t->fpu),
1964 &(t->fpu));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001965 t->num_notes++;
1966 sz += notesize(&t->notes[1]);
1967 }
1968
1969#ifdef ELF_CORE_COPY_XFPREGS
1970 if (elf_core_copy_task_xfpregs(p, &t->xfpu)) {
Mark Nelson5b20cd82007-10-16 23:25:39 -07001971 fill_note(&t->notes[2], "LINUX", ELF_CORE_XFPREG_TYPE,
1972 sizeof(t->xfpu), &t->xfpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001973 t->num_notes++;
1974 sz += notesize(&t->notes[2]);
1975 }
1976#endif
1977 return sz;
1978}
1979
Roland McGrath3aba4812008-01-30 13:31:44 +01001980struct elf_note_info {
1981 struct memelfnote *notes;
Dan Aloni72023652013-09-30 13:45:02 -07001982 struct memelfnote *notes_files;
Roland McGrath3aba4812008-01-30 13:31:44 +01001983 struct elf_prstatus *prstatus; /* NT_PRSTATUS */
1984 struct elf_prpsinfo *psinfo; /* NT_PRPSINFO */
1985 struct list_head thread_list;
1986 elf_fpregset_t *fpu;
1987#ifdef ELF_CORE_COPY_XFPREGS
1988 elf_fpxregset_t *xfpu;
1989#endif
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001990 user_siginfo_t csigdata;
Roland McGrath3aba4812008-01-30 13:31:44 +01001991 int thread_status_size;
1992 int numnote;
1993};
1994
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001995static int elf_note_info_init(struct elf_note_info *info)
Roland McGrath3aba4812008-01-30 13:31:44 +01001996{
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001997 memset(info, 0, sizeof(*info));
Roland McGrath3aba4812008-01-30 13:31:44 +01001998 INIT_LIST_HEAD(&info->thread_list);
1999
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07002000 /* Allocate space for ELF notes */
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07002001 info->notes = kmalloc(8 * sizeof(struct memelfnote), GFP_KERNEL);
Roland McGrath3aba4812008-01-30 13:31:44 +01002002 if (!info->notes)
2003 return 0;
2004 info->psinfo = kmalloc(sizeof(*info->psinfo), GFP_KERNEL);
2005 if (!info->psinfo)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002006 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002007 info->prstatus = kmalloc(sizeof(*info->prstatus), GFP_KERNEL);
2008 if (!info->prstatus)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002009 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002010 info->fpu = kmalloc(sizeof(*info->fpu), GFP_KERNEL);
2011 if (!info->fpu)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002012 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002013#ifdef ELF_CORE_COPY_XFPREGS
2014 info->xfpu = kmalloc(sizeof(*info->xfpu), GFP_KERNEL);
2015 if (!info->xfpu)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002016 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002017#endif
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002018 return 1;
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002019}
Roland McGrath3aba4812008-01-30 13:31:44 +01002020
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002021static int fill_note_info(struct elfhdr *elf, int phdrs,
2022 struct elf_note_info *info,
Al Viroec579412013-10-13 17:57:29 -04002023 const siginfo_t *siginfo, struct pt_regs *regs)
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002024{
2025 struct list_head *t;
Al Viroafabada2013-10-14 07:39:56 -04002026 struct core_thread *ct;
2027 struct elf_thread_status *ets;
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002028
2029 if (!elf_note_info_init(info))
2030 return 0;
2031
Al Viroafabada2013-10-14 07:39:56 -04002032 for (ct = current->mm->core_state->dumper.next;
2033 ct; ct = ct->next) {
2034 ets = kzalloc(sizeof(*ets), GFP_KERNEL);
2035 if (!ets)
2036 return 0;
Oleg Nesterov24d52882008-07-25 01:47:40 -07002037
Al Viroafabada2013-10-14 07:39:56 -04002038 ets->thread = ct->task;
2039 list_add(&ets->list, &info->thread_list);
2040 }
Oleg Nesterov83914442008-07-25 01:47:45 -07002041
Al Viroafabada2013-10-14 07:39:56 -04002042 list_for_each(t, &info->thread_list) {
2043 int sz;
Oleg Nesterov83914442008-07-25 01:47:45 -07002044
Al Viroafabada2013-10-14 07:39:56 -04002045 ets = list_entry(t, struct elf_thread_status, list);
2046 sz = elf_dump_thread_status(siginfo->si_signo, ets);
2047 info->thread_status_size += sz;
Roland McGrath3aba4812008-01-30 13:31:44 +01002048 }
2049 /* now collect the dump for the current */
2050 memset(info->prstatus, 0, sizeof(*info->prstatus));
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07002051 fill_prstatus(info->prstatus, current, siginfo->si_signo);
Roland McGrath3aba4812008-01-30 13:31:44 +01002052 elf_core_copy_regs(&info->prstatus->pr_reg, regs);
2053
2054 /* Set up header */
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08002055 fill_elf_header(elf, phdrs, ELF_ARCH, ELF_CORE_EFLAGS);
Roland McGrath3aba4812008-01-30 13:31:44 +01002056
2057 /*
2058 * Set up the notes in similar form to SVR4 core dumps made
2059 * with info from their /proc.
2060 */
2061
2062 fill_note(info->notes + 0, "CORE", NT_PRSTATUS,
2063 sizeof(*info->prstatus), info->prstatus);
2064 fill_psinfo(info->psinfo, current->group_leader, current->mm);
2065 fill_note(info->notes + 1, "CORE", NT_PRPSINFO,
2066 sizeof(*info->psinfo), info->psinfo);
2067
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07002068 fill_siginfo_note(info->notes + 2, &info->csigdata, siginfo);
2069 fill_auxv_note(info->notes + 3, current->mm);
Dan Aloni72023652013-09-30 13:45:02 -07002070 info->numnote = 4;
Roland McGrath3aba4812008-01-30 13:31:44 +01002071
Dan Aloni72023652013-09-30 13:45:02 -07002072 if (fill_files_note(info->notes + info->numnote) == 0) {
2073 info->notes_files = info->notes + info->numnote;
2074 info->numnote++;
2075 }
Roland McGrath3aba4812008-01-30 13:31:44 +01002076
2077 /* Try to dump the FPU. */
2078 info->prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, regs,
2079 info->fpu);
2080 if (info->prstatus->pr_fpvalid)
2081 fill_note(info->notes + info->numnote++,
2082 "CORE", NT_PRFPREG, sizeof(*info->fpu), info->fpu);
2083#ifdef ELF_CORE_COPY_XFPREGS
2084 if (elf_core_copy_task_xfpregs(current, info->xfpu))
2085 fill_note(info->notes + info->numnote++,
2086 "LINUX", ELF_CORE_XFPREG_TYPE,
2087 sizeof(*info->xfpu), info->xfpu);
2088#endif
2089
2090 return 1;
Roland McGrath3aba4812008-01-30 13:31:44 +01002091}
2092
2093static size_t get_note_info_size(struct elf_note_info *info)
2094{
2095 int sz = 0;
2096 int i;
2097
2098 for (i = 0; i < info->numnote; i++)
2099 sz += notesize(info->notes + i);
2100
2101 sz += info->thread_status_size;
2102
2103 return sz;
2104}
2105
2106static int write_note_info(struct elf_note_info *info,
Al Viroecc8c772013-10-05 15:32:35 -04002107 struct coredump_params *cprm)
Roland McGrath3aba4812008-01-30 13:31:44 +01002108{
2109 int i;
2110 struct list_head *t;
2111
2112 for (i = 0; i < info->numnote; i++)
Al Viroecc8c772013-10-05 15:32:35 -04002113 if (!writenote(info->notes + i, cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002114 return 0;
2115
2116 /* write out the thread status notes section */
2117 list_for_each(t, &info->thread_list) {
2118 struct elf_thread_status *tmp =
2119 list_entry(t, struct elf_thread_status, list);
2120
2121 for (i = 0; i < tmp->num_notes; i++)
Al Viroecc8c772013-10-05 15:32:35 -04002122 if (!writenote(&tmp->notes[i], cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002123 return 0;
2124 }
2125
2126 return 1;
2127}
2128
2129static void free_note_info(struct elf_note_info *info)
2130{
2131 while (!list_empty(&info->thread_list)) {
2132 struct list_head *tmp = info->thread_list.next;
2133 list_del(tmp);
2134 kfree(list_entry(tmp, struct elf_thread_status, list));
2135 }
2136
Dan Aloni72023652013-09-30 13:45:02 -07002137 /* Free data possibly allocated by fill_files_note(): */
2138 if (info->notes_files)
2139 vfree(info->notes_files->data);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07002140
Roland McGrath3aba4812008-01-30 13:31:44 +01002141 kfree(info->prstatus);
2142 kfree(info->psinfo);
2143 kfree(info->notes);
2144 kfree(info->fpu);
2145#ifdef ELF_CORE_COPY_XFPREGS
2146 kfree(info->xfpu);
2147#endif
2148}
2149
Roland McGrath4206d3a2008-01-30 13:31:45 +01002150#endif
2151
Roland McGrathf47aef52007-01-26 00:56:49 -08002152static struct vm_area_struct *first_vma(struct task_struct *tsk,
2153 struct vm_area_struct *gate_vma)
2154{
2155 struct vm_area_struct *ret = tsk->mm->mmap;
2156
2157 if (ret)
2158 return ret;
2159 return gate_vma;
2160}
2161/*
2162 * Helper function for iterating across a vma list. It ensures that the caller
2163 * will visit `gate_vma' prior to terminating the search.
2164 */
2165static struct vm_area_struct *next_vma(struct vm_area_struct *this_vma,
2166 struct vm_area_struct *gate_vma)
2167{
2168 struct vm_area_struct *ret;
2169
2170 ret = this_vma->vm_next;
2171 if (ret)
2172 return ret;
2173 if (this_vma == gate_vma)
2174 return NULL;
2175 return gate_vma;
2176}
2177
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002178static void fill_extnum_info(struct elfhdr *elf, struct elf_shdr *shdr4extnum,
2179 elf_addr_t e_shoff, int segs)
2180{
2181 elf->e_shoff = e_shoff;
2182 elf->e_shentsize = sizeof(*shdr4extnum);
2183 elf->e_shnum = 1;
2184 elf->e_shstrndx = SHN_UNDEF;
2185
2186 memset(shdr4extnum, 0, sizeof(*shdr4extnum));
2187
2188 shdr4extnum->sh_type = SHT_NULL;
2189 shdr4extnum->sh_size = elf->e_shnum;
2190 shdr4extnum->sh_link = elf->e_shstrndx;
2191 shdr4extnum->sh_info = segs;
2192}
2193
Linus Torvalds1da177e2005-04-16 15:20:36 -07002194/*
2195 * Actual dumper
2196 *
2197 * This is a two-pass process; first we find the offsets of the bits,
2198 * and then they are actually written out. If we run out of core limit
2199 * we just truncate.
2200 */
Masami Hiramatsuf6151df2009-12-17 15:27:16 -08002201static int elf_core_dump(struct coredump_params *cprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002202{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002203 int has_dumped = 0;
2204 mm_segment_t fs;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002205 int segs, i;
2206 size_t vma_data_size = 0;
Roland McGrathf47aef52007-01-26 00:56:49 -08002207 struct vm_area_struct *vma, *gate_vma;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002208 struct elfhdr *elf = NULL;
Al Virocdc3d562013-10-05 22:24:29 -04002209 loff_t offset = 0, dataoff;
Dan Aloni72023652013-09-30 13:45:02 -07002210 struct elf_note_info info = { };
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002211 struct elf_phdr *phdr4note = NULL;
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002212 struct elf_shdr *shdr4extnum = NULL;
2213 Elf_Half e_phnum;
2214 elf_addr_t e_shoff;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002215 elf_addr_t *vma_filesz = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002216
2217 /*
2218 * We no longer stop all VM operations.
2219 *
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002220 * This is because those proceses that could possibly change map_count
2221 * or the mmap / vma pages are now blocked in do_exit on current
2222 * finishing this core dump.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002223 *
2224 * Only ptrace can touch these memory addresses, but it doesn't change
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002225 * the map_count or the pages allocated. So no possibility of crashing
Linus Torvalds1da177e2005-04-16 15:20:36 -07002226 * exists while dumping the mm->vm_next areas to the core file.
2227 */
2228
2229 /* alloc memory for large data structures: too large to be on stack */
2230 elf = kmalloc(sizeof(*elf), GFP_KERNEL);
2231 if (!elf)
WANG Cong5f719552008-05-06 12:45:35 +08002232 goto out;
KAMEZAWA Hiroyuki341c87b2009-06-30 11:41:23 -07002233 /*
2234 * The number of segs are recored into ELF header as 16bit value.
2235 * Please check DEFAULT_MAX_MAP_COUNT definition when you modify here.
2236 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002237 segs = current->mm->map_count;
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002238 segs += elf_core_extra_phdrs();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002239
Stephen Wilson31db58b2011-03-13 15:49:15 -04002240 gate_vma = get_gate_vma(current->mm);
Roland McGrathf47aef52007-01-26 00:56:49 -08002241 if (gate_vma != NULL)
2242 segs++;
2243
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002244 /* for notes section */
2245 segs++;
2246
2247 /* If segs > PN_XNUM(0xffff), then e_phnum overflows. To avoid
2248 * this, kernel supports extended numbering. Have a look at
2249 * include/linux/elf.h for further information. */
2250 e_phnum = segs > PN_XNUM ? PN_XNUM : segs;
2251
Roland McGrath3aba4812008-01-30 13:31:44 +01002252 /*
2253 * Collect all the non-memory information about the process for the
2254 * notes. This also sets up the file header.
2255 */
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07002256 if (!fill_note_info(elf, e_phnum, &info, cprm->siginfo, cprm->regs))
Roland McGrath3aba4812008-01-30 13:31:44 +01002257 goto cleanup;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002258
2259 has_dumped = 1;
Oleg Nesterov079148b2013-04-30 15:28:16 -07002260
Linus Torvalds1da177e2005-04-16 15:20:36 -07002261 fs = get_fs();
2262 set_fs(KERNEL_DS);
2263
Linus Torvalds1da177e2005-04-16 15:20:36 -07002264 offset += sizeof(*elf); /* Elf header */
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002265 offset += segs * sizeof(struct elf_phdr); /* Program headers */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002266
2267 /* Write notes phdr entry */
2268 {
Roland McGrath3aba4812008-01-30 13:31:44 +01002269 size_t sz = get_note_info_size(&info);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002270
Michael Ellermane5501492007-09-19 14:38:12 +10002271 sz += elf_coredump_extra_notes_size();
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +01002272
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002273 phdr4note = kmalloc(sizeof(*phdr4note), GFP_KERNEL);
2274 if (!phdr4note)
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -08002275 goto end_coredump;
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002276
2277 fill_elf_note_phdr(phdr4note, sz, offset);
2278 offset += sz;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002279 }
2280
Linus Torvalds1da177e2005-04-16 15:20:36 -07002281 dataoff = offset = roundup(offset, ELF_EXEC_PAGESIZE);
2282
Jason Baron30f74aa2016-12-12 16:46:40 -08002283 if (segs - 1 > ULONG_MAX / sizeof(*vma_filesz))
2284 goto end_coredump;
2285 vma_filesz = vmalloc((segs - 1) * sizeof(*vma_filesz));
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002286 if (!vma_filesz)
2287 goto end_coredump;
2288
2289 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
2290 vma = next_vma(vma, gate_vma)) {
2291 unsigned long dump_size;
2292
2293 dump_size = vma_dump_size(vma, cprm->mm_flags);
2294 vma_filesz[i++] = dump_size;
2295 vma_data_size += dump_size;
2296 }
2297
2298 offset += vma_data_size;
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002299 offset += elf_core_extra_data_size();
2300 e_shoff = offset;
2301
2302 if (e_phnum == PN_XNUM) {
2303 shdr4extnum = kmalloc(sizeof(*shdr4extnum), GFP_KERNEL);
2304 if (!shdr4extnum)
2305 goto end_coredump;
2306 fill_extnum_info(elf, shdr4extnum, e_shoff, segs);
2307 }
2308
2309 offset = dataoff;
2310
Al Viroecc8c772013-10-05 15:32:35 -04002311 if (!dump_emit(cprm, elf, sizeof(*elf)))
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002312 goto end_coredump;
2313
Al Viroecc8c772013-10-05 15:32:35 -04002314 if (!dump_emit(cprm, phdr4note, sizeof(*phdr4note)))
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002315 goto end_coredump;
2316
Linus Torvalds1da177e2005-04-16 15:20:36 -07002317 /* Write program headers for segments dump */
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002318 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
Roland McGrathf47aef52007-01-26 00:56:49 -08002319 vma = next_vma(vma, gate_vma)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002320 struct elf_phdr phdr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002321
2322 phdr.p_type = PT_LOAD;
2323 phdr.p_offset = offset;
2324 phdr.p_vaddr = vma->vm_start;
2325 phdr.p_paddr = 0;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002326 phdr.p_filesz = vma_filesz[i++];
Roland McGrath82df3972007-10-16 23:27:02 -07002327 phdr.p_memsz = vma->vm_end - vma->vm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002328 offset += phdr.p_filesz;
2329 phdr.p_flags = vma->vm_flags & VM_READ ? PF_R : 0;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002330 if (vma->vm_flags & VM_WRITE)
2331 phdr.p_flags |= PF_W;
2332 if (vma->vm_flags & VM_EXEC)
2333 phdr.p_flags |= PF_X;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002334 phdr.p_align = ELF_EXEC_PAGESIZE;
2335
Al Viroecc8c772013-10-05 15:32:35 -04002336 if (!dump_emit(cprm, &phdr, sizeof(phdr)))
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -08002337 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002338 }
2339
Al Viro506f21c2013-10-05 17:22:57 -04002340 if (!elf_core_write_extra_phdrs(cprm, offset))
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002341 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002342
2343 /* write out the notes section */
Al Viroecc8c772013-10-05 15:32:35 -04002344 if (!write_note_info(&info, cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002345 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002346
Al Virocdc3d562013-10-05 22:24:29 -04002347 if (elf_coredump_extra_notes_write(cprm))
Michael Ellermane5501492007-09-19 14:38:12 +10002348 goto end_coredump;
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +01002349
Andi Kleend025c9d2006-09-30 23:29:28 -07002350 /* Align to page */
Mateusz Guzik1607f092016-06-05 23:14:14 +02002351 if (!dump_skip(cprm, dataoff - cprm->pos))
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002352 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002353
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002354 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
Roland McGrathf47aef52007-01-26 00:56:49 -08002355 vma = next_vma(vma, gate_vma)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002356 unsigned long addr;
Roland McGrath82df3972007-10-16 23:27:02 -07002357 unsigned long end;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002358
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002359 end = vma->vm_start + vma_filesz[i++];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002360
Roland McGrath82df3972007-10-16 23:27:02 -07002361 for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002362 struct page *page;
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002363 int stop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002364
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002365 page = get_dump_page(addr);
2366 if (page) {
2367 void *kaddr = kmap(page);
Al Viro13046ec2013-10-05 18:08:47 -04002368 stop = !dump_emit(cprm, kaddr, PAGE_SIZE);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002369 kunmap(page);
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03002370 put_page(page);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002371 } else
Al Viro9b56d542013-10-08 09:26:08 -04002372 stop = !dump_skip(cprm, PAGE_SIZE);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002373 if (stop)
2374 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002375 }
2376 }
Dave Kleikamp4d22c752017-01-11 13:25:00 -06002377 dump_truncate(cprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002378
Al Viroaa3e7ea2013-10-05 17:50:15 -04002379 if (!elf_core_write_extra_data(cprm))
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002380 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002381
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002382 if (e_phnum == PN_XNUM) {
Al Viro13046ec2013-10-05 18:08:47 -04002383 if (!dump_emit(cprm, shdr4extnum, sizeof(*shdr4extnum)))
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002384 goto end_coredump;
2385 }
2386
Linus Torvalds1da177e2005-04-16 15:20:36 -07002387end_coredump:
2388 set_fs(fs);
2389
2390cleanup:
Roland McGrath3aba4812008-01-30 13:31:44 +01002391 free_note_info(&info);
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002392 kfree(shdr4extnum);
Jason Baron30f74aa2016-12-12 16:46:40 -08002393 vfree(vma_filesz);
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002394 kfree(phdr4note);
WANG Cong5f719552008-05-06 12:45:35 +08002395 kfree(elf);
2396out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002397 return has_dumped;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002398}
2399
Christoph Hellwig698ba7b2009-12-15 16:47:37 -08002400#endif /* CONFIG_ELF_CORE */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002401
2402static int __init init_elf_binfmt(void)
2403{
Al Viro8fc3dc52012-03-17 03:05:16 -04002404 register_binfmt(&elf_format);
2405 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002406}
2407
2408static void __exit exit_elf_binfmt(void)
2409{
2410 /* Remove the COFF and ELF loaders. */
2411 unregister_binfmt(&elf_format);
2412}
2413
2414core_initcall(init_elf_binfmt);
2415module_exit(exit_elf_binfmt);
2416MODULE_LICENSE("GPL");