blob: e64bff45dcf5848037e204074429c62e227b8728 [file] [log] [blame]
Thomas Gleixner09c434b2019-05-19 13:08:20 +01001// SPDX-License-Identifier: GPL-2.0-only
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/*
3 * linux/fs/binfmt_elf.c
4 *
5 * These are the functions used to load ELF format executables as used
6 * on SVr4 machines. Information on the format may be found in the book
7 * "UNIX SYSTEM V RELEASE 4 Programmers Guide: Ansi C and Programming Support
8 * Tools".
9 *
10 * Copyright 1993, 1994: Eric Youngdale (ericy@cais.com).
11 */
12
13#include <linux/module.h>
14#include <linux/kernel.h>
15#include <linux/fs.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070016#include <linux/mm.h>
17#include <linux/mman.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070018#include <linux/errno.h>
19#include <linux/signal.h>
20#include <linux/binfmts.h>
21#include <linux/string.h>
22#include <linux/file.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070023#include <linux/slab.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070024#include <linux/personality.h>
25#include <linux/elfcore.h>
26#include <linux/init.h>
27#include <linux/highuid.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070028#include <linux/compiler.h>
29#include <linux/highmem.h>
30#include <linux/pagemap.h>
Denys Vlasenko2aa362c2012-10-04 17:15:36 -070031#include <linux/vmalloc.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070032#include <linux/security.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070033#include <linux/random.h>
Jesper Juhlf4e5cc22006-06-23 02:05:35 -070034#include <linux/elf.h>
Kees Cookd1fd8362015-04-14 15:48:07 -070035#include <linux/elf-randomize.h>
Alexey Dobriyan7e80d0d2007-05-08 00:28:59 -070036#include <linux/utsname.h>
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -080037#include <linux/coredump.h>
Frederic Weisbecker6fac4822012-11-13 14:20:55 +010038#include <linux/sched.h>
Ingo Molnarf7ccbae2017-02-08 18:51:30 +010039#include <linux/sched/coredump.h>
Ingo Molnar68db0cf2017-02-08 18:51:37 +010040#include <linux/sched/task_stack.h>
Ingo Molnar32ef5512017-02-05 11:48:36 +010041#include <linux/sched/cputime.h>
Ingo Molnar5b825c32017-02-02 17:54:15 +010042#include <linux/cred.h>
Ross Zwisler50378352015-10-05 16:33:36 -060043#include <linux/dax.h>
Linus Torvalds7c0f6ba2016-12-24 11:46:01 -080044#include <linux/uaccess.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070045#include <asm/param.h>
46#include <asm/page.h>
47
Denys Vlasenko2aa362c2012-10-04 17:15:36 -070048#ifndef user_long_t
49#define user_long_t long
50#endif
Denys Vlasenko49ae4d42012-10-04 17:15:35 -070051#ifndef user_siginfo_t
52#define user_siginfo_t siginfo_t
53#endif
54
Nicolas Pitre47552002017-08-16 16:05:13 -040055/* That's for binfmt_elf_fdpic to deal with */
56#ifndef elf_check_fdpic
57#define elf_check_fdpic(ex) false
58#endif
59
Al Viro71613c32012-10-20 22:00:48 -040060static int load_elf_binary(struct linux_binprm *bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -070061
Josh Triplett69369a72014-04-03 14:48:27 -070062#ifdef CONFIG_USELIB
63static int load_elf_library(struct file *);
64#else
65#define load_elf_library NULL
66#endif
67
Linus Torvalds1da177e2005-04-16 15:20:36 -070068/*
69 * If we don't support core dumping, then supply a NULL so we
70 * don't even try.
71 */
Christoph Hellwig698ba7b2009-12-15 16:47:37 -080072#ifdef CONFIG_ELF_CORE
Masami Hiramatsuf6151df2009-12-17 15:27:16 -080073static int elf_core_dump(struct coredump_params *cprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -070074#else
75#define elf_core_dump NULL
76#endif
77
78#if ELF_EXEC_PAGESIZE > PAGE_SIZE
Jesper Juhlf4e5cc22006-06-23 02:05:35 -070079#define ELF_MIN_ALIGN ELF_EXEC_PAGESIZE
Linus Torvalds1da177e2005-04-16 15:20:36 -070080#else
Jesper Juhlf4e5cc22006-06-23 02:05:35 -070081#define ELF_MIN_ALIGN PAGE_SIZE
Linus Torvalds1da177e2005-04-16 15:20:36 -070082#endif
83
84#ifndef ELF_CORE_EFLAGS
85#define ELF_CORE_EFLAGS 0
86#endif
87
88#define ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(ELF_MIN_ALIGN-1))
89#define ELF_PAGEOFFSET(_v) ((_v) & (ELF_MIN_ALIGN-1))
90#define ELF_PAGEALIGN(_v) (((_v) + ELF_MIN_ALIGN - 1) & ~(ELF_MIN_ALIGN - 1))
91
92static struct linux_binfmt elf_format = {
Mikael Petterssonf670d0e2011-01-12 17:00:02 -080093 .module = THIS_MODULE,
94 .load_binary = load_elf_binary,
95 .load_shlib = load_elf_library,
96 .core_dump = elf_core_dump,
97 .min_coredump = ELF_EXEC_PAGESIZE,
Linus Torvalds1da177e2005-04-16 15:20:36 -070098};
99
Andrew Mortond4e3cc32007-07-21 04:37:32 -0700100#define BAD_ADDR(x) ((unsigned long)(x) >= TASK_SIZE)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700101
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800102static int set_brk(unsigned long start, unsigned long end, int prot)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700103{
104 start = ELF_PAGEALIGN(start);
105 end = ELF_PAGEALIGN(end);
106 if (end > start) {
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800107 /*
108 * Map the last of the bss segment.
109 * If the header is requesting these pages to be
110 * executable, honour that (ppc32 needs this).
111 */
112 int error = vm_brk_flags(start, end - start,
113 prot & PROT_EXEC ? VM_EXEC : 0);
Linus Torvalds5d22fc22016-05-27 15:57:31 -0700114 if (error)
115 return error;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700116 }
117 current->mm->start_brk = current->mm->brk = end;
118 return 0;
119}
120
Linus Torvalds1da177e2005-04-16 15:20:36 -0700121/* We need to explicitly zero any fractional pages
122 after the data section (i.e. bss). This would
123 contain the junk from the file that should not
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700124 be in memory
125 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700126static int padzero(unsigned long elf_bss)
127{
128 unsigned long nbyte;
129
130 nbyte = ELF_PAGEOFFSET(elf_bss);
131 if (nbyte) {
132 nbyte = ELF_MIN_ALIGN - nbyte;
133 if (clear_user((void __user *) elf_bss, nbyte))
134 return -EFAULT;
135 }
136 return 0;
137}
138
Ohad Ben-Cohen09c6dd32008-02-03 18:05:15 +0200139/* Let's use some macros to make this stack manipulation a little clearer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700140#ifdef CONFIG_STACK_GROWSUP
141#define STACK_ADD(sp, items) ((elf_addr_t __user *)(sp) + (items))
142#define STACK_ROUND(sp, items) \
143 ((15 + (unsigned long) ((sp) + (items))) &~ 15UL)
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700144#define STACK_ALLOC(sp, len) ({ \
145 elf_addr_t __user *old_sp = (elf_addr_t __user *)sp; sp += len; \
146 old_sp; })
Linus Torvalds1da177e2005-04-16 15:20:36 -0700147#else
148#define STACK_ADD(sp, items) ((elf_addr_t __user *)(sp) - (items))
149#define STACK_ROUND(sp, items) \
150 (((unsigned long) (sp - items)) &~ 15UL)
151#define STACK_ALLOC(sp, len) ({ sp -= len ; sp; })
152#endif
153
Nathan Lynch483fad12008-07-22 04:48:46 +1000154#ifndef ELF_BASE_PLATFORM
155/*
156 * AT_BASE_PLATFORM indicates the "real" hardware/microarchitecture.
157 * If the arch defines ELF_BASE_PLATFORM (in asm/elf.h), the value
158 * will be copied to the user stack in the same manner as AT_PLATFORM.
159 */
160#define ELF_BASE_PLATFORM NULL
161#endif
162
Linus Torvalds1da177e2005-04-16 15:20:36 -0700163static int
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800164create_elf_tables(struct linux_binprm *bprm, const struct elfhdr *exec,
165 unsigned long load_addr, unsigned long interp_load_addr,
166 unsigned long e_entry)
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;
Alexey Dobriyan1f83d802020-01-30 22:16:50 -0800180 int ei_index;
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 { \
Alexey Dobriyan1f83d802020-01-30 22:16:50 -0800234 *elf_info++ = id; \
235 *elf_info++ = 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);
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800255 NEW_AUX_ENT(AT_ENTRY, 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 */
Alexey Dobriyan1f83d802020-01-30 22:16:50 -0800279 memset(elf_info, 0, (char *)current->mm->saved_auxv +
280 sizeof(current->mm->saved_auxv) - (char *)elf_info);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700281
282 /* And advance past the AT_NULL entry. */
Alexey Dobriyan1f83d802020-01-30 22:16:50 -0800283 elf_info += 2;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700284
Alexey Dobriyan1f83d802020-01-30 22:16:50 -0800285 ei_index = elf_info - (elf_addr_t *)current->mm->saved_auxv;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700286 sp = STACK_ADD(p, ei_index);
287
Andi Kleend20894a2008-02-08 04:21:54 -0800288 items = (argc + 1) + (envc + 1) + 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700289 bprm->p = STACK_ROUND(sp, items);
290
291 /* Point sp at the lowest address on the stack */
292#ifdef CONFIG_STACK_GROWSUP
293 sp = (elf_addr_t __user *)bprm->p - items - ei_index;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700294 bprm->exec = (unsigned long)sp; /* XXX: PARISC HACK */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700295#else
296 sp = (elf_addr_t __user *)bprm->p;
297#endif
298
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700299
300 /*
301 * Grow the stack manually; some architectures have a limit on how
302 * far ahead a user-space access may be in order to grow the stack.
303 */
304 vma = find_extend_vma(current->mm, bprm->p);
305 if (!vma)
306 return -EFAULT;
307
Linus Torvalds1da177e2005-04-16 15:20:36 -0700308 /* Now, let's put argc (and argv, envp if appropriate) on the stack */
309 if (__put_user(argc, sp++))
310 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700311
Kees Cook67c67772017-07-10 15:52:54 -0700312 /* Populate list of argv pointers back to argv strings. */
Greg Kroah-Hartmana84a5052005-05-11 00:10:44 -0700313 p = current->mm->arg_end = current->mm->arg_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700314 while (argc-- > 0) {
315 size_t len;
Kees Cook67c67772017-07-10 15:52:54 -0700316 if (__put_user((elf_addr_t)p, sp++))
Heiko Carstens841d5fb2006-12-06 20:36:35 -0800317 return -EFAULT;
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700318 len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);
319 if (!len || len > MAX_ARG_STRLEN)
WANG Cong23c49712008-05-08 21:52:33 +0800320 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700321 p += len;
322 }
Kees Cook67c67772017-07-10 15:52:54 -0700323 if (__put_user(0, sp++))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700324 return -EFAULT;
Kees Cook67c67772017-07-10 15:52:54 -0700325 current->mm->arg_end = p;
326
327 /* Populate list of envp pointers back to envp strings. */
328 current->mm->env_end = current->mm->env_start = p;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700329 while (envc-- > 0) {
330 size_t len;
Kees Cook67c67772017-07-10 15:52:54 -0700331 if (__put_user((elf_addr_t)p, sp++))
Heiko Carstens841d5fb2006-12-06 20:36:35 -0800332 return -EFAULT;
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700333 len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);
334 if (!len || len > MAX_ARG_STRLEN)
WANG Cong23c49712008-05-08 21:52:33 +0800335 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700336 p += len;
337 }
Kees Cook67c67772017-07-10 15:52:54 -0700338 if (__put_user(0, sp++))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700339 return -EFAULT;
340 current->mm->env_end = p;
341
342 /* Put the elf_info on the stack in the right place. */
Alexey Dobriyan1f83d802020-01-30 22:16:50 -0800343 if (copy_to_user(sp, current->mm->saved_auxv, ei_index * sizeof(elf_addr_t)))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700344 return -EFAULT;
345 return 0;
346}
347
James Hoganc07380b2011-05-09 10:58:40 +0100348#ifndef elf_map
349
Linus Torvalds1da177e2005-04-16 15:20:36 -0700350static unsigned long elf_map(struct file *filep, unsigned long addr,
Alexey Dobriyan49ac9812019-03-07 16:29:03 -0800351 const struct elf_phdr *eppnt, int prot, int type,
Jiri Kosinacc503c12008-01-30 13:31:07 +0100352 unsigned long total_size)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700353{
354 unsigned long map_addr;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100355 unsigned long size = eppnt->p_filesz + ELF_PAGEOFFSET(eppnt->p_vaddr);
356 unsigned long off = eppnt->p_offset - ELF_PAGEOFFSET(eppnt->p_vaddr);
357 addr = ELF_PAGESTART(addr);
358 size = ELF_PAGEALIGN(size);
Jan Kratochvil60bfba72007-07-15 23:40:06 -0700359
Andrew Mortond4e3cc32007-07-21 04:37:32 -0700360 /* mmap() will return -EINVAL if given a zero size, but a
361 * segment with zero filesize is perfectly valid */
Jiri Kosinacc503c12008-01-30 13:31:07 +0100362 if (!size)
363 return addr;
364
Jiri Kosinacc503c12008-01-30 13:31:07 +0100365 /*
366 * total_size is the size of the ELF (interpreter) image.
367 * The _first_ mmap needs to know the full size, otherwise
368 * randomization might put this image into an overlapping
369 * position with the ELF binary image. (since size < total_size)
370 * So we first map the 'big' image - and unmap the remainder at
371 * the end. (which unmap is needed for ELF images with holes.)
372 */
373 if (total_size) {
374 total_size = ELF_PAGEALIGN(total_size);
Al Viro5a5e4c22012-05-30 01:49:38 -0400375 map_addr = vm_mmap(filep, addr, total_size, prot, type, off);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100376 if (!BAD_ADDR(map_addr))
Al Viro5a5e4c22012-05-30 01:49:38 -0400377 vm_munmap(map_addr+size, total_size-size);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100378 } else
Al Viro5a5e4c22012-05-30 01:49:38 -0400379 map_addr = vm_mmap(filep, addr, size, prot, type, off);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100380
Tetsuo Handad23a61e2018-04-20 14:56:13 -0700381 if ((type & MAP_FIXED_NOREPLACE) &&
382 PTR_ERR((void *)map_addr) == -EEXIST)
383 pr_info("%d (%s): Uhuuh, elf segment at %px requested but the memory is mapped already\n",
384 task_pid_nr(current), current->comm, (void *)addr);
Michal Hocko4ed28632018-04-10 16:36:01 -0700385
Linus Torvalds1da177e2005-04-16 15:20:36 -0700386 return(map_addr);
387}
388
James Hoganc07380b2011-05-09 10:58:40 +0100389#endif /* !elf_map */
390
Alexey Dobriyan49ac9812019-03-07 16:29:03 -0800391static unsigned long total_mapping_size(const struct elf_phdr *cmds, int nr)
Jiri Kosinacc503c12008-01-30 13:31:07 +0100392{
393 int i, first_idx = -1, last_idx = -1;
394
395 for (i = 0; i < nr; i++) {
396 if (cmds[i].p_type == PT_LOAD) {
397 last_idx = i;
398 if (first_idx == -1)
399 first_idx = i;
400 }
401 }
402 if (first_idx == -1)
403 return 0;
404
405 return cmds[last_idx].p_vaddr + cmds[last_idx].p_memsz -
406 ELF_PAGESTART(cmds[first_idx].p_vaddr);
407}
408
Alexey Dobriyan658c0332019-12-04 16:52:25 -0800409static int elf_read(struct file *file, void *buf, size_t len, loff_t pos)
410{
411 ssize_t rv;
412
413 rv = kernel_read(file, buf, len, &pos);
414 if (unlikely(rv != len)) {
415 return (rv < 0) ? rv : -EIO;
416 }
417 return 0;
418}
419
Paul Burton6a8d3892014-09-11 08:30:14 +0100420/**
421 * load_elf_phdrs() - load ELF program headers
422 * @elf_ex: ELF header of the binary whose program headers should be loaded
423 * @elf_file: the opened ELF binary file
424 *
425 * Loads ELF program headers from the binary file elf_file, which has the ELF
426 * header pointed to by elf_ex, into a newly allocated array. The caller is
427 * responsible for freeing the allocated data. Returns an ERR_PTR upon failure.
428 */
Alexey Dobriyan49ac9812019-03-07 16:29:03 -0800429static struct elf_phdr *load_elf_phdrs(const struct elfhdr *elf_ex,
Paul Burton6a8d3892014-09-11 08:30:14 +0100430 struct file *elf_file)
431{
432 struct elf_phdr *elf_phdata = NULL;
Alexey Dobriyanfaf1c312019-03-07 16:28:56 -0800433 int retval, err = -1;
Alexey Dobriyanfaf1c312019-03-07 16:28:56 -0800434 unsigned int size;
Paul Burton6a8d3892014-09-11 08:30:14 +0100435
436 /*
437 * If the size of this structure has changed, then punt, since
438 * we will be doing the wrong thing.
439 */
440 if (elf_ex->e_phentsize != sizeof(struct elf_phdr))
441 goto out;
442
443 /* Sanity check the number of program headers... */
Paul Burton6a8d3892014-09-11 08:30:14 +0100444 /* ...and their total size. */
445 size = sizeof(struct elf_phdr) * elf_ex->e_phnum;
Alexey Dobriyanfaf1c312019-03-07 16:28:56 -0800446 if (size == 0 || size > 65536 || size > ELF_MIN_ALIGN)
Paul Burton6a8d3892014-09-11 08:30:14 +0100447 goto out;
448
449 elf_phdata = kmalloc(size, GFP_KERNEL);
450 if (!elf_phdata)
451 goto out;
452
453 /* Read in the program headers */
Alexey Dobriyan658c0332019-12-04 16:52:25 -0800454 retval = elf_read(elf_file, elf_phdata, size, elf_ex->e_phoff);
455 if (retval < 0) {
456 err = retval;
Paul Burton6a8d3892014-09-11 08:30:14 +0100457 goto out;
458 }
459
460 /* Success! */
461 err = 0;
462out:
463 if (err) {
464 kfree(elf_phdata);
465 elf_phdata = NULL;
466 }
467 return elf_phdata;
468}
Jiri Kosinacc503c12008-01-30 13:31:07 +0100469
Paul Burton774c1052014-09-11 08:30:16 +0100470#ifndef CONFIG_ARCH_BINFMT_ELF_STATE
471
472/**
473 * struct arch_elf_state - arch-specific ELF loading state
474 *
475 * This structure is used to preserve architecture specific data during
476 * the loading of an ELF file, throughout the checking of architecture
477 * specific ELF headers & through to the point where the ELF load is
478 * known to be proceeding (ie. SET_PERSONALITY).
479 *
480 * This implementation is a dummy for architectures which require no
481 * specific state.
482 */
483struct arch_elf_state {
484};
485
486#define INIT_ARCH_ELF_STATE {}
487
488/**
489 * arch_elf_pt_proc() - check a PT_LOPROC..PT_HIPROC ELF program header
490 * @ehdr: The main ELF header
491 * @phdr: The program header to check
492 * @elf: The open ELF file
493 * @is_interp: True if the phdr is from the interpreter of the ELF being
494 * loaded, else false.
495 * @state: Architecture-specific state preserved throughout the process
496 * of loading the ELF.
497 *
498 * Inspects the program header phdr to validate its correctness and/or
499 * suitability for the system. Called once per ELF program header in the
500 * range PT_LOPROC to PT_HIPROC, for both the ELF being loaded and its
501 * interpreter.
502 *
503 * Return: Zero to proceed with the ELF load, non-zero to fail the ELF load
504 * with that return code.
505 */
506static inline int arch_elf_pt_proc(struct elfhdr *ehdr,
507 struct elf_phdr *phdr,
508 struct file *elf, bool is_interp,
509 struct arch_elf_state *state)
510{
511 /* Dummy implementation, always proceed */
512 return 0;
513}
514
515/**
Maciej W. Rozycki54d157142015-10-26 15:47:57 +0000516 * arch_check_elf() - check an ELF executable
Paul Burton774c1052014-09-11 08:30:16 +0100517 * @ehdr: The main ELF header
518 * @has_interp: True if the ELF has an interpreter, else false.
Maciej W. Rozyckieb4bc072015-11-13 00:47:48 +0000519 * @interp_ehdr: The interpreter's ELF header
Paul Burton774c1052014-09-11 08:30:16 +0100520 * @state: Architecture-specific state preserved throughout the process
521 * of loading the ELF.
522 *
523 * Provides a final opportunity for architecture code to reject the loading
524 * of the ELF & cause an exec syscall to return an error. This is called after
525 * all program headers to be checked by arch_elf_pt_proc have been.
526 *
527 * Return: Zero to proceed with the ELF load, non-zero to fail the ELF load
528 * with that return code.
529 */
530static inline int arch_check_elf(struct elfhdr *ehdr, bool has_interp,
Maciej W. Rozyckieb4bc072015-11-13 00:47:48 +0000531 struct elfhdr *interp_ehdr,
Paul Burton774c1052014-09-11 08:30:16 +0100532 struct arch_elf_state *state)
533{
534 /* Dummy implementation, always proceed */
535 return 0;
536}
537
538#endif /* !CONFIG_ARCH_BINFMT_ELF_STATE */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700539
Alexey Dobriyand8e7cb32019-05-14 15:43:51 -0700540static inline int make_prot(u32 p_flags)
541{
542 int prot = 0;
543
544 if (p_flags & PF_R)
545 prot |= PROT_READ;
546 if (p_flags & PF_W)
547 prot |= PROT_WRITE;
548 if (p_flags & PF_X)
549 prot |= PROT_EXEC;
550 return prot;
551}
552
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553/* This is much more generalized than the library routine read function,
554 so we keep this separate. Technically the library read function
555 is only provided so that we can read a.out libraries that have
556 an ELF header */
557
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700558static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
Alexey Dobriyan81696d52019-12-04 16:52:22 -0800559 struct file *interpreter,
Paul Burtona9d9ef12014-09-11 08:30:15 +0100560 unsigned long no_base, struct elf_phdr *interp_elf_phdata)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700561{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700562 struct elf_phdr *eppnt;
563 unsigned long load_addr = 0;
564 int load_addr_set = 0;
565 unsigned long last_bss = 0, elf_bss = 0;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800566 int bss_prot = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700567 unsigned long error = ~0UL;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100568 unsigned long total_size;
Paul Burton6a8d3892014-09-11 08:30:14 +0100569 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700570
571 /* First of all, some simple consistency checks */
572 if (interp_elf_ex->e_type != ET_EXEC &&
573 interp_elf_ex->e_type != ET_DYN)
574 goto out;
Nicolas Pitre47552002017-08-16 16:05:13 -0400575 if (!elf_check_arch(interp_elf_ex) ||
576 elf_check_fdpic(interp_elf_ex))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700577 goto out;
Al Viro72c2d532013-09-22 16:27:52 -0400578 if (!interpreter->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700579 goto out;
580
Paul Burtona9d9ef12014-09-11 08:30:15 +0100581 total_size = total_mapping_size(interp_elf_phdata,
582 interp_elf_ex->e_phnum);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100583 if (!total_size) {
584 error = -EINVAL;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100585 goto out;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100586 }
587
Paul Burtona9d9ef12014-09-11 08:30:15 +0100588 eppnt = interp_elf_phdata;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700589 for (i = 0; i < interp_elf_ex->e_phnum; i++, eppnt++) {
590 if (eppnt->p_type == PT_LOAD) {
591 int elf_type = MAP_PRIVATE | MAP_DENYWRITE;
Alexey Dobriyand8e7cb32019-05-14 15:43:51 -0700592 int elf_prot = make_prot(eppnt->p_flags);
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700593 unsigned long vaddr = 0;
594 unsigned long k, map_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700595
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700596 vaddr = eppnt->p_vaddr;
597 if (interp_elf_ex->e_type == ET_EXEC || load_addr_set)
Michal Hocko4ed28632018-04-10 16:36:01 -0700598 elf_type |= MAP_FIXED_NOREPLACE;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100599 else if (no_base && interp_elf_ex->e_type == ET_DYN)
600 load_addr = -vaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700601
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700602 map_addr = elf_map(interpreter, load_addr + vaddr,
Andrew Mortonbb1ad822008-01-30 13:31:07 +0100603 eppnt, elf_prot, elf_type, total_size);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100604 total_size = 0;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700605 error = map_addr;
606 if (BAD_ADDR(map_addr))
Paul Burtona9d9ef12014-09-11 08:30:15 +0100607 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700608
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700609 if (!load_addr_set &&
610 interp_elf_ex->e_type == ET_DYN) {
611 load_addr = map_addr - ELF_PAGESTART(vaddr);
612 load_addr_set = 1;
613 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700614
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700615 /*
616 * Check to see if the section's size will overflow the
617 * allowed task size. Note that p_filesz must always be
618 * <= p_memsize so it's only necessary to check p_memsz.
619 */
620 k = load_addr + eppnt->p_vaddr;
Chuck Ebbertce510592006-07-03 00:24:14 -0700621 if (BAD_ADDR(k) ||
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700622 eppnt->p_filesz > eppnt->p_memsz ||
623 eppnt->p_memsz > TASK_SIZE ||
624 TASK_SIZE - eppnt->p_memsz < k) {
625 error = -ENOMEM;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100626 goto out;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700627 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700628
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700629 /*
630 * Find the end of the file mapping for this phdr, and
631 * keep track of the largest address we see for this.
632 */
633 k = load_addr + eppnt->p_vaddr + eppnt->p_filesz;
634 if (k > elf_bss)
635 elf_bss = k;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700636
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700637 /*
638 * Do the same thing for the memory mapping - between
639 * elf_bss and last_bss is the bss section.
640 */
Kees Cook0036d1f2016-08-02 14:04:51 -0700641 k = load_addr + eppnt->p_vaddr + eppnt->p_memsz;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800642 if (k > last_bss) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700643 last_bss = k;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800644 bss_prot = elf_prot;
645 }
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700646 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700647 }
648
Kees Cook0036d1f2016-08-02 14:04:51 -0700649 /*
650 * Now fill out the bss section: first pad the last page from
651 * the file up to the page boundary, and zero it from elf_bss
652 * up to the end of the page.
653 */
654 if (padzero(elf_bss)) {
655 error = -EFAULT;
656 goto out;
657 }
658 /*
659 * Next, align both the file and mem bss up to the page size,
660 * since this is where elf_bss was just zeroed up to, and where
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800661 * last_bss will end after the vm_brk_flags() below.
Kees Cook0036d1f2016-08-02 14:04:51 -0700662 */
663 elf_bss = ELF_PAGEALIGN(elf_bss);
664 last_bss = ELF_PAGEALIGN(last_bss);
665 /* Finally, if there is still more bss to allocate, do it. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700666 if (last_bss > elf_bss) {
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800667 error = vm_brk_flags(elf_bss, last_bss - elf_bss,
668 bss_prot & PROT_EXEC ? VM_EXEC : 0);
Linus Torvalds5d22fc22016-05-27 15:57:31 -0700669 if (error)
Paul Burtona9d9ef12014-09-11 08:30:15 +0100670 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700671 }
672
Jiri Kosinacc503c12008-01-30 13:31:07 +0100673 error = load_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700674out:
675 return error;
676}
677
Linus Torvalds1da177e2005-04-16 15:20:36 -0700678/*
679 * These are the functions used to load ELF style executables and shared
680 * libraries. There is no binary dependent code anywhere else.
681 */
682
Al Viro71613c32012-10-20 22:00:48 -0400683static int load_elf_binary(struct linux_binprm *bprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700684{
685 struct file *interpreter = NULL; /* to shut gcc up */
686 unsigned long load_addr = 0, load_bias = 0;
687 int load_addr_set = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700688 unsigned long error;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100689 struct elf_phdr *elf_ppnt, *elf_phdata, *interp_elf_phdata = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700690 unsigned long elf_bss, elf_brk;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800691 int bss_prot = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700692 int retval, i;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100693 unsigned long elf_entry;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800694 unsigned long e_entry;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100695 unsigned long interp_load_addr = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700696 unsigned long start_code, end_code, start_data, end_data;
David Daney1a530a62011-03-22 16:34:48 -0700697 unsigned long reloc_func_desc __maybe_unused = 0;
David Rientjes8de61e62006-12-06 20:40:16 -0800698 int executable_stack = EXSTACK_DEFAULT;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800699 struct elfhdr *elf_ex = (struct elfhdr *)bprm->buf;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700700 struct {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700701 struct elfhdr interp_elf_ex;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700702 } *loc;
Paul Burton774c1052014-09-11 08:30:16 +0100703 struct arch_elf_state arch_state = INIT_ARCH_ELF_STATE;
Alexey Dobriyan249b08e2019-05-14 15:43:54 -0700704 struct pt_regs *regs;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700705
706 loc = kmalloc(sizeof(*loc), GFP_KERNEL);
707 if (!loc) {
708 retval = -ENOMEM;
709 goto out_ret;
710 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700711
712 retval = -ENOEXEC;
713 /* First of all, some simple consistency checks */
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800714 if (memcmp(elf_ex->e_ident, ELFMAG, SELFMAG) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700715 goto out;
716
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800717 if (elf_ex->e_type != ET_EXEC && elf_ex->e_type != ET_DYN)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700718 goto out;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800719 if (!elf_check_arch(elf_ex))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700720 goto out;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800721 if (elf_check_fdpic(elf_ex))
Nicolas Pitre47552002017-08-16 16:05:13 -0400722 goto out;
Al Viro72c2d532013-09-22 16:27:52 -0400723 if (!bprm->file->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700724 goto out;
725
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800726 elf_phdata = load_elf_phdrs(elf_ex, bprm->file);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700727 if (!elf_phdata)
728 goto out;
729
Linus Torvalds1da177e2005-04-16 15:20:36 -0700730 elf_ppnt = elf_phdata;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800731 for (i = 0; i < elf_ex->e_phnum; i++, elf_ppnt++) {
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700732 char *elf_interpreter;
Alexey Dobriyan5cf4a362019-05-14 15:43:36 -0700733
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700734 if (elf_ppnt->p_type != PT_INTERP)
735 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700736
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700737 /*
738 * This is the program interpreter used for shared libraries -
739 * for now assume that this is an a.out format binary.
740 */
741 retval = -ENOEXEC;
742 if (elf_ppnt->p_filesz > PATH_MAX || elf_ppnt->p_filesz < 2)
743 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700744
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700745 retval = -ENOMEM;
746 elf_interpreter = kmalloc(elf_ppnt->p_filesz, GFP_KERNEL);
747 if (!elf_interpreter)
748 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700749
Alexey Dobriyan658c0332019-12-04 16:52:25 -0800750 retval = elf_read(bprm->file, elf_interpreter, elf_ppnt->p_filesz,
751 elf_ppnt->p_offset);
752 if (retval < 0)
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700753 goto out_free_interp;
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700754 /* make sure path is NULL terminated */
755 retval = -ENOEXEC;
756 if (elf_interpreter[elf_ppnt->p_filesz - 1] != '\0')
757 goto out_free_interp;
Alexey Dobriyan1fb84492007-01-26 00:57:16 -0800758
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700759 interpreter = open_exec(elf_interpreter);
760 kfree(elf_interpreter);
761 retval = PTR_ERR(interpreter);
762 if (IS_ERR(interpreter))
763 goto out_free_ph;
Alexey Dobriyan1fb84492007-01-26 00:57:16 -0800764
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700765 /*
766 * If the binary is not readable then enforce mm->dumpable = 0
767 * regardless of the interpreter's permissions.
768 */
769 would_dump(bprm, interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700770
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700771 /* Get the exec headers */
Alexey Dobriyan658c0332019-12-04 16:52:25 -0800772 retval = elf_read(interpreter, &loc->interp_elf_ex,
773 sizeof(loc->interp_elf_ex), 0);
774 if (retval < 0)
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700775 goto out_free_dentry;
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700776
777 break;
Alexey Dobriyancc338012019-05-14 15:43:39 -0700778
779out_free_interp:
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700780 kfree(elf_interpreter);
781 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700782 }
783
784 elf_ppnt = elf_phdata;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800785 for (i = 0; i < elf_ex->e_phnum; i++, elf_ppnt++)
Paul Burton774c1052014-09-11 08:30:16 +0100786 switch (elf_ppnt->p_type) {
787 case PT_GNU_STACK:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700788 if (elf_ppnt->p_flags & PF_X)
789 executable_stack = EXSTACK_ENABLE_X;
790 else
791 executable_stack = EXSTACK_DISABLE_X;
792 break;
Paul Burton774c1052014-09-11 08:30:16 +0100793
794 case PT_LOPROC ... PT_HIPROC:
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800795 retval = arch_elf_pt_proc(elf_ex, elf_ppnt,
Paul Burton774c1052014-09-11 08:30:16 +0100796 bprm->file, false,
797 &arch_state);
798 if (retval)
799 goto out_free_dentry;
800 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700801 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700802
803 /* Some simple consistency checks for the interpreter */
Alexey Dobriyancc338012019-05-14 15:43:39 -0700804 if (interpreter) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700805 retval = -ELIBBAD;
Andi Kleend20894a2008-02-08 04:21:54 -0800806 /* Not an ELF interpreter */
807 if (memcmp(loc->interp_elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700808 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700809 /* Verify the interpreter has a valid arch */
Nicolas Pitre47552002017-08-16 16:05:13 -0400810 if (!elf_check_arch(&loc->interp_elf_ex) ||
811 elf_check_fdpic(&loc->interp_elf_ex))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700812 goto out_free_dentry;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100813
814 /* Load the interpreter program headers */
815 interp_elf_phdata = load_elf_phdrs(&loc->interp_elf_ex,
816 interpreter);
817 if (!interp_elf_phdata)
818 goto out_free_dentry;
Paul Burton774c1052014-09-11 08:30:16 +0100819
820 /* Pass PT_LOPROC..PT_HIPROC headers to arch code */
821 elf_ppnt = interp_elf_phdata;
822 for (i = 0; i < loc->interp_elf_ex.e_phnum; i++, elf_ppnt++)
823 switch (elf_ppnt->p_type) {
824 case PT_LOPROC ... PT_HIPROC:
825 retval = arch_elf_pt_proc(&loc->interp_elf_ex,
826 elf_ppnt, interpreter,
827 true, &arch_state);
828 if (retval)
829 goto out_free_dentry;
830 break;
831 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700832 }
833
Paul Burton774c1052014-09-11 08:30:16 +0100834 /*
835 * Allow arch code to reject the ELF at this point, whilst it's
836 * still possible to return an error to the code that invoked
837 * the exec syscall.
838 */
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800839 retval = arch_check_elf(elf_ex,
Maciej W. Rozyckieb4bc072015-11-13 00:47:48 +0000840 !!interpreter, &loc->interp_elf_ex,
841 &arch_state);
Paul Burton774c1052014-09-11 08:30:16 +0100842 if (retval)
843 goto out_free_dentry;
844
Linus Torvalds1da177e2005-04-16 15:20:36 -0700845 /* Flush all traces of the currently running executable */
846 retval = flush_old_exec(bprm);
847 if (retval)
848 goto out_free_dentry;
849
Linus Torvalds1da177e2005-04-16 15:20:36 -0700850 /* Do this immediately, since STACK_TOP as used in setup_arg_pages
851 may depend on the personality. */
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800852 SET_PERSONALITY2(*elf_ex, &arch_state);
853 if (elf_read_implies_exec(*elf_ex, executable_stack))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700854 current->personality |= READ_IMPLIES_EXEC;
855
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700856 if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700857 current->flags |= PF_RANDOMIZE;
Linus Torvalds221af7f2010-01-28 22:14:42 -0800858
859 setup_new_exec(bprm);
Linus Torvalds9f834ec2016-08-22 16:41:46 -0700860 install_exec_creds(bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700861
862 /* Do this so that we can load the interpreter, if need be. We will
863 change some of these later */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700864 retval = setup_arg_pages(bprm, randomize_stack_top(STACK_TOP),
865 executable_stack);
Al Viro19d860a2014-05-04 20:11:36 -0400866 if (retval < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700867 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700868
Alexey Dobriyan852643162019-05-14 15:43:48 -0700869 elf_bss = 0;
870 elf_brk = 0;
871
872 start_code = ~0UL;
873 end_code = 0;
874 start_data = 0;
875 end_data = 0;
876
André Goddard Rosaaf901ca2009-11-14 13:09:05 -0200877 /* Now we do a little grungy work by mmapping the ELF image into
Jiri Kosinacc503c12008-01-30 13:31:07 +0100878 the correct location in memory. */
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700879 for(i = 0, elf_ppnt = elf_phdata;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800880 i < elf_ex->e_phnum; i++, elf_ppnt++) {
Linus Torvaldsb2129212019-10-06 13:53:27 -0700881 int elf_prot, elf_flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700882 unsigned long k, vaddr;
Michael Davidsona87938b2015-04-14 15:47:38 -0700883 unsigned long total_size = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700884
885 if (elf_ppnt->p_type != PT_LOAD)
886 continue;
887
888 if (unlikely (elf_brk > elf_bss)) {
889 unsigned long nbyte;
890
891 /* There was a PT_LOAD segment with p_memsz > p_filesz
892 before this one. Map anonymous pages, if needed,
893 and clear the area. */
Mikael Petterssonf670d0e2011-01-12 17:00:02 -0800894 retval = set_brk(elf_bss + load_bias,
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800895 elf_brk + load_bias,
896 bss_prot);
Al Viro19d860a2014-05-04 20:11:36 -0400897 if (retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700898 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700899 nbyte = ELF_PAGEOFFSET(elf_bss);
900 if (nbyte) {
901 nbyte = ELF_MIN_ALIGN - nbyte;
902 if (nbyte > elf_brk - elf_bss)
903 nbyte = elf_brk - elf_bss;
904 if (clear_user((void __user *)elf_bss +
905 load_bias, nbyte)) {
906 /*
907 * This bss-zeroing can fail if the ELF
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700908 * file specifies odd protections. So
Linus Torvalds1da177e2005-04-16 15:20:36 -0700909 * we don't check the return value
910 */
911 }
912 }
913 }
914
Alexey Dobriyand8e7cb32019-05-14 15:43:51 -0700915 elf_prot = make_prot(elf_ppnt->p_flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700916
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700917 elf_flags = MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700918
919 vaddr = elf_ppnt->p_vaddr;
Kees Cookeab09532017-07-10 15:52:37 -0700920 /*
921 * If we are loading ET_EXEC or we have already performed
922 * the ET_DYN load_addr calculations, proceed normally.
923 */
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800924 if (elf_ex->e_type == ET_EXEC || load_addr_set) {
Linus Torvaldsb2129212019-10-06 13:53:27 -0700925 elf_flags |= MAP_FIXED;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800926 } else if (elf_ex->e_type == ET_DYN) {
Kees Cookeab09532017-07-10 15:52:37 -0700927 /*
928 * This logic is run once for the first LOAD Program
929 * Header for ET_DYN binaries to calculate the
930 * randomization (load_bias) for all the LOAD
931 * Program Headers, and to calculate the entire
932 * size of the ELF mapping (total_size). (Note that
933 * load_addr_set is set to true later once the
934 * initial mapping is performed.)
935 *
936 * There are effectively two types of ET_DYN
937 * binaries: programs (i.e. PIE: ET_DYN with INTERP)
938 * and loaders (ET_DYN without INTERP, since they
939 * _are_ the ELF interpreter). The loaders must
940 * be loaded away from programs since the program
941 * may otherwise collide with the loader (especially
942 * for ET_EXEC which does not have a randomized
943 * position). For example to handle invocations of
944 * "./ld.so someprog" to test out a new version of
945 * the loader, the subsequent program that the
946 * loader loads must avoid the loader itself, so
947 * they cannot share the same load range. Sufficient
948 * room for the brk must be allocated with the
949 * loader as well, since brk must be available with
950 * the loader.
951 *
952 * Therefore, programs are loaded offset from
953 * ELF_ET_DYN_BASE and loaders are loaded into the
954 * independently randomized mmap region (0 load_bias
955 * without MAP_FIXED).
956 */
Alexey Dobriyancc338012019-05-14 15:43:39 -0700957 if (interpreter) {
Kees Cookeab09532017-07-10 15:52:37 -0700958 load_bias = ELF_ET_DYN_BASE;
959 if (current->flags & PF_RANDOMIZE)
960 load_bias += arch_mmap_rnd();
Linus Torvaldsb2129212019-10-06 13:53:27 -0700961 elf_flags |= MAP_FIXED;
Kees Cookeab09532017-07-10 15:52:37 -0700962 } else
963 load_bias = 0;
964
965 /*
966 * Since load_bias is used for all subsequent loading
967 * calculations, we must lower it by the first vaddr
968 * so that the remaining calculations based on the
969 * ELF vaddrs will be correctly offset. The result
970 * is then page aligned.
971 */
972 load_bias = ELF_PAGESTART(load_bias - vaddr);
973
Michael Davidsona87938b2015-04-14 15:47:38 -0700974 total_size = total_mapping_size(elf_phdata,
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800975 elf_ex->e_phnum);
Michael Davidsona87938b2015-04-14 15:47:38 -0700976 if (!total_size) {
Andrew Morton2b1d3ae2015-05-28 15:44:24 -0700977 retval = -EINVAL;
Michael Davidsona87938b2015-04-14 15:47:38 -0700978 goto out_free_dentry;
979 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700980 }
981
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700982 error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt,
Michael Davidsona87938b2015-04-14 15:47:38 -0700983 elf_prot, elf_flags, total_size);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700984 if (BAD_ADDR(error)) {
Alexey Kuznetsovb140f2512007-05-08 00:31:57 -0700985 retval = IS_ERR((void *)error) ?
986 PTR_ERR((void*)error) : -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700987 goto out_free_dentry;
988 }
989
990 if (!load_addr_set) {
991 load_addr_set = 1;
992 load_addr = (elf_ppnt->p_vaddr - elf_ppnt->p_offset);
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800993 if (elf_ex->e_type == ET_DYN) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700994 load_bias += error -
995 ELF_PAGESTART(load_bias + vaddr);
996 load_addr += load_bias;
997 reloc_func_desc = load_bias;
998 }
999 }
1000 k = elf_ppnt->p_vaddr;
Alexey Dobriyanf67ef442020-01-30 22:16:52 -08001001 if ((elf_ppnt->p_flags & PF_X) && k < start_code)
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001002 start_code = k;
1003 if (start_data < k)
1004 start_data = k;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001005
1006 /*
1007 * Check to see if the section's size will overflow the
1008 * allowed task size. Note that p_filesz must always be
1009 * <= p_memsz so it is only necessary to check p_memsz.
1010 */
Chuck Ebbertce510592006-07-03 00:24:14 -07001011 if (BAD_ADDR(k) || elf_ppnt->p_filesz > elf_ppnt->p_memsz ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07001012 elf_ppnt->p_memsz > TASK_SIZE ||
1013 TASK_SIZE - elf_ppnt->p_memsz < k) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001014 /* set_brk can never work. Avoid overflows. */
Alexey Kuznetsovb140f2512007-05-08 00:31:57 -07001015 retval = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001016 goto out_free_dentry;
1017 }
1018
1019 k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz;
1020
1021 if (k > elf_bss)
1022 elf_bss = k;
1023 if ((elf_ppnt->p_flags & PF_X) && end_code < k)
1024 end_code = k;
1025 if (end_data < k)
1026 end_data = k;
1027 k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz;
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001028 if (k > elf_brk) {
1029 bss_prot = elf_prot;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001030 elf_brk = k;
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001031 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001032 }
1033
Alexey Dobriyana62c5b12020-01-30 22:16:55 -08001034 e_entry = elf_ex->e_entry + load_bias;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001035 elf_bss += load_bias;
1036 elf_brk += load_bias;
1037 start_code += load_bias;
1038 end_code += load_bias;
1039 start_data += load_bias;
1040 end_data += load_bias;
1041
1042 /* Calling set_brk effectively mmaps the pages that we need
1043 * for the bss and break sections. We must do this before
1044 * mapping in the interpreter, to make sure it doesn't wind
1045 * up getting placed where the bss needs to go.
1046 */
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001047 retval = set_brk(elf_bss, elf_brk, bss_prot);
Al Viro19d860a2014-05-04 20:11:36 -04001048 if (retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001049 goto out_free_dentry;
akpm@osdl.org6de50512005-10-11 08:29:08 -07001050 if (likely(elf_bss != elf_brk) && unlikely(padzero(elf_bss))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001051 retval = -EFAULT; /* Nobody gets to see this, but.. */
1052 goto out_free_dentry;
1053 }
1054
Alexey Dobriyancc338012019-05-14 15:43:39 -07001055 if (interpreter) {
Andi Kleend20894a2008-02-08 04:21:54 -08001056 elf_entry = load_elf_interp(&loc->interp_elf_ex,
1057 interpreter,
Paul Burtona9d9ef12014-09-11 08:30:15 +01001058 load_bias, interp_elf_phdata);
Andi Kleend20894a2008-02-08 04:21:54 -08001059 if (!IS_ERR((void *)elf_entry)) {
1060 /*
1061 * load_elf_interp() returns relocation
1062 * adjustment
1063 */
1064 interp_load_addr = elf_entry;
1065 elf_entry += loc->interp_elf_ex.e_entry;
Jiri Kosinacc503c12008-01-30 13:31:07 +01001066 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001067 if (BAD_ADDR(elf_entry)) {
Chuck Ebbertce510592006-07-03 00:24:14 -07001068 retval = IS_ERR((void *)elf_entry) ?
1069 (int)elf_entry : -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001070 goto out_free_dentry;
1071 }
1072 reloc_func_desc = interp_load_addr;
1073
1074 allow_write_access(interpreter);
1075 fput(interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001076 } else {
Alexey Dobriyana62c5b12020-01-30 22:16:55 -08001077 elf_entry = e_entry;
Suresh Siddha5342fba2006-02-26 04:18:28 +01001078 if (BAD_ADDR(elf_entry)) {
Chuck Ebbertce510592006-07-03 00:24:14 -07001079 retval = -EINVAL;
Suresh Siddha5342fba2006-02-26 04:18:28 +01001080 goto out_free_dentry;
1081 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001082 }
1083
Paul Burton774c1052014-09-11 08:30:16 +01001084 kfree(interp_elf_phdata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001085 kfree(elf_phdata);
1086
Linus Torvalds1da177e2005-04-16 15:20:36 -07001087 set_binfmt(&elf_format);
1088
Benjamin Herrenschmidt547ee842005-04-16 15:24:35 -07001089#ifdef ARCH_HAS_SETUP_ADDITIONAL_PAGES
Alexey Dobriyancc338012019-05-14 15:43:39 -07001090 retval = arch_setup_additional_pages(bprm, !!interpreter);
Al Viro19d860a2014-05-04 20:11:36 -04001091 if (retval < 0)
Roland McGrath18c8baff2005-04-28 15:17:19 -07001092 goto out;
Benjamin Herrenschmidt547ee842005-04-16 15:24:35 -07001093#endif /* ARCH_HAS_SETUP_ADDITIONAL_PAGES */
1094
Alexey Dobriyana62c5b12020-01-30 22:16:55 -08001095 retval = create_elf_tables(bprm, elf_ex,
1096 load_addr, interp_load_addr, e_entry);
Al Viro19d860a2014-05-04 20:11:36 -04001097 if (retval < 0)
Ollie Wildb6a2fea2007-07-19 01:48:16 -07001098 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001099 current->mm->end_code = end_code;
1100 current->mm->start_code = start_code;
1101 current->mm->start_data = start_data;
1102 current->mm->end_data = end_data;
1103 current->mm->start_stack = bprm->p;
1104
Jiri Kosina4471a672011-04-14 15:22:09 -07001105 if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1)) {
Kees Cookbbdc6072019-05-14 15:43:57 -07001106 /*
1107 * For architectures with ELF randomization, when executing
1108 * a loader directly (i.e. no interpreter listed in ELF
1109 * headers), move the brk area out of the mmap region
1110 * (since it grows up, and may collide early with the stack
1111 * growing down), and into the unused ELF_ET_DYN_BASE region.
1112 */
Kees Cook7be3cb02019-09-26 10:15:25 -07001113 if (IS_ENABLED(CONFIG_ARCH_HAS_ELF_RANDOMIZE) &&
Alexey Dobriyana62c5b12020-01-30 22:16:55 -08001114 elf_ex->e_type == ET_DYN && !interpreter)
Kees Cookbbdc6072019-05-14 15:43:57 -07001115 current->mm->brk = current->mm->start_brk =
1116 ELF_ET_DYN_BASE;
1117
Jiri Kosinac1d171a2008-01-30 13:30:40 +01001118 current->mm->brk = current->mm->start_brk =
1119 arch_randomize_brk(current->mm);
Kees Cook204db6e2015-04-14 15:48:12 -07001120#ifdef compat_brk_randomized
Jiri Kosina4471a672011-04-14 15:22:09 -07001121 current->brk_randomized = 1;
1122#endif
1123 }
Jiri Kosinac1d171a2008-01-30 13:30:40 +01001124
Linus Torvalds1da177e2005-04-16 15:20:36 -07001125 if (current->personality & MMAP_PAGE_ZERO) {
1126 /* Why this, you ask??? Well SVr4 maps page 0 as read-only,
1127 and some applications "depend" upon this behavior.
1128 Since we do not have the power to recompile these, we
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001129 emulate the SVr4 behavior. Sigh. */
Linus Torvalds6be5ceb2012-04-20 17:13:58 -07001130 error = vm_mmap(NULL, 0, PAGE_SIZE, PROT_READ | PROT_EXEC,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001131 MAP_FIXED | MAP_PRIVATE, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001132 }
1133
Alexey Dobriyan249b08e2019-05-14 15:43:54 -07001134 regs = current_pt_regs();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001135#ifdef ELF_PLAT_INIT
1136 /*
1137 * The ABI may specify that certain registers be set up in special
1138 * ways (on i386 %edx is the address of a DT_FINI function, for
1139 * example. In addition, it may also specify (eg, PowerPC64 ELF)
1140 * that the e_entry field is the address of the function descriptor
1141 * for the startup routine, rather than the address of the startup
1142 * routine itself. This macro performs whatever initialization to
1143 * the regs structure is required as well as any relocations to the
1144 * function descriptor entries when executing dynamically links apps.
1145 */
1146 ELF_PLAT_INIT(regs, reloc_func_desc);
1147#endif
1148
Kees Cookb8383832018-04-10 16:34:57 -07001149 finalize_exec(bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001150 start_thread(regs, elf_entry, bprm->p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001151 retval = 0;
1152out:
1153 kfree(loc);
1154out_ret:
1155 return retval;
1156
1157 /* error cleanup */
1158out_free_dentry:
Paul Burtona9d9ef12014-09-11 08:30:15 +01001159 kfree(interp_elf_phdata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001160 allow_write_access(interpreter);
1161 if (interpreter)
1162 fput(interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163out_free_ph:
1164 kfree(elf_phdata);
1165 goto out;
1166}
1167
Josh Triplett69369a72014-04-03 14:48:27 -07001168#ifdef CONFIG_USELIB
Linus Torvalds1da177e2005-04-16 15:20:36 -07001169/* This is really simpleminded and specialized - we are loading an
1170 a.out library that is given an ELF header. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001171static int load_elf_library(struct file *file)
1172{
1173 struct elf_phdr *elf_phdata;
1174 struct elf_phdr *eppnt;
1175 unsigned long elf_bss, bss, len;
1176 int retval, error, i, j;
1177 struct elfhdr elf_ex;
1178
1179 error = -ENOEXEC;
Alexey Dobriyan658c0332019-12-04 16:52:25 -08001180 retval = elf_read(file, &elf_ex, sizeof(elf_ex), 0);
1181 if (retval < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001182 goto out;
1183
1184 if (memcmp(elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
1185 goto out;
1186
1187 /* First of all, some simple consistency checks */
1188 if (elf_ex.e_type != ET_EXEC || elf_ex.e_phnum > 2 ||
Al Viro72c2d532013-09-22 16:27:52 -04001189 !elf_check_arch(&elf_ex) || !file->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001190 goto out;
Nicolas Pitre47552002017-08-16 16:05:13 -04001191 if (elf_check_fdpic(&elf_ex))
1192 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001193
1194 /* Now read in all of the header information */
1195
1196 j = sizeof(struct elf_phdr) * elf_ex.e_phnum;
1197 /* j < ELF_MIN_ALIGN because elf_ex.e_phnum <= 2 */
1198
1199 error = -ENOMEM;
1200 elf_phdata = kmalloc(j, GFP_KERNEL);
1201 if (!elf_phdata)
1202 goto out;
1203
1204 eppnt = elf_phdata;
1205 error = -ENOEXEC;
Alexey Dobriyan658c0332019-12-04 16:52:25 -08001206 retval = elf_read(file, eppnt, j, elf_ex.e_phoff);
1207 if (retval < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001208 goto out_free_ph;
1209
1210 for (j = 0, i = 0; i<elf_ex.e_phnum; i++)
1211 if ((eppnt + i)->p_type == PT_LOAD)
1212 j++;
1213 if (j != 1)
1214 goto out_free_ph;
1215
1216 while (eppnt->p_type != PT_LOAD)
1217 eppnt++;
1218
1219 /* Now use mmap to map the library into memory. */
Linus Torvalds6be5ceb2012-04-20 17:13:58 -07001220 error = vm_mmap(file,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001221 ELF_PAGESTART(eppnt->p_vaddr),
1222 (eppnt->p_filesz +
1223 ELF_PAGEOFFSET(eppnt->p_vaddr)),
1224 PROT_READ | PROT_WRITE | PROT_EXEC,
Michal Hocko4ed28632018-04-10 16:36:01 -07001225 MAP_FIXED_NOREPLACE | MAP_PRIVATE | MAP_DENYWRITE,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001226 (eppnt->p_offset -
1227 ELF_PAGEOFFSET(eppnt->p_vaddr)));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001228 if (error != ELF_PAGESTART(eppnt->p_vaddr))
1229 goto out_free_ph;
1230
1231 elf_bss = eppnt->p_vaddr + eppnt->p_filesz;
1232 if (padzero(elf_bss)) {
1233 error = -EFAULT;
1234 goto out_free_ph;
1235 }
1236
Oscar Salvador24962af2018-07-13 16:59:13 -07001237 len = ELF_PAGEALIGN(eppnt->p_filesz + eppnt->p_vaddr);
1238 bss = ELF_PAGEALIGN(eppnt->p_memsz + eppnt->p_vaddr);
Michal Hockoecc2bc82016-05-23 16:25:39 -07001239 if (bss > len) {
1240 error = vm_brk(len, bss - len);
Linus Torvalds5d22fc22016-05-27 15:57:31 -07001241 if (error)
Michal Hockoecc2bc82016-05-23 16:25:39 -07001242 goto out_free_ph;
1243 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001244 error = 0;
1245
1246out_free_ph:
1247 kfree(elf_phdata);
1248out:
1249 return error;
1250}
Josh Triplett69369a72014-04-03 14:48:27 -07001251#endif /* #ifdef CONFIG_USELIB */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001252
Christoph Hellwig698ba7b2009-12-15 16:47:37 -08001253#ifdef CONFIG_ELF_CORE
Linus Torvalds1da177e2005-04-16 15:20:36 -07001254/*
1255 * ELF core dumper
1256 *
1257 * Modelled on fs/exec.c:aout_core_dump()
1258 * Jeremy Fitzhardinge <jeremy@sw.oz.au>
1259 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001260
1261/*
Jason Baron909af762012-03-23 15:02:51 -07001262 * The purpose of always_dump_vma() is to make sure that special kernel mappings
1263 * that are useful for post-mortem analysis are included in every core dump.
1264 * In that way we ensure that the core dump is fully interpretable later
1265 * without matching up the same kernel and hardware config to see what PC values
1266 * meant. These special mappings include - vDSO, vsyscall, and other
1267 * architecture specific mappings
1268 */
1269static bool always_dump_vma(struct vm_area_struct *vma)
1270{
1271 /* Any vsyscall mappings? */
1272 if (vma == get_gate_vma(vma->vm_mm))
1273 return true;
Andy Lutomirski78d683e2014-05-19 15:58:32 -07001274
1275 /*
1276 * Assume that all vmas with a .name op should always be dumped.
1277 * If this changes, a new vm_ops field can easily be added.
1278 */
1279 if (vma->vm_ops && vma->vm_ops->name && vma->vm_ops->name(vma))
1280 return true;
1281
Jason Baron909af762012-03-23 15:02:51 -07001282 /*
1283 * arch_vma_name() returns non-NULL for special architecture mappings,
1284 * such as vDSO sections.
1285 */
1286 if (arch_vma_name(vma))
1287 return true;
1288
1289 return false;
1290}
1291
1292/*
Roland McGrath82df3972007-10-16 23:27:02 -07001293 * Decide what to dump of a segment, part, all or none.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001294 */
Roland McGrath82df3972007-10-16 23:27:02 -07001295static unsigned long vma_dump_size(struct vm_area_struct *vma,
1296 unsigned long mm_flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001297{
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001298#define FILTER(type) (mm_flags & (1UL << MMF_DUMP_##type))
1299
Jason Baron909af762012-03-23 15:02:51 -07001300 /* always dump the vdso and vsyscall sections */
1301 if (always_dump_vma(vma))
Roland McGrath82df3972007-10-16 23:27:02 -07001302 goto whole;
Roland McGrathe5b97dd2007-01-26 00:56:48 -08001303
Konstantin Khlebnikov0103bd12012-10-08 16:28:59 -07001304 if (vma->vm_flags & VM_DONTDUMP)
Jason Baronaccb61f2012-03-23 15:02:51 -07001305 return 0;
1306
Ross Zwisler50378352015-10-05 16:33:36 -06001307 /* support for DAX */
1308 if (vma_is_dax(vma)) {
1309 if ((vma->vm_flags & VM_SHARED) && FILTER(DAX_SHARED))
1310 goto whole;
1311 if (!(vma->vm_flags & VM_SHARED) && FILTER(DAX_PRIVATE))
1312 goto whole;
1313 return 0;
1314 }
1315
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001316 /* Hugetlb memory check */
1317 if (vma->vm_flags & VM_HUGETLB) {
1318 if ((vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_SHARED))
1319 goto whole;
1320 if (!(vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_PRIVATE))
1321 goto whole;
Naoya Horiguchi23d9e482013-04-17 15:58:28 -07001322 return 0;
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001323 }
1324
Linus Torvalds1da177e2005-04-16 15:20:36 -07001325 /* Do not dump I/O mapped devices or special mappings */
Konstantin Khlebnikov314e51b2012-10-08 16:29:02 -07001326 if (vma->vm_flags & VM_IO)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001327 return 0;
1328
Kawai, Hidehiroa1b59e82007-07-19 01:48:29 -07001329 /* By default, dump shared memory if mapped from an anonymous file. */
1330 if (vma->vm_flags & VM_SHARED) {
Al Viro496ad9a2013-01-23 17:07:38 -05001331 if (file_inode(vma->vm_file)->i_nlink == 0 ?
Roland McGrath82df3972007-10-16 23:27:02 -07001332 FILTER(ANON_SHARED) : FILTER(MAPPED_SHARED))
1333 goto whole;
1334 return 0;
Kawai, Hidehiroa1b59e82007-07-19 01:48:29 -07001335 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001336
Roland McGrath82df3972007-10-16 23:27:02 -07001337 /* Dump segments that have been written to. */
1338 if (vma->anon_vma && FILTER(ANON_PRIVATE))
1339 goto whole;
1340 if (vma->vm_file == NULL)
1341 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001342
Roland McGrath82df3972007-10-16 23:27:02 -07001343 if (FILTER(MAPPED_PRIVATE))
1344 goto whole;
1345
1346 /*
1347 * If this looks like the beginning of a DSO or executable mapping,
1348 * check for an ELF header. If we find one, dump the first page to
1349 * aid in determining what was mapped here.
1350 */
Roland McGrath92dc07b2009-02-06 17:34:07 -08001351 if (FILTER(ELF_HEADERS) &&
1352 vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) {
Roland McGrath82df3972007-10-16 23:27:02 -07001353 u32 __user *header = (u32 __user *) vma->vm_start;
1354 u32 word;
Roland McGrath92dc07b2009-02-06 17:34:07 -08001355 mm_segment_t fs = get_fs();
Roland McGrath82df3972007-10-16 23:27:02 -07001356 /*
1357 * Doing it this way gets the constant folded by GCC.
1358 */
1359 union {
1360 u32 cmp;
1361 char elfmag[SELFMAG];
1362 } magic;
1363 BUILD_BUG_ON(SELFMAG != sizeof word);
1364 magic.elfmag[EI_MAG0] = ELFMAG0;
1365 magic.elfmag[EI_MAG1] = ELFMAG1;
1366 magic.elfmag[EI_MAG2] = ELFMAG2;
1367 magic.elfmag[EI_MAG3] = ELFMAG3;
Roland McGrath92dc07b2009-02-06 17:34:07 -08001368 /*
1369 * Switch to the user "segment" for get_user(),
1370 * then put back what elf_core_dump() had in place.
1371 */
1372 set_fs(USER_DS);
1373 if (unlikely(get_user(word, header)))
1374 word = 0;
1375 set_fs(fs);
1376 if (word == magic.cmp)
Roland McGrath82df3972007-10-16 23:27:02 -07001377 return PAGE_SIZE;
1378 }
1379
1380#undef FILTER
1381
1382 return 0;
1383
1384whole:
1385 return vma->vm_end - vma->vm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001386}
1387
Linus Torvalds1da177e2005-04-16 15:20:36 -07001388/* An ELF note in memory */
1389struct memelfnote
1390{
1391 const char *name;
1392 int type;
1393 unsigned int datasz;
1394 void *data;
1395};
1396
1397static int notesize(struct memelfnote *en)
1398{
1399 int sz;
1400
1401 sz = sizeof(struct elf_note);
1402 sz += roundup(strlen(en->name) + 1, 4);
1403 sz += roundup(en->datasz, 4);
1404
1405 return sz;
1406}
1407
Al Viroecc8c772013-10-05 15:32:35 -04001408static int writenote(struct memelfnote *men, struct coredump_params *cprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001409{
1410 struct elf_note en;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001411 en.n_namesz = strlen(men->name) + 1;
1412 en.n_descsz = men->datasz;
1413 en.n_type = men->type;
1414
Al Viroecc8c772013-10-05 15:32:35 -04001415 return dump_emit(cprm, &en, sizeof(en)) &&
Al Viro22a8cb82013-10-08 11:05:01 -04001416 dump_emit(cprm, men->name, en.n_namesz) && dump_align(cprm, 4) &&
1417 dump_emit(cprm, men->data, men->datasz) && dump_align(cprm, 4);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001418}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001419
Roland McGrath3aba4812008-01-30 13:31:44 +01001420static void fill_elf_header(struct elfhdr *elf, int segs,
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001421 u16 machine, u32 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001422{
Cyrill Gorcunov6970c8e2008-04-29 01:01:18 -07001423 memset(elf, 0, sizeof(*elf));
1424
Linus Torvalds1da177e2005-04-16 15:20:36 -07001425 memcpy(elf->e_ident, ELFMAG, SELFMAG);
1426 elf->e_ident[EI_CLASS] = ELF_CLASS;
1427 elf->e_ident[EI_DATA] = ELF_DATA;
1428 elf->e_ident[EI_VERSION] = EV_CURRENT;
1429 elf->e_ident[EI_OSABI] = ELF_OSABI;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001430
1431 elf->e_type = ET_CORE;
Roland McGrath3aba4812008-01-30 13:31:44 +01001432 elf->e_machine = machine;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001433 elf->e_version = EV_CURRENT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001434 elf->e_phoff = sizeof(struct elfhdr);
Roland McGrath3aba4812008-01-30 13:31:44 +01001435 elf->e_flags = flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001436 elf->e_ehsize = sizeof(struct elfhdr);
1437 elf->e_phentsize = sizeof(struct elf_phdr);
1438 elf->e_phnum = segs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001439}
1440
Andrew Morton8d6b5eee2006-09-25 23:32:04 -07001441static void fill_elf_note_phdr(struct elf_phdr *phdr, int sz, loff_t offset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001442{
1443 phdr->p_type = PT_NOTE;
1444 phdr->p_offset = offset;
1445 phdr->p_vaddr = 0;
1446 phdr->p_paddr = 0;
1447 phdr->p_filesz = sz;
1448 phdr->p_memsz = 0;
1449 phdr->p_flags = 0;
1450 phdr->p_align = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001451}
1452
1453static void fill_note(struct memelfnote *note, const char *name, int type,
1454 unsigned int sz, void *data)
1455{
1456 note->name = name;
1457 note->type = type;
1458 note->datasz = sz;
1459 note->data = data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001460}
1461
1462/*
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001463 * fill up all the fields in prstatus from the given task struct, except
1464 * registers which need to be filled up separately.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001465 */
1466static void fill_prstatus(struct elf_prstatus *prstatus,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001467 struct task_struct *p, long signr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001468{
1469 prstatus->pr_info.si_signo = prstatus->pr_cursig = signr;
1470 prstatus->pr_sigpend = p->pending.signal.sig[0];
1471 prstatus->pr_sighold = p->blocked.sig[0];
Oleg Nesterov3b34fc52009-06-17 16:27:38 -07001472 rcu_read_lock();
1473 prstatus->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1474 rcu_read_unlock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001475 prstatus->pr_pid = task_pid_vnr(p);
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001476 prstatus->pr_pgrp = task_pgrp_vnr(p);
1477 prstatus->pr_sid = task_session_vnr(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001478 if (thread_group_leader(p)) {
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001479 struct task_cputime cputime;
Frank Mayharf06febc2008-09-12 09:54:39 -07001480
Linus Torvalds1da177e2005-04-16 15:20:36 -07001481 /*
Frank Mayharf06febc2008-09-12 09:54:39 -07001482 * This is the record for the group leader. It shows the
1483 * group-wide total, not its individual thread total.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001484 */
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001485 thread_group_cputime(p, &cputime);
Arnd Bergmanne2bb80d2017-11-23 13:46:33 +01001486 prstatus->pr_utime = ns_to_kernel_old_timeval(cputime.utime);
1487 prstatus->pr_stime = ns_to_kernel_old_timeval(cputime.stime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001488 } else {
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001489 u64 utime, stime;
Frederic Weisbecker6fac4822012-11-13 14:20:55 +01001490
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001491 task_cputime(p, &utime, &stime);
Arnd Bergmanne2bb80d2017-11-23 13:46:33 +01001492 prstatus->pr_utime = ns_to_kernel_old_timeval(utime);
1493 prstatus->pr_stime = ns_to_kernel_old_timeval(stime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001494 }
Frederic Weisbecker5613fda2017-01-31 04:09:23 +01001495
Arnd Bergmanne2bb80d2017-11-23 13:46:33 +01001496 prstatus->pr_cutime = ns_to_kernel_old_timeval(p->signal->cutime);
1497 prstatus->pr_cstime = ns_to_kernel_old_timeval(p->signal->cstime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001498}
1499
1500static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p,
1501 struct mm_struct *mm)
1502{
David Howellsc69e8d92008-11-14 10:39:19 +11001503 const struct cred *cred;
Greg Kroah-Hartmana84a5052005-05-11 00:10:44 -07001504 unsigned int i, len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001505
1506 /* first copy the parameters from user space */
1507 memset(psinfo, 0, sizeof(struct elf_prpsinfo));
1508
1509 len = mm->arg_end - mm->arg_start;
1510 if (len >= ELF_PRARGSZ)
1511 len = ELF_PRARGSZ-1;
1512 if (copy_from_user(&psinfo->pr_psargs,
1513 (const char __user *)mm->arg_start, len))
1514 return -EFAULT;
1515 for(i = 0; i < len; i++)
1516 if (psinfo->pr_psargs[i] == 0)
1517 psinfo->pr_psargs[i] = ' ';
1518 psinfo->pr_psargs[len] = 0;
1519
Oleg Nesterov3b34fc52009-06-17 16:27:38 -07001520 rcu_read_lock();
1521 psinfo->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1522 rcu_read_unlock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001523 psinfo->pr_pid = task_pid_vnr(p);
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001524 psinfo->pr_pgrp = task_pgrp_vnr(p);
1525 psinfo->pr_sid = task_session_vnr(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001526
1527 i = p->state ? ffz(~p->state) + 1 : 0;
1528 psinfo->pr_state = i;
Carsten Otte55148542006-03-25 03:08:22 -08001529 psinfo->pr_sname = (i > 5) ? '.' : "RSDTZW"[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001530 psinfo->pr_zomb = psinfo->pr_sname == 'Z';
1531 psinfo->pr_nice = task_nice(p);
1532 psinfo->pr_flag = p->flags;
David Howellsc69e8d92008-11-14 10:39:19 +11001533 rcu_read_lock();
1534 cred = __task_cred(p);
Eric W. Biedermanebc887b2012-02-07 18:36:10 -08001535 SET_UID(psinfo->pr_uid, from_kuid_munged(cred->user_ns, cred->uid));
1536 SET_GID(psinfo->pr_gid, from_kgid_munged(cred->user_ns, cred->gid));
David Howellsc69e8d92008-11-14 10:39:19 +11001537 rcu_read_unlock();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001538 strncpy(psinfo->pr_fname, p->comm, sizeof(psinfo->pr_fname));
1539
1540 return 0;
1541}
1542
Roland McGrath3aba4812008-01-30 13:31:44 +01001543static void fill_auxv_note(struct memelfnote *note, struct mm_struct *mm)
1544{
1545 elf_addr_t *auxv = (elf_addr_t *) mm->saved_auxv;
1546 int i = 0;
1547 do
1548 i += 2;
1549 while (auxv[i - 2] != AT_NULL);
1550 fill_note(note, "CORE", NT_AUXV, i * sizeof(elf_addr_t), auxv);
1551}
1552
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001553static void fill_siginfo_note(struct memelfnote *note, user_siginfo_t *csigdata,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02001554 const kernel_siginfo_t *siginfo)
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001555{
1556 mm_segment_t old_fs = get_fs();
1557 set_fs(KERNEL_DS);
1558 copy_siginfo_to_user((user_siginfo_t __user *) csigdata, siginfo);
1559 set_fs(old_fs);
1560 fill_note(note, "CORE", NT_SIGINFO, sizeof(*csigdata), csigdata);
1561}
1562
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001563#define MAX_FILE_NOTE_SIZE (4*1024*1024)
1564/*
1565 * Format of NT_FILE note:
1566 *
1567 * long count -- how many files are mapped
1568 * long page_size -- units for file_ofs
1569 * array of [COUNT] elements of
1570 * long start
1571 * long end
1572 * long file_ofs
1573 * followed by COUNT filenames in ASCII: "FILE1" NUL "FILE2" NUL...
1574 */
Dan Aloni72023652013-09-30 13:45:02 -07001575static int fill_files_note(struct memelfnote *note)
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001576{
1577 struct vm_area_struct *vma;
1578 unsigned count, size, names_ofs, remaining, n;
1579 user_long_t *data;
1580 user_long_t *start_end_ofs;
1581 char *name_base, *name_curpos;
1582
1583 /* *Estimated* file count and total data size needed */
1584 count = current->mm->map_count;
Alexey Dobriyan60c9d922018-02-06 15:39:13 -08001585 if (count > UINT_MAX / 64)
1586 return -EINVAL;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001587 size = count * 64;
1588
1589 names_ofs = (2 + 3 * count) * sizeof(data[0]);
1590 alloc:
1591 if (size >= MAX_FILE_NOTE_SIZE) /* paranoia check */
Dan Aloni72023652013-09-30 13:45:02 -07001592 return -EINVAL;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001593 size = round_up(size, PAGE_SIZE);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001594 data = kvmalloc(size, GFP_KERNEL);
1595 if (ZERO_OR_NULL_PTR(data))
Dan Aloni72023652013-09-30 13:45:02 -07001596 return -ENOMEM;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001597
1598 start_end_ofs = data + 2;
1599 name_base = name_curpos = ((char *)data) + names_ofs;
1600 remaining = size - names_ofs;
1601 count = 0;
1602 for (vma = current->mm->mmap; vma != NULL; vma = vma->vm_next) {
1603 struct file *file;
1604 const char *filename;
1605
1606 file = vma->vm_file;
1607 if (!file)
1608 continue;
Miklos Szeredi9bf39ab2015-06-19 10:29:13 +02001609 filename = file_path(file, name_curpos, remaining);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001610 if (IS_ERR(filename)) {
1611 if (PTR_ERR(filename) == -ENAMETOOLONG) {
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001612 kvfree(data);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001613 size = size * 5 / 4;
1614 goto alloc;
1615 }
1616 continue;
1617 }
1618
Miklos Szeredi9bf39ab2015-06-19 10:29:13 +02001619 /* file_path() fills at the end, move name down */
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001620 /* n = strlen(filename) + 1: */
1621 n = (name_curpos + remaining) - filename;
1622 remaining = filename - name_curpos;
1623 memmove(name_curpos, filename, n);
1624 name_curpos += n;
1625
1626 *start_end_ofs++ = vma->vm_start;
1627 *start_end_ofs++ = vma->vm_end;
1628 *start_end_ofs++ = vma->vm_pgoff;
1629 count++;
1630 }
1631
1632 /* Now we know exact count of files, can store it */
1633 data[0] = count;
1634 data[1] = PAGE_SIZE;
1635 /*
1636 * Count usually is less than current->mm->map_count,
1637 * we need to move filenames down.
1638 */
1639 n = current->mm->map_count - count;
1640 if (n != 0) {
1641 unsigned shift_bytes = n * 3 * sizeof(data[0]);
1642 memmove(name_base - shift_bytes, name_base,
1643 name_curpos - name_base);
1644 name_curpos -= shift_bytes;
1645 }
1646
1647 size = name_curpos - (char *)data;
1648 fill_note(note, "CORE", NT_FILE, size, data);
Dan Aloni72023652013-09-30 13:45:02 -07001649 return 0;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001650}
1651
Roland McGrath4206d3a2008-01-30 13:31:45 +01001652#ifdef CORE_DUMP_USE_REGSET
1653#include <linux/regset.h>
1654
1655struct elf_thread_core_info {
1656 struct elf_thread_core_info *next;
1657 struct task_struct *task;
1658 struct elf_prstatus prstatus;
1659 struct memelfnote notes[0];
1660};
1661
1662struct elf_note_info {
1663 struct elf_thread_core_info *thread;
1664 struct memelfnote psinfo;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001665 struct memelfnote signote;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001666 struct memelfnote auxv;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001667 struct memelfnote files;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001668 user_siginfo_t csigdata;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001669 size_t size;
1670 int thread_notes;
1671};
1672
Roland McGrathd31472b2008-03-04 14:28:30 -08001673/*
1674 * When a regset has a writeback hook, we call it on each thread before
1675 * dumping user memory. On register window machines, this makes sure the
1676 * user memory backing the register data is up to date before we read it.
1677 */
1678static void do_thread_regset_writeback(struct task_struct *task,
1679 const struct user_regset *regset)
1680{
1681 if (regset->writeback)
1682 regset->writeback(task, regset, 1);
1683}
1684
H. J. Lu0953f65d2012-02-14 13:34:52 -08001685#ifndef PRSTATUS_SIZE
Dmitry Safonov90954e72016-09-05 16:33:06 +03001686#define PRSTATUS_SIZE(S, R) sizeof(S)
H. J. Lu0953f65d2012-02-14 13:34:52 -08001687#endif
1688
1689#ifndef SET_PR_FPVALID
Dmitry Safonov90954e72016-09-05 16:33:06 +03001690#define SET_PR_FPVALID(S, V, R) ((S)->pr_fpvalid = (V))
H. J. Lu0953f65d2012-02-14 13:34:52 -08001691#endif
1692
Roland McGrath4206d3a2008-01-30 13:31:45 +01001693static int fill_thread_core_info(struct elf_thread_core_info *t,
1694 const struct user_regset_view *view,
1695 long signr, size_t *total)
1696{
1697 unsigned int i;
Dave Martin27e64b42017-10-31 15:50:53 +00001698 unsigned int regset0_size = regset_size(t->task, &view->regsets[0]);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001699
1700 /*
1701 * NT_PRSTATUS is the one special case, because the regset data
1702 * goes into the pr_reg field inside the note contents, rather
1703 * than being the whole note contents. We fill the reset in here.
1704 * We assume that regset 0 is NT_PRSTATUS.
1705 */
1706 fill_prstatus(&t->prstatus, t->task, signr);
Dave Martin27e64b42017-10-31 15:50:53 +00001707 (void) view->regsets[0].get(t->task, &view->regsets[0], 0, regset0_size,
Dmitry Safonov90954e72016-09-05 16:33:06 +03001708 &t->prstatus.pr_reg, NULL);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001709
1710 fill_note(&t->notes[0], "CORE", NT_PRSTATUS,
Dave Martin27e64b42017-10-31 15:50:53 +00001711 PRSTATUS_SIZE(t->prstatus, regset0_size), &t->prstatus);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001712 *total += notesize(&t->notes[0]);
1713
Roland McGrathd31472b2008-03-04 14:28:30 -08001714 do_thread_regset_writeback(t->task, &view->regsets[0]);
1715
Roland McGrath4206d3a2008-01-30 13:31:45 +01001716 /*
1717 * Each other regset might generate a note too. For each regset
1718 * that has no core_note_type or is inactive, we leave t->notes[i]
1719 * all zero and we'll know to skip writing it later.
1720 */
1721 for (i = 1; i < view->n; ++i) {
1722 const struct user_regset *regset = &view->regsets[i];
Roland McGrathd31472b2008-03-04 14:28:30 -08001723 do_thread_regset_writeback(t->task, regset);
H. Peter Anvinc8e25252012-03-02 10:43:48 -08001724 if (regset->core_note_type && regset->get &&
Maciej W. Rozycki2f819db2018-05-15 23:32:45 +01001725 (!regset->active || regset->active(t->task, regset) > 0)) {
Roland McGrath4206d3a2008-01-30 13:31:45 +01001726 int ret;
Dave Martin27e64b42017-10-31 15:50:53 +00001727 size_t size = regset_size(t->task, regset);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001728 void *data = kmalloc(size, GFP_KERNEL);
1729 if (unlikely(!data))
1730 return 0;
1731 ret = regset->get(t->task, regset,
1732 0, size, data, NULL);
1733 if (unlikely(ret))
1734 kfree(data);
1735 else {
1736 if (regset->core_note_type != NT_PRFPREG)
1737 fill_note(&t->notes[i], "LINUX",
1738 regset->core_note_type,
1739 size, data);
1740 else {
Dmitry Safonov90954e72016-09-05 16:33:06 +03001741 SET_PR_FPVALID(&t->prstatus,
Dave Martin27e64b42017-10-31 15:50:53 +00001742 1, regset0_size);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001743 fill_note(&t->notes[i], "CORE",
1744 NT_PRFPREG, size, data);
1745 }
1746 *total += notesize(&t->notes[i]);
1747 }
1748 }
1749 }
1750
1751 return 1;
1752}
1753
1754static int fill_note_info(struct elfhdr *elf, int phdrs,
1755 struct elf_note_info *info,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02001756 const kernel_siginfo_t *siginfo, struct pt_regs *regs)
Roland McGrath4206d3a2008-01-30 13:31:45 +01001757{
1758 struct task_struct *dump_task = current;
1759 const struct user_regset_view *view = task_user_regset_view(dump_task);
1760 struct elf_thread_core_info *t;
1761 struct elf_prpsinfo *psinfo;
Oleg Nesterov83914442008-07-25 01:47:45 -07001762 struct core_thread *ct;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001763 unsigned int i;
1764
1765 info->size = 0;
1766 info->thread = NULL;
1767
1768 psinfo = kmalloc(sizeof(*psinfo), GFP_KERNEL);
Alan Cox6899e922012-12-17 16:02:09 -08001769 if (psinfo == NULL) {
1770 info->psinfo.data = NULL; /* So we don't free this wrongly */
Roland McGrath4206d3a2008-01-30 13:31:45 +01001771 return 0;
Alan Cox6899e922012-12-17 16:02:09 -08001772 }
Roland McGrath4206d3a2008-01-30 13:31:45 +01001773
Amerigo Wange2dbe122009-07-01 01:06:26 -04001774 fill_note(&info->psinfo, "CORE", NT_PRPSINFO, sizeof(*psinfo), psinfo);
1775
Roland McGrath4206d3a2008-01-30 13:31:45 +01001776 /*
1777 * Figure out how many notes we're going to need for each thread.
1778 */
1779 info->thread_notes = 0;
1780 for (i = 0; i < view->n; ++i)
1781 if (view->regsets[i].core_note_type != 0)
1782 ++info->thread_notes;
1783
1784 /*
1785 * Sanity check. We rely on regset 0 being in NT_PRSTATUS,
1786 * since it is our one special case.
1787 */
1788 if (unlikely(info->thread_notes == 0) ||
1789 unlikely(view->regsets[0].core_note_type != NT_PRSTATUS)) {
1790 WARN_ON(1);
1791 return 0;
1792 }
1793
1794 /*
1795 * Initialize the ELF file header.
1796 */
1797 fill_elf_header(elf, phdrs,
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001798 view->e_machine, view->e_flags);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001799
1800 /*
1801 * Allocate a structure for each thread.
1802 */
Oleg Nesterov83914442008-07-25 01:47:45 -07001803 for (ct = &dump_task->mm->core_state->dumper; ct; ct = ct->next) {
1804 t = kzalloc(offsetof(struct elf_thread_core_info,
1805 notes[info->thread_notes]),
1806 GFP_KERNEL);
1807 if (unlikely(!t))
1808 return 0;
Oleg Nesterov24d52882008-07-25 01:47:40 -07001809
Oleg Nesterov83914442008-07-25 01:47:45 -07001810 t->task = ct->task;
1811 if (ct->task == dump_task || !info->thread) {
1812 t->next = info->thread;
1813 info->thread = t;
1814 } else {
1815 /*
1816 * Make sure to keep the original task at
1817 * the head of the list.
1818 */
1819 t->next = info->thread->next;
1820 info->thread->next = t;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001821 }
Oleg Nesterov83914442008-07-25 01:47:45 -07001822 }
Roland McGrath4206d3a2008-01-30 13:31:45 +01001823
1824 /*
1825 * Now fill in each thread's information.
1826 */
1827 for (t = info->thread; t != NULL; t = t->next)
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07001828 if (!fill_thread_core_info(t, view, siginfo->si_signo, &info->size))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001829 return 0;
1830
1831 /*
1832 * Fill in the two process-wide notes.
1833 */
1834 fill_psinfo(psinfo, dump_task->group_leader, dump_task->mm);
1835 info->size += notesize(&info->psinfo);
1836
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001837 fill_siginfo_note(&info->signote, &info->csigdata, siginfo);
1838 info->size += notesize(&info->signote);
1839
Roland McGrath4206d3a2008-01-30 13:31:45 +01001840 fill_auxv_note(&info->auxv, current->mm);
1841 info->size += notesize(&info->auxv);
1842
Dan Aloni72023652013-09-30 13:45:02 -07001843 if (fill_files_note(&info->files) == 0)
1844 info->size += notesize(&info->files);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001845
Roland McGrath4206d3a2008-01-30 13:31:45 +01001846 return 1;
1847}
1848
1849static size_t get_note_info_size(struct elf_note_info *info)
1850{
1851 return info->size;
1852}
1853
1854/*
1855 * Write all the notes for each thread. When writing the first thread, the
1856 * process-wide notes are interleaved after the first thread-specific note.
1857 */
1858static int write_note_info(struct elf_note_info *info,
Al Viroecc8c772013-10-05 15:32:35 -04001859 struct coredump_params *cprm)
Roland McGrath4206d3a2008-01-30 13:31:45 +01001860{
Fabian Frederickb219e252014-06-04 16:12:14 -07001861 bool first = true;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001862 struct elf_thread_core_info *t = info->thread;
1863
1864 do {
1865 int i;
1866
Al Viroecc8c772013-10-05 15:32:35 -04001867 if (!writenote(&t->notes[0], cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001868 return 0;
1869
Al Viroecc8c772013-10-05 15:32:35 -04001870 if (first && !writenote(&info->psinfo, cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001871 return 0;
Al Viroecc8c772013-10-05 15:32:35 -04001872 if (first && !writenote(&info->signote, cprm))
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001873 return 0;
Al Viroecc8c772013-10-05 15:32:35 -04001874 if (first && !writenote(&info->auxv, cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001875 return 0;
Dan Aloni72023652013-09-30 13:45:02 -07001876 if (first && info->files.data &&
Al Viroecc8c772013-10-05 15:32:35 -04001877 !writenote(&info->files, cprm))
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001878 return 0;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001879
1880 for (i = 1; i < info->thread_notes; ++i)
1881 if (t->notes[i].data &&
Al Viroecc8c772013-10-05 15:32:35 -04001882 !writenote(&t->notes[i], cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001883 return 0;
1884
Fabian Frederickb219e252014-06-04 16:12:14 -07001885 first = false;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001886 t = t->next;
1887 } while (t);
1888
1889 return 1;
1890}
1891
1892static void free_note_info(struct elf_note_info *info)
1893{
1894 struct elf_thread_core_info *threads = info->thread;
1895 while (threads) {
1896 unsigned int i;
1897 struct elf_thread_core_info *t = threads;
1898 threads = t->next;
1899 WARN_ON(t->notes[0].data && t->notes[0].data != &t->prstatus);
1900 for (i = 1; i < info->thread_notes; ++i)
1901 kfree(t->notes[i].data);
1902 kfree(t);
1903 }
1904 kfree(info->psinfo.data);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001905 kvfree(info->files.data);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001906}
1907
1908#else
1909
Linus Torvalds1da177e2005-04-16 15:20:36 -07001910/* Here is the structure in which status of each thread is captured. */
1911struct elf_thread_status
1912{
1913 struct list_head list;
1914 struct elf_prstatus prstatus; /* NT_PRSTATUS */
1915 elf_fpregset_t fpu; /* NT_PRFPREG */
1916 struct task_struct *thread;
1917#ifdef ELF_CORE_COPY_XFPREGS
Mark Nelson5b20cd82007-10-16 23:25:39 -07001918 elf_fpxregset_t xfpu; /* ELF_CORE_XFPREG_TYPE */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001919#endif
1920 struct memelfnote notes[3];
1921 int num_notes;
1922};
1923
1924/*
1925 * In order to add the specific thread information for the elf file format,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001926 * we need to keep a linked list of every threads pr_status and then create
1927 * a single section for them in the final core file.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001928 */
1929static int elf_dump_thread_status(long signr, struct elf_thread_status *t)
1930{
1931 int sz = 0;
1932 struct task_struct *p = t->thread;
1933 t->num_notes = 0;
1934
1935 fill_prstatus(&t->prstatus, p, signr);
1936 elf_core_copy_task_regs(p, &t->prstatus.pr_reg);
1937
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001938 fill_note(&t->notes[0], "CORE", NT_PRSTATUS, sizeof(t->prstatus),
1939 &(t->prstatus));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001940 t->num_notes++;
1941 sz += notesize(&t->notes[0]);
1942
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001943 if ((t->prstatus.pr_fpvalid = elf_core_copy_task_fpregs(p, NULL,
1944 &t->fpu))) {
1945 fill_note(&t->notes[1], "CORE", NT_PRFPREG, sizeof(t->fpu),
1946 &(t->fpu));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001947 t->num_notes++;
1948 sz += notesize(&t->notes[1]);
1949 }
1950
1951#ifdef ELF_CORE_COPY_XFPREGS
1952 if (elf_core_copy_task_xfpregs(p, &t->xfpu)) {
Mark Nelson5b20cd82007-10-16 23:25:39 -07001953 fill_note(&t->notes[2], "LINUX", ELF_CORE_XFPREG_TYPE,
1954 sizeof(t->xfpu), &t->xfpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001955 t->num_notes++;
1956 sz += notesize(&t->notes[2]);
1957 }
1958#endif
1959 return sz;
1960}
1961
Roland McGrath3aba4812008-01-30 13:31:44 +01001962struct elf_note_info {
1963 struct memelfnote *notes;
Dan Aloni72023652013-09-30 13:45:02 -07001964 struct memelfnote *notes_files;
Roland McGrath3aba4812008-01-30 13:31:44 +01001965 struct elf_prstatus *prstatus; /* NT_PRSTATUS */
1966 struct elf_prpsinfo *psinfo; /* NT_PRPSINFO */
1967 struct list_head thread_list;
1968 elf_fpregset_t *fpu;
1969#ifdef ELF_CORE_COPY_XFPREGS
1970 elf_fpxregset_t *xfpu;
1971#endif
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001972 user_siginfo_t csigdata;
Roland McGrath3aba4812008-01-30 13:31:44 +01001973 int thread_status_size;
1974 int numnote;
1975};
1976
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001977static int elf_note_info_init(struct elf_note_info *info)
Roland McGrath3aba4812008-01-30 13:31:44 +01001978{
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001979 memset(info, 0, sizeof(*info));
Roland McGrath3aba4812008-01-30 13:31:44 +01001980 INIT_LIST_HEAD(&info->thread_list);
1981
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001982 /* Allocate space for ELF notes */
Kees Cook6da2ec52018-06-12 13:55:00 -07001983 info->notes = kmalloc_array(8, sizeof(struct memelfnote), GFP_KERNEL);
Roland McGrath3aba4812008-01-30 13:31:44 +01001984 if (!info->notes)
1985 return 0;
1986 info->psinfo = kmalloc(sizeof(*info->psinfo), GFP_KERNEL);
1987 if (!info->psinfo)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10001988 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01001989 info->prstatus = kmalloc(sizeof(*info->prstatus), GFP_KERNEL);
1990 if (!info->prstatus)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10001991 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01001992 info->fpu = kmalloc(sizeof(*info->fpu), GFP_KERNEL);
1993 if (!info->fpu)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10001994 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01001995#ifdef ELF_CORE_COPY_XFPREGS
1996 info->xfpu = kmalloc(sizeof(*info->xfpu), GFP_KERNEL);
1997 if (!info->xfpu)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10001998 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01001999#endif
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002000 return 1;
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002001}
Roland McGrath3aba4812008-01-30 13:31:44 +01002002
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002003static int fill_note_info(struct elfhdr *elf, int phdrs,
2004 struct elf_note_info *info,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02002005 const kernel_siginfo_t *siginfo, struct pt_regs *regs)
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002006{
Al Viroafabada2013-10-14 07:39:56 -04002007 struct core_thread *ct;
2008 struct elf_thread_status *ets;
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002009
2010 if (!elf_note_info_init(info))
2011 return 0;
2012
Al Viroafabada2013-10-14 07:39:56 -04002013 for (ct = current->mm->core_state->dumper.next;
2014 ct; ct = ct->next) {
2015 ets = kzalloc(sizeof(*ets), GFP_KERNEL);
2016 if (!ets)
2017 return 0;
Oleg Nesterov24d52882008-07-25 01:47:40 -07002018
Al Viroafabada2013-10-14 07:39:56 -04002019 ets->thread = ct->task;
2020 list_add(&ets->list, &info->thread_list);
2021 }
Oleg Nesterov83914442008-07-25 01:47:45 -07002022
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002023 list_for_each_entry(ets, &info->thread_list, list) {
Al Viroafabada2013-10-14 07:39:56 -04002024 int sz;
Oleg Nesterov83914442008-07-25 01:47:45 -07002025
Al Viroafabada2013-10-14 07:39:56 -04002026 sz = elf_dump_thread_status(siginfo->si_signo, ets);
2027 info->thread_status_size += sz;
Roland McGrath3aba4812008-01-30 13:31:44 +01002028 }
2029 /* now collect the dump for the current */
2030 memset(info->prstatus, 0, sizeof(*info->prstatus));
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07002031 fill_prstatus(info->prstatus, current, siginfo->si_signo);
Roland McGrath3aba4812008-01-30 13:31:44 +01002032 elf_core_copy_regs(&info->prstatus->pr_reg, regs);
2033
2034 /* Set up header */
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08002035 fill_elf_header(elf, phdrs, ELF_ARCH, ELF_CORE_EFLAGS);
Roland McGrath3aba4812008-01-30 13:31:44 +01002036
2037 /*
2038 * Set up the notes in similar form to SVR4 core dumps made
2039 * with info from their /proc.
2040 */
2041
2042 fill_note(info->notes + 0, "CORE", NT_PRSTATUS,
2043 sizeof(*info->prstatus), info->prstatus);
2044 fill_psinfo(info->psinfo, current->group_leader, current->mm);
2045 fill_note(info->notes + 1, "CORE", NT_PRPSINFO,
2046 sizeof(*info->psinfo), info->psinfo);
2047
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07002048 fill_siginfo_note(info->notes + 2, &info->csigdata, siginfo);
2049 fill_auxv_note(info->notes + 3, current->mm);
Dan Aloni72023652013-09-30 13:45:02 -07002050 info->numnote = 4;
Roland McGrath3aba4812008-01-30 13:31:44 +01002051
Dan Aloni72023652013-09-30 13:45:02 -07002052 if (fill_files_note(info->notes + info->numnote) == 0) {
2053 info->notes_files = info->notes + info->numnote;
2054 info->numnote++;
2055 }
Roland McGrath3aba4812008-01-30 13:31:44 +01002056
2057 /* Try to dump the FPU. */
2058 info->prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, regs,
2059 info->fpu);
2060 if (info->prstatus->pr_fpvalid)
2061 fill_note(info->notes + info->numnote++,
2062 "CORE", NT_PRFPREG, sizeof(*info->fpu), info->fpu);
2063#ifdef ELF_CORE_COPY_XFPREGS
2064 if (elf_core_copy_task_xfpregs(current, info->xfpu))
2065 fill_note(info->notes + info->numnote++,
2066 "LINUX", ELF_CORE_XFPREG_TYPE,
2067 sizeof(*info->xfpu), info->xfpu);
2068#endif
2069
2070 return 1;
Roland McGrath3aba4812008-01-30 13:31:44 +01002071}
2072
2073static size_t get_note_info_size(struct elf_note_info *info)
2074{
2075 int sz = 0;
2076 int i;
2077
2078 for (i = 0; i < info->numnote; i++)
2079 sz += notesize(info->notes + i);
2080
2081 sz += info->thread_status_size;
2082
2083 return sz;
2084}
2085
2086static int write_note_info(struct elf_note_info *info,
Al Viroecc8c772013-10-05 15:32:35 -04002087 struct coredump_params *cprm)
Roland McGrath3aba4812008-01-30 13:31:44 +01002088{
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002089 struct elf_thread_status *ets;
Roland McGrath3aba4812008-01-30 13:31:44 +01002090 int i;
Roland McGrath3aba4812008-01-30 13:31:44 +01002091
2092 for (i = 0; i < info->numnote; i++)
Al Viroecc8c772013-10-05 15:32:35 -04002093 if (!writenote(info->notes + i, cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002094 return 0;
2095
2096 /* write out the thread status notes section */
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002097 list_for_each_entry(ets, &info->thread_list, list) {
2098 for (i = 0; i < ets->num_notes; i++)
2099 if (!writenote(&ets->notes[i], cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002100 return 0;
2101 }
2102
2103 return 1;
2104}
2105
2106static void free_note_info(struct elf_note_info *info)
2107{
2108 while (!list_empty(&info->thread_list)) {
2109 struct list_head *tmp = info->thread_list.next;
2110 list_del(tmp);
2111 kfree(list_entry(tmp, struct elf_thread_status, list));
2112 }
2113
Dan Aloni72023652013-09-30 13:45:02 -07002114 /* Free data possibly allocated by fill_files_note(): */
2115 if (info->notes_files)
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002116 kvfree(info->notes_files->data);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07002117
Roland McGrath3aba4812008-01-30 13:31:44 +01002118 kfree(info->prstatus);
2119 kfree(info->psinfo);
2120 kfree(info->notes);
2121 kfree(info->fpu);
2122#ifdef ELF_CORE_COPY_XFPREGS
2123 kfree(info->xfpu);
2124#endif
2125}
2126
Roland McGrath4206d3a2008-01-30 13:31:45 +01002127#endif
2128
Roland McGrathf47aef52007-01-26 00:56:49 -08002129static struct vm_area_struct *first_vma(struct task_struct *tsk,
2130 struct vm_area_struct *gate_vma)
2131{
2132 struct vm_area_struct *ret = tsk->mm->mmap;
2133
2134 if (ret)
2135 return ret;
2136 return gate_vma;
2137}
2138/*
2139 * Helper function for iterating across a vma list. It ensures that the caller
2140 * will visit `gate_vma' prior to terminating the search.
2141 */
2142static struct vm_area_struct *next_vma(struct vm_area_struct *this_vma,
2143 struct vm_area_struct *gate_vma)
2144{
2145 struct vm_area_struct *ret;
2146
2147 ret = this_vma->vm_next;
2148 if (ret)
2149 return ret;
2150 if (this_vma == gate_vma)
2151 return NULL;
2152 return gate_vma;
2153}
2154
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002155static void fill_extnum_info(struct elfhdr *elf, struct elf_shdr *shdr4extnum,
2156 elf_addr_t e_shoff, int segs)
2157{
2158 elf->e_shoff = e_shoff;
2159 elf->e_shentsize = sizeof(*shdr4extnum);
2160 elf->e_shnum = 1;
2161 elf->e_shstrndx = SHN_UNDEF;
2162
2163 memset(shdr4extnum, 0, sizeof(*shdr4extnum));
2164
2165 shdr4extnum->sh_type = SHT_NULL;
2166 shdr4extnum->sh_size = elf->e_shnum;
2167 shdr4extnum->sh_link = elf->e_shstrndx;
2168 shdr4extnum->sh_info = segs;
2169}
2170
Linus Torvalds1da177e2005-04-16 15:20:36 -07002171/*
2172 * Actual dumper
2173 *
2174 * This is a two-pass process; first we find the offsets of the bits,
2175 * and then they are actually written out. If we run out of core limit
2176 * we just truncate.
2177 */
Masami Hiramatsuf6151df2009-12-17 15:27:16 -08002178static int elf_core_dump(struct coredump_params *cprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002179{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002180 int has_dumped = 0;
2181 mm_segment_t fs;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002182 int segs, i;
2183 size_t vma_data_size = 0;
Roland McGrathf47aef52007-01-26 00:56:49 -08002184 struct vm_area_struct *vma, *gate_vma;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002185 struct elfhdr *elf = NULL;
Al Virocdc3d562013-10-05 22:24:29 -04002186 loff_t offset = 0, dataoff;
Dan Aloni72023652013-09-30 13:45:02 -07002187 struct elf_note_info info = { };
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002188 struct elf_phdr *phdr4note = NULL;
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002189 struct elf_shdr *shdr4extnum = NULL;
2190 Elf_Half e_phnum;
2191 elf_addr_t e_shoff;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002192 elf_addr_t *vma_filesz = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002193
2194 /*
2195 * We no longer stop all VM operations.
2196 *
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002197 * This is because those proceses that could possibly change map_count
2198 * or the mmap / vma pages are now blocked in do_exit on current
2199 * finishing this core dump.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002200 *
2201 * Only ptrace can touch these memory addresses, but it doesn't change
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002202 * the map_count or the pages allocated. So no possibility of crashing
Linus Torvalds1da177e2005-04-16 15:20:36 -07002203 * exists while dumping the mm->vm_next areas to the core file.
2204 */
2205
2206 /* alloc memory for large data structures: too large to be on stack */
2207 elf = kmalloc(sizeof(*elf), GFP_KERNEL);
2208 if (!elf)
WANG Cong5f719552008-05-06 12:45:35 +08002209 goto out;
KAMEZAWA Hiroyuki341c87b2009-06-30 11:41:23 -07002210 /*
2211 * The number of segs are recored into ELF header as 16bit value.
2212 * Please check DEFAULT_MAX_MAP_COUNT definition when you modify here.
2213 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002214 segs = current->mm->map_count;
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002215 segs += elf_core_extra_phdrs();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002216
Stephen Wilson31db58b2011-03-13 15:49:15 -04002217 gate_vma = get_gate_vma(current->mm);
Roland McGrathf47aef52007-01-26 00:56:49 -08002218 if (gate_vma != NULL)
2219 segs++;
2220
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002221 /* for notes section */
2222 segs++;
2223
2224 /* If segs > PN_XNUM(0xffff), then e_phnum overflows. To avoid
2225 * this, kernel supports extended numbering. Have a look at
2226 * include/linux/elf.h for further information. */
2227 e_phnum = segs > PN_XNUM ? PN_XNUM : segs;
2228
Roland McGrath3aba4812008-01-30 13:31:44 +01002229 /*
2230 * Collect all the non-memory information about the process for the
2231 * notes. This also sets up the file header.
2232 */
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07002233 if (!fill_note_info(elf, e_phnum, &info, cprm->siginfo, cprm->regs))
Roland McGrath3aba4812008-01-30 13:31:44 +01002234 goto cleanup;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002235
2236 has_dumped = 1;
Oleg Nesterov079148b2013-04-30 15:28:16 -07002237
Linus Torvalds1da177e2005-04-16 15:20:36 -07002238 fs = get_fs();
2239 set_fs(KERNEL_DS);
2240
Linus Torvalds1da177e2005-04-16 15:20:36 -07002241 offset += sizeof(*elf); /* Elf header */
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002242 offset += segs * sizeof(struct elf_phdr); /* Program headers */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002243
2244 /* Write notes phdr entry */
2245 {
Roland McGrath3aba4812008-01-30 13:31:44 +01002246 size_t sz = get_note_info_size(&info);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002247
Michael Ellermane5501492007-09-19 14:38:12 +10002248 sz += elf_coredump_extra_notes_size();
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +01002249
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002250 phdr4note = kmalloc(sizeof(*phdr4note), GFP_KERNEL);
2251 if (!phdr4note)
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -08002252 goto end_coredump;
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002253
2254 fill_elf_note_phdr(phdr4note, sz, offset);
2255 offset += sz;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002256 }
2257
Linus Torvalds1da177e2005-04-16 15:20:36 -07002258 dataoff = offset = roundup(offset, ELF_EXEC_PAGESIZE);
2259
Jason Baron30f74aa2016-12-12 16:46:40 -08002260 if (segs - 1 > ULONG_MAX / sizeof(*vma_filesz))
2261 goto end_coredump;
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002262 vma_filesz = kvmalloc(array_size(sizeof(*vma_filesz), (segs - 1)),
2263 GFP_KERNEL);
2264 if (ZERO_OR_NULL_PTR(vma_filesz))
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002265 goto end_coredump;
2266
2267 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
2268 vma = next_vma(vma, gate_vma)) {
2269 unsigned long dump_size;
2270
2271 dump_size = vma_dump_size(vma, cprm->mm_flags);
2272 vma_filesz[i++] = dump_size;
2273 vma_data_size += dump_size;
2274 }
2275
2276 offset += vma_data_size;
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002277 offset += elf_core_extra_data_size();
2278 e_shoff = offset;
2279
2280 if (e_phnum == PN_XNUM) {
2281 shdr4extnum = kmalloc(sizeof(*shdr4extnum), GFP_KERNEL);
2282 if (!shdr4extnum)
2283 goto end_coredump;
2284 fill_extnum_info(elf, shdr4extnum, e_shoff, segs);
2285 }
2286
2287 offset = dataoff;
2288
Al Viroecc8c772013-10-05 15:32:35 -04002289 if (!dump_emit(cprm, elf, sizeof(*elf)))
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002290 goto end_coredump;
2291
Al Viroecc8c772013-10-05 15:32:35 -04002292 if (!dump_emit(cprm, phdr4note, sizeof(*phdr4note)))
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002293 goto end_coredump;
2294
Linus Torvalds1da177e2005-04-16 15:20:36 -07002295 /* Write program headers for segments dump */
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002296 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
Roland McGrathf47aef52007-01-26 00:56:49 -08002297 vma = next_vma(vma, gate_vma)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002298 struct elf_phdr phdr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002299
2300 phdr.p_type = PT_LOAD;
2301 phdr.p_offset = offset;
2302 phdr.p_vaddr = vma->vm_start;
2303 phdr.p_paddr = 0;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002304 phdr.p_filesz = vma_filesz[i++];
Roland McGrath82df3972007-10-16 23:27:02 -07002305 phdr.p_memsz = vma->vm_end - vma->vm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002306 offset += phdr.p_filesz;
2307 phdr.p_flags = vma->vm_flags & VM_READ ? PF_R : 0;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002308 if (vma->vm_flags & VM_WRITE)
2309 phdr.p_flags |= PF_W;
2310 if (vma->vm_flags & VM_EXEC)
2311 phdr.p_flags |= PF_X;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002312 phdr.p_align = ELF_EXEC_PAGESIZE;
2313
Al Viroecc8c772013-10-05 15:32:35 -04002314 if (!dump_emit(cprm, &phdr, sizeof(phdr)))
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -08002315 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002316 }
2317
Al Viro506f21c2013-10-05 17:22:57 -04002318 if (!elf_core_write_extra_phdrs(cprm, offset))
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002319 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002320
2321 /* write out the notes section */
Al Viroecc8c772013-10-05 15:32:35 -04002322 if (!write_note_info(&info, cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002323 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002324
Al Virocdc3d562013-10-05 22:24:29 -04002325 if (elf_coredump_extra_notes_write(cprm))
Michael Ellermane5501492007-09-19 14:38:12 +10002326 goto end_coredump;
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +01002327
Andi Kleend025c9d2006-09-30 23:29:28 -07002328 /* Align to page */
Mateusz Guzik1607f092016-06-05 23:14:14 +02002329 if (!dump_skip(cprm, dataoff - cprm->pos))
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002330 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002331
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002332 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
Roland McGrathf47aef52007-01-26 00:56:49 -08002333 vma = next_vma(vma, gate_vma)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002334 unsigned long addr;
Roland McGrath82df3972007-10-16 23:27:02 -07002335 unsigned long end;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002336
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002337 end = vma->vm_start + vma_filesz[i++];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002338
Roland McGrath82df3972007-10-16 23:27:02 -07002339 for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002340 struct page *page;
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002341 int stop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002342
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002343 page = get_dump_page(addr);
2344 if (page) {
2345 void *kaddr = kmap(page);
Al Viro13046ec2013-10-05 18:08:47 -04002346 stop = !dump_emit(cprm, kaddr, PAGE_SIZE);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002347 kunmap(page);
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03002348 put_page(page);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002349 } else
Al Viro9b56d542013-10-08 09:26:08 -04002350 stop = !dump_skip(cprm, PAGE_SIZE);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002351 if (stop)
2352 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002353 }
2354 }
Dave Kleikamp4d22c752017-01-11 13:25:00 -06002355 dump_truncate(cprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002356
Al Viroaa3e7ea2013-10-05 17:50:15 -04002357 if (!elf_core_write_extra_data(cprm))
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002358 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002359
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002360 if (e_phnum == PN_XNUM) {
Al Viro13046ec2013-10-05 18:08:47 -04002361 if (!dump_emit(cprm, shdr4extnum, sizeof(*shdr4extnum)))
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002362 goto end_coredump;
2363 }
2364
Linus Torvalds1da177e2005-04-16 15:20:36 -07002365end_coredump:
2366 set_fs(fs);
2367
2368cleanup:
Roland McGrath3aba4812008-01-30 13:31:44 +01002369 free_note_info(&info);
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002370 kfree(shdr4extnum);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002371 kvfree(vma_filesz);
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002372 kfree(phdr4note);
WANG Cong5f719552008-05-06 12:45:35 +08002373 kfree(elf);
2374out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002375 return has_dumped;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002376}
2377
Christoph Hellwig698ba7b2009-12-15 16:47:37 -08002378#endif /* CONFIG_ELF_CORE */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002379
2380static int __init init_elf_binfmt(void)
2381{
Al Viro8fc3dc52012-03-17 03:05:16 -04002382 register_binfmt(&elf_format);
2383 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002384}
2385
2386static void __exit exit_elf_binfmt(void)
2387{
2388 /* Remove the COFF and ELF loaders. */
2389 unregister_binfmt(&elf_format);
2390}
2391
2392core_initcall(init_elf_binfmt);
2393module_exit(exit_elf_binfmt);
2394MODULE_LICENSE("GPL");