blob: 1eb63867e2662bec486d8e6620150110d329a6a3 [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>
Anshuman Khandual03911132020-04-06 20:03:51 -070030#include <linux/hugetlb.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070031#include <linux/pagemap.h>
Denys Vlasenko2aa362c2012-10-04 17:15:36 -070032#include <linux/vmalloc.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070033#include <linux/security.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070034#include <linux/random.h>
Jesper Juhlf4e5cc22006-06-23 02:05:35 -070035#include <linux/elf.h>
Kees Cookd1fd8362015-04-14 15:48:07 -070036#include <linux/elf-randomize.h>
Alexey Dobriyan7e80d0d2007-05-08 00:28:59 -070037#include <linux/utsname.h>
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -080038#include <linux/coredump.h>
Frederic Weisbecker6fac4822012-11-13 14:20:55 +010039#include <linux/sched.h>
Ingo Molnarf7ccbae2017-02-08 18:51:30 +010040#include <linux/sched/coredump.h>
Ingo Molnar68db0cf2017-02-08 18:51:37 +010041#include <linux/sched/task_stack.h>
Ingo Molnar32ef5512017-02-05 11:48:36 +010042#include <linux/sched/cputime.h>
Ingo Molnar5b825c32017-02-02 17:54:15 +010043#include <linux/cred.h>
Ross Zwisler50378352015-10-05 16:33:36 -060044#include <linux/dax.h>
Linus Torvalds7c0f6ba2016-12-24 11:46:01 -080045#include <linux/uaccess.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070046#include <asm/param.h>
47#include <asm/page.h>
48
Denys Vlasenko2aa362c2012-10-04 17:15:36 -070049#ifndef user_long_t
50#define user_long_t long
51#endif
Denys Vlasenko49ae4d42012-10-04 17:15:35 -070052#ifndef user_siginfo_t
53#define user_siginfo_t siginfo_t
54#endif
55
Nicolas Pitre47552002017-08-16 16:05:13 -040056/* That's for binfmt_elf_fdpic to deal with */
57#ifndef elf_check_fdpic
58#define elf_check_fdpic(ex) false
59#endif
60
Al Viro71613c32012-10-20 22:00:48 -040061static int load_elf_binary(struct linux_binprm *bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -070062
Josh Triplett69369a72014-04-03 14:48:27 -070063#ifdef CONFIG_USELIB
64static int load_elf_library(struct file *);
65#else
66#define load_elf_library NULL
67#endif
68
Linus Torvalds1da177e2005-04-16 15:20:36 -070069/*
70 * If we don't support core dumping, then supply a NULL so we
71 * don't even try.
72 */
Christoph Hellwig698ba7b2009-12-15 16:47:37 -080073#ifdef CONFIG_ELF_CORE
Masami Hiramatsuf6151df2009-12-17 15:27:16 -080074static int elf_core_dump(struct coredump_params *cprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -070075#else
76#define elf_core_dump NULL
77#endif
78
79#if ELF_EXEC_PAGESIZE > PAGE_SIZE
Jesper Juhlf4e5cc22006-06-23 02:05:35 -070080#define ELF_MIN_ALIGN ELF_EXEC_PAGESIZE
Linus Torvalds1da177e2005-04-16 15:20:36 -070081#else
Jesper Juhlf4e5cc22006-06-23 02:05:35 -070082#define ELF_MIN_ALIGN PAGE_SIZE
Linus Torvalds1da177e2005-04-16 15:20:36 -070083#endif
84
85#ifndef ELF_CORE_EFLAGS
86#define ELF_CORE_EFLAGS 0
87#endif
88
89#define ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(ELF_MIN_ALIGN-1))
90#define ELF_PAGEOFFSET(_v) ((_v) & (ELF_MIN_ALIGN-1))
91#define ELF_PAGEALIGN(_v) (((_v) + ELF_MIN_ALIGN - 1) & ~(ELF_MIN_ALIGN - 1))
92
93static struct linux_binfmt elf_format = {
Mikael Petterssonf670d0e2011-01-12 17:00:02 -080094 .module = THIS_MODULE,
95 .load_binary = load_elf_binary,
96 .load_shlib = load_elf_library,
97 .core_dump = elf_core_dump,
98 .min_coredump = ELF_EXEC_PAGESIZE,
Linus Torvalds1da177e2005-04-16 15:20:36 -070099};
100
Alexey Dobriyan18676ff2020-01-30 22:17:01 -0800101#define BAD_ADDR(x) (unlikely((unsigned long)(x) >= TASK_SIZE))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800103static int set_brk(unsigned long start, unsigned long end, int prot)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700104{
105 start = ELF_PAGEALIGN(start);
106 end = ELF_PAGEALIGN(end);
107 if (end > start) {
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800108 /*
109 * Map the last of the bss segment.
110 * If the header is requesting these pages to be
111 * executable, honour that (ppc32 needs this).
112 */
113 int error = vm_brk_flags(start, end - start,
114 prot & PROT_EXEC ? VM_EXEC : 0);
Linus Torvalds5d22fc22016-05-27 15:57:31 -0700115 if (error)
116 return error;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700117 }
118 current->mm->start_brk = current->mm->brk = end;
119 return 0;
120}
121
Linus Torvalds1da177e2005-04-16 15:20:36 -0700122/* We need to explicitly zero any fractional pages
123 after the data section (i.e. bss). This would
124 contain the junk from the file that should not
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700125 be in memory
126 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700127static int padzero(unsigned long elf_bss)
128{
129 unsigned long nbyte;
130
131 nbyte = ELF_PAGEOFFSET(elf_bss);
132 if (nbyte) {
133 nbyte = ELF_MIN_ALIGN - nbyte;
134 if (clear_user((void __user *) elf_bss, nbyte))
135 return -EFAULT;
136 }
137 return 0;
138}
139
Ohad Ben-Cohen09c6dd32008-02-03 18:05:15 +0200140/* Let's use some macros to make this stack manipulation a little clearer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700141#ifdef CONFIG_STACK_GROWSUP
142#define STACK_ADD(sp, items) ((elf_addr_t __user *)(sp) + (items))
143#define STACK_ROUND(sp, items) \
144 ((15 + (unsigned long) ((sp) + (items))) &~ 15UL)
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700145#define STACK_ALLOC(sp, len) ({ \
146 elf_addr_t __user *old_sp = (elf_addr_t __user *)sp; sp += len; \
147 old_sp; })
Linus Torvalds1da177e2005-04-16 15:20:36 -0700148#else
149#define STACK_ADD(sp, items) ((elf_addr_t __user *)(sp) - (items))
150#define STACK_ROUND(sp, items) \
151 (((unsigned long) (sp - items)) &~ 15UL)
152#define STACK_ALLOC(sp, len) ({ sp -= len ; sp; })
153#endif
154
Nathan Lynch483fad12008-07-22 04:48:46 +1000155#ifndef ELF_BASE_PLATFORM
156/*
157 * AT_BASE_PLATFORM indicates the "real" hardware/microarchitecture.
158 * If the arch defines ELF_BASE_PLATFORM (in asm/elf.h), the value
159 * will be copied to the user stack in the same manner as AT_PLATFORM.
160 */
161#define ELF_BASE_PLATFORM NULL
162#endif
163
Linus Torvalds1da177e2005-04-16 15:20:36 -0700164static int
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800165create_elf_tables(struct linux_binprm *bprm, const struct elfhdr *exec,
166 unsigned long load_addr, unsigned long interp_load_addr,
167 unsigned long e_entry)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700168{
Alexey Dobriyan03c6d722020-01-30 22:16:58 -0800169 struct mm_struct *mm = current->mm;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700170 unsigned long p = bprm->p;
171 int argc = bprm->argc;
172 int envc = bprm->envc;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700173 elf_addr_t __user *sp;
174 elf_addr_t __user *u_platform;
Nathan Lynch483fad12008-07-22 04:48:46 +1000175 elf_addr_t __user *u_base_platform;
Kees Cookf06295b2009-01-07 18:08:52 -0800176 elf_addr_t __user *u_rand_bytes;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700177 const char *k_platform = ELF_PLATFORM;
Nathan Lynch483fad12008-07-22 04:48:46 +1000178 const char *k_base_platform = ELF_BASE_PLATFORM;
Kees Cookf06295b2009-01-07 18:08:52 -0800179 unsigned char k_rand_bytes[16];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700180 int items;
181 elf_addr_t *elf_info;
Alexey Dobriyan1f83d802020-01-30 22:16:50 -0800182 int ei_index;
David Howells86a264a2008-11-14 10:39:18 +1100183 const struct cred *cred = current_cred();
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700184 struct vm_area_struct *vma;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700185
186 /*
Franck Bui-Huud68c9d62007-10-16 23:30:24 -0700187 * In some cases (e.g. Hyper-Threading), we want to avoid L1
188 * evictions by the processes running on the same package. One
189 * thing we can do is to shuffle the initial stack for them.
190 */
191
192 p = arch_align_stack(p);
193
194 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700195 * If this architecture has a platform capability string, copy it
196 * to userspace. In some cases (Sparc), this info is impossible
197 * for userspace to get any other way, in others (i386) it is
198 * merely difficult.
199 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700200 u_platform = NULL;
201 if (k_platform) {
202 size_t len = strlen(k_platform) + 1;
203
Linus Torvalds1da177e2005-04-16 15:20:36 -0700204 u_platform = (elf_addr_t __user *)STACK_ALLOC(p, len);
205 if (__copy_to_user(u_platform, k_platform, len))
206 return -EFAULT;
207 }
208
Nathan Lynch483fad12008-07-22 04:48:46 +1000209 /*
210 * If this architecture has a "base" platform capability
211 * string, copy it to userspace.
212 */
213 u_base_platform = NULL;
214 if (k_base_platform) {
215 size_t len = strlen(k_base_platform) + 1;
216
217 u_base_platform = (elf_addr_t __user *)STACK_ALLOC(p, len);
218 if (__copy_to_user(u_base_platform, k_base_platform, len))
219 return -EFAULT;
220 }
221
Kees Cookf06295b2009-01-07 18:08:52 -0800222 /*
223 * Generate 16 random bytes for userspace PRNG seeding.
224 */
225 get_random_bytes(k_rand_bytes, sizeof(k_rand_bytes));
226 u_rand_bytes = (elf_addr_t __user *)
227 STACK_ALLOC(p, sizeof(k_rand_bytes));
228 if (__copy_to_user(u_rand_bytes, k_rand_bytes, sizeof(k_rand_bytes)))
229 return -EFAULT;
230
Linus Torvalds1da177e2005-04-16 15:20:36 -0700231 /* Create the ELF interpreter info */
Alexey Dobriyan03c6d722020-01-30 22:16:58 -0800232 elf_info = (elf_addr_t *)mm->saved_auxv;
Olaf Hering4f9a58d2007-10-16 23:30:12 -0700233 /* update AT_VECTOR_SIZE_BASE if the number of NEW_AUX_ENT() changes */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700234#define NEW_AUX_ENT(id, val) \
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700235 do { \
Alexey Dobriyan1f83d802020-01-30 22:16:50 -0800236 *elf_info++ = id; \
237 *elf_info++ = val; \
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700238 } while (0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700239
240#ifdef ARCH_DLINFO
241 /*
242 * ARCH_DLINFO must come first so PPC can do its special alignment of
243 * AUXV.
Olaf Hering4f9a58d2007-10-16 23:30:12 -0700244 * update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT() in
245 * ARCH_DLINFO changes
Linus Torvalds1da177e2005-04-16 15:20:36 -0700246 */
247 ARCH_DLINFO;
248#endif
249 NEW_AUX_ENT(AT_HWCAP, ELF_HWCAP);
250 NEW_AUX_ENT(AT_PAGESZ, ELF_EXEC_PAGESIZE);
251 NEW_AUX_ENT(AT_CLKTCK, CLOCKS_PER_SEC);
252 NEW_AUX_ENT(AT_PHDR, load_addr + exec->e_phoff);
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700253 NEW_AUX_ENT(AT_PHENT, sizeof(struct elf_phdr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700254 NEW_AUX_ENT(AT_PHNUM, exec->e_phnum);
255 NEW_AUX_ENT(AT_BASE, interp_load_addr);
256 NEW_AUX_ENT(AT_FLAGS, 0);
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800257 NEW_AUX_ENT(AT_ENTRY, e_entry);
Eric W. Biedermanebc887b2012-02-07 18:36:10 -0800258 NEW_AUX_ENT(AT_UID, from_kuid_munged(cred->user_ns, cred->uid));
259 NEW_AUX_ENT(AT_EUID, from_kuid_munged(cred->user_ns, cred->euid));
260 NEW_AUX_ENT(AT_GID, from_kgid_munged(cred->user_ns, cred->gid));
261 NEW_AUX_ENT(AT_EGID, from_kgid_munged(cred->user_ns, cred->egid));
Kees Cookc425e182017-07-18 15:25:22 -0700262 NEW_AUX_ENT(AT_SECURE, bprm->secureexec);
Kees Cookf06295b2009-01-07 18:08:52 -0800263 NEW_AUX_ENT(AT_RANDOM, (elf_addr_t)(unsigned long)u_rand_bytes);
Michael Neuling21713642013-04-17 17:33:11 +0000264#ifdef ELF_HWCAP2
265 NEW_AUX_ENT(AT_HWCAP2, ELF_HWCAP2);
266#endif
John Reiser65191082008-07-21 14:21:32 -0700267 NEW_AUX_ENT(AT_EXECFN, bprm->exec);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700268 if (k_platform) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700269 NEW_AUX_ENT(AT_PLATFORM,
Jesper Juhl785d5572006-06-23 02:05:35 -0700270 (elf_addr_t)(unsigned long)u_platform);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700271 }
Nathan Lynch483fad12008-07-22 04:48:46 +1000272 if (k_base_platform) {
273 NEW_AUX_ENT(AT_BASE_PLATFORM,
274 (elf_addr_t)(unsigned long)u_base_platform);
275 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700276 if (bprm->interp_flags & BINPRM_FLAGS_EXECFD) {
Jesper Juhl785d5572006-06-23 02:05:35 -0700277 NEW_AUX_ENT(AT_EXECFD, bprm->interp_data);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700278 }
279#undef NEW_AUX_ENT
280 /* AT_NULL is zero; clear the rest too */
Alexey Dobriyan03c6d722020-01-30 22:16:58 -0800281 memset(elf_info, 0, (char *)mm->saved_auxv +
282 sizeof(mm->saved_auxv) - (char *)elf_info);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700283
284 /* And advance past the AT_NULL entry. */
Alexey Dobriyan1f83d802020-01-30 22:16:50 -0800285 elf_info += 2;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700286
Alexey Dobriyan03c6d722020-01-30 22:16:58 -0800287 ei_index = elf_info - (elf_addr_t *)mm->saved_auxv;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700288 sp = STACK_ADD(p, ei_index);
289
Andi Kleend20894a2008-02-08 04:21:54 -0800290 items = (argc + 1) + (envc + 1) + 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700291 bprm->p = STACK_ROUND(sp, items);
292
293 /* Point sp at the lowest address on the stack */
294#ifdef CONFIG_STACK_GROWSUP
295 sp = (elf_addr_t __user *)bprm->p - items - ei_index;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700296 bprm->exec = (unsigned long)sp; /* XXX: PARISC HACK */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700297#else
298 sp = (elf_addr_t __user *)bprm->p;
299#endif
300
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700301
302 /*
303 * Grow the stack manually; some architectures have a limit on how
304 * far ahead a user-space access may be in order to grow the stack.
305 */
Alexey Dobriyan03c6d722020-01-30 22:16:58 -0800306 vma = find_extend_vma(mm, bprm->p);
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700307 if (!vma)
308 return -EFAULT;
309
Linus Torvalds1da177e2005-04-16 15:20:36 -0700310 /* Now, let's put argc (and argv, envp if appropriate) on the stack */
311 if (__put_user(argc, sp++))
312 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700313
Kees Cook67c67772017-07-10 15:52:54 -0700314 /* Populate list of argv pointers back to argv strings. */
Alexey Dobriyan03c6d722020-01-30 22:16:58 -0800315 p = mm->arg_end = mm->arg_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700316 while (argc-- > 0) {
317 size_t len;
Kees Cook67c67772017-07-10 15:52:54 -0700318 if (__put_user((elf_addr_t)p, sp++))
Heiko Carstens841d5fb2006-12-06 20:36:35 -0800319 return -EFAULT;
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700320 len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);
321 if (!len || len > MAX_ARG_STRLEN)
WANG Cong23c49712008-05-08 21:52:33 +0800322 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700323 p += len;
324 }
Kees Cook67c67772017-07-10 15:52:54 -0700325 if (__put_user(0, sp++))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700326 return -EFAULT;
Alexey Dobriyan03c6d722020-01-30 22:16:58 -0800327 mm->arg_end = p;
Kees Cook67c67772017-07-10 15:52:54 -0700328
329 /* Populate list of envp pointers back to envp strings. */
Alexey Dobriyan03c6d722020-01-30 22:16:58 -0800330 mm->env_end = mm->env_start = p;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700331 while (envc-- > 0) {
332 size_t len;
Kees Cook67c67772017-07-10 15:52:54 -0700333 if (__put_user((elf_addr_t)p, sp++))
Heiko Carstens841d5fb2006-12-06 20:36:35 -0800334 return -EFAULT;
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700335 len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);
336 if (!len || len > MAX_ARG_STRLEN)
WANG Cong23c49712008-05-08 21:52:33 +0800337 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700338 p += len;
339 }
Kees Cook67c67772017-07-10 15:52:54 -0700340 if (__put_user(0, sp++))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700341 return -EFAULT;
Alexey Dobriyan03c6d722020-01-30 22:16:58 -0800342 mm->env_end = p;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700343
344 /* Put the elf_info on the stack in the right place. */
Alexey Dobriyan03c6d722020-01-30 22:16:58 -0800345 if (copy_to_user(sp, mm->saved_auxv, ei_index * sizeof(elf_addr_t)))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700346 return -EFAULT;
347 return 0;
348}
349
James Hoganc07380b2011-05-09 10:58:40 +0100350#ifndef elf_map
351
Linus Torvalds1da177e2005-04-16 15:20:36 -0700352static unsigned long elf_map(struct file *filep, unsigned long addr,
Alexey Dobriyan49ac9812019-03-07 16:29:03 -0800353 const struct elf_phdr *eppnt, int prot, int type,
Jiri Kosinacc503c12008-01-30 13:31:07 +0100354 unsigned long total_size)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700355{
356 unsigned long map_addr;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100357 unsigned long size = eppnt->p_filesz + ELF_PAGEOFFSET(eppnt->p_vaddr);
358 unsigned long off = eppnt->p_offset - ELF_PAGEOFFSET(eppnt->p_vaddr);
359 addr = ELF_PAGESTART(addr);
360 size = ELF_PAGEALIGN(size);
Jan Kratochvil60bfba72007-07-15 23:40:06 -0700361
Andrew Mortond4e3cc32007-07-21 04:37:32 -0700362 /* mmap() will return -EINVAL if given a zero size, but a
363 * segment with zero filesize is perfectly valid */
Jiri Kosinacc503c12008-01-30 13:31:07 +0100364 if (!size)
365 return addr;
366
Jiri Kosinacc503c12008-01-30 13:31:07 +0100367 /*
368 * total_size is the size of the ELF (interpreter) image.
369 * The _first_ mmap needs to know the full size, otherwise
370 * randomization might put this image into an overlapping
371 * position with the ELF binary image. (since size < total_size)
372 * So we first map the 'big' image - and unmap the remainder at
373 * the end. (which unmap is needed for ELF images with holes.)
374 */
375 if (total_size) {
376 total_size = ELF_PAGEALIGN(total_size);
Al Viro5a5e4c22012-05-30 01:49:38 -0400377 map_addr = vm_mmap(filep, addr, total_size, prot, type, off);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100378 if (!BAD_ADDR(map_addr))
Al Viro5a5e4c22012-05-30 01:49:38 -0400379 vm_munmap(map_addr+size, total_size-size);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100380 } else
Al Viro5a5e4c22012-05-30 01:49:38 -0400381 map_addr = vm_mmap(filep, addr, size, prot, type, off);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100382
Tetsuo Handad23a61e2018-04-20 14:56:13 -0700383 if ((type & MAP_FIXED_NOREPLACE) &&
384 PTR_ERR((void *)map_addr) == -EEXIST)
385 pr_info("%d (%s): Uhuuh, elf segment at %px requested but the memory is mapped already\n",
386 task_pid_nr(current), current->comm, (void *)addr);
Michal Hocko4ed28632018-04-10 16:36:01 -0700387
Linus Torvalds1da177e2005-04-16 15:20:36 -0700388 return(map_addr);
389}
390
James Hoganc07380b2011-05-09 10:58:40 +0100391#endif /* !elf_map */
392
Alexey Dobriyan49ac9812019-03-07 16:29:03 -0800393static unsigned long total_mapping_size(const struct elf_phdr *cmds, int nr)
Jiri Kosinacc503c12008-01-30 13:31:07 +0100394{
395 int i, first_idx = -1, last_idx = -1;
396
397 for (i = 0; i < nr; i++) {
398 if (cmds[i].p_type == PT_LOAD) {
399 last_idx = i;
400 if (first_idx == -1)
401 first_idx = i;
402 }
403 }
404 if (first_idx == -1)
405 return 0;
406
407 return cmds[last_idx].p_vaddr + cmds[last_idx].p_memsz -
408 ELF_PAGESTART(cmds[first_idx].p_vaddr);
409}
410
Alexey Dobriyan658c0332019-12-04 16:52:25 -0800411static int elf_read(struct file *file, void *buf, size_t len, loff_t pos)
412{
413 ssize_t rv;
414
415 rv = kernel_read(file, buf, len, &pos);
416 if (unlikely(rv != len)) {
417 return (rv < 0) ? rv : -EIO;
418 }
419 return 0;
420}
421
Paul Burton6a8d3892014-09-11 08:30:14 +0100422/**
423 * load_elf_phdrs() - load ELF program headers
424 * @elf_ex: ELF header of the binary whose program headers should be loaded
425 * @elf_file: the opened ELF binary file
426 *
427 * Loads ELF program headers from the binary file elf_file, which has the ELF
428 * header pointed to by elf_ex, into a newly allocated array. The caller is
429 * responsible for freeing the allocated data. Returns an ERR_PTR upon failure.
430 */
Alexey Dobriyan49ac9812019-03-07 16:29:03 -0800431static struct elf_phdr *load_elf_phdrs(const struct elfhdr *elf_ex,
Paul Burton6a8d3892014-09-11 08:30:14 +0100432 struct file *elf_file)
433{
434 struct elf_phdr *elf_phdata = NULL;
Alexey Dobriyanfaf1c312019-03-07 16:28:56 -0800435 int retval, err = -1;
Alexey Dobriyanfaf1c312019-03-07 16:28:56 -0800436 unsigned int size;
Paul Burton6a8d3892014-09-11 08:30:14 +0100437
438 /*
439 * If the size of this structure has changed, then punt, since
440 * we will be doing the wrong thing.
441 */
442 if (elf_ex->e_phentsize != sizeof(struct elf_phdr))
443 goto out;
444
445 /* Sanity check the number of program headers... */
Paul Burton6a8d3892014-09-11 08:30:14 +0100446 /* ...and their total size. */
447 size = sizeof(struct elf_phdr) * elf_ex->e_phnum;
Alexey Dobriyanfaf1c312019-03-07 16:28:56 -0800448 if (size == 0 || size > 65536 || size > ELF_MIN_ALIGN)
Paul Burton6a8d3892014-09-11 08:30:14 +0100449 goto out;
450
451 elf_phdata = kmalloc(size, GFP_KERNEL);
452 if (!elf_phdata)
453 goto out;
454
455 /* Read in the program headers */
Alexey Dobriyan658c0332019-12-04 16:52:25 -0800456 retval = elf_read(elf_file, elf_phdata, size, elf_ex->e_phoff);
457 if (retval < 0) {
458 err = retval;
Paul Burton6a8d3892014-09-11 08:30:14 +0100459 goto out;
460 }
461
462 /* Success! */
463 err = 0;
464out:
465 if (err) {
466 kfree(elf_phdata);
467 elf_phdata = NULL;
468 }
469 return elf_phdata;
470}
Jiri Kosinacc503c12008-01-30 13:31:07 +0100471
Paul Burton774c1052014-09-11 08:30:16 +0100472#ifndef CONFIG_ARCH_BINFMT_ELF_STATE
473
474/**
475 * struct arch_elf_state - arch-specific ELF loading state
476 *
477 * This structure is used to preserve architecture specific data during
478 * the loading of an ELF file, throughout the checking of architecture
479 * specific ELF headers & through to the point where the ELF load is
480 * known to be proceeding (ie. SET_PERSONALITY).
481 *
482 * This implementation is a dummy for architectures which require no
483 * specific state.
484 */
485struct arch_elf_state {
486};
487
488#define INIT_ARCH_ELF_STATE {}
489
490/**
491 * arch_elf_pt_proc() - check a PT_LOPROC..PT_HIPROC ELF program header
492 * @ehdr: The main ELF header
493 * @phdr: The program header to check
494 * @elf: The open ELF file
495 * @is_interp: True if the phdr is from the interpreter of the ELF being
496 * loaded, else false.
497 * @state: Architecture-specific state preserved throughout the process
498 * of loading the ELF.
499 *
500 * Inspects the program header phdr to validate its correctness and/or
501 * suitability for the system. Called once per ELF program header in the
502 * range PT_LOPROC to PT_HIPROC, for both the ELF being loaded and its
503 * interpreter.
504 *
505 * Return: Zero to proceed with the ELF load, non-zero to fail the ELF load
506 * with that return code.
507 */
508static inline int arch_elf_pt_proc(struct elfhdr *ehdr,
509 struct elf_phdr *phdr,
510 struct file *elf, bool is_interp,
511 struct arch_elf_state *state)
512{
513 /* Dummy implementation, always proceed */
514 return 0;
515}
516
517/**
Maciej W. Rozycki54d157142015-10-26 15:47:57 +0000518 * arch_check_elf() - check an ELF executable
Paul Burton774c1052014-09-11 08:30:16 +0100519 * @ehdr: The main ELF header
520 * @has_interp: True if the ELF has an interpreter, else false.
Maciej W. Rozyckieb4bc072015-11-13 00:47:48 +0000521 * @interp_ehdr: The interpreter's ELF header
Paul Burton774c1052014-09-11 08:30:16 +0100522 * @state: Architecture-specific state preserved throughout the process
523 * of loading the ELF.
524 *
525 * Provides a final opportunity for architecture code to reject the loading
526 * of the ELF & cause an exec syscall to return an error. This is called after
527 * all program headers to be checked by arch_elf_pt_proc have been.
528 *
529 * Return: Zero to proceed with the ELF load, non-zero to fail the ELF load
530 * with that return code.
531 */
532static inline int arch_check_elf(struct elfhdr *ehdr, bool has_interp,
Maciej W. Rozyckieb4bc072015-11-13 00:47:48 +0000533 struct elfhdr *interp_ehdr,
Paul Burton774c1052014-09-11 08:30:16 +0100534 struct arch_elf_state *state)
535{
536 /* Dummy implementation, always proceed */
537 return 0;
538}
539
540#endif /* !CONFIG_ARCH_BINFMT_ELF_STATE */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700541
Alexey Dobriyand8e7cb32019-05-14 15:43:51 -0700542static inline int make_prot(u32 p_flags)
543{
544 int prot = 0;
545
546 if (p_flags & PF_R)
547 prot |= PROT_READ;
548 if (p_flags & PF_W)
549 prot |= PROT_WRITE;
550 if (p_flags & PF_X)
551 prot |= PROT_EXEC;
552 return prot;
553}
554
Linus Torvalds1da177e2005-04-16 15:20:36 -0700555/* This is much more generalized than the library routine read function,
556 so we keep this separate. Technically the library read function
557 is only provided so that we can read a.out libraries that have
558 an ELF header */
559
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700560static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
Alexey Dobriyan81696d52019-12-04 16:52:22 -0800561 struct file *interpreter,
Paul Burtona9d9ef12014-09-11 08:30:15 +0100562 unsigned long no_base, struct elf_phdr *interp_elf_phdata)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700563{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700564 struct elf_phdr *eppnt;
565 unsigned long load_addr = 0;
566 int load_addr_set = 0;
567 unsigned long last_bss = 0, elf_bss = 0;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800568 int bss_prot = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700569 unsigned long error = ~0UL;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100570 unsigned long total_size;
Paul Burton6a8d3892014-09-11 08:30:14 +0100571 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700572
573 /* First of all, some simple consistency checks */
574 if (interp_elf_ex->e_type != ET_EXEC &&
575 interp_elf_ex->e_type != ET_DYN)
576 goto out;
Nicolas Pitre47552002017-08-16 16:05:13 -0400577 if (!elf_check_arch(interp_elf_ex) ||
578 elf_check_fdpic(interp_elf_ex))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700579 goto out;
Al Viro72c2d532013-09-22 16:27:52 -0400580 if (!interpreter->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700581 goto out;
582
Paul Burtona9d9ef12014-09-11 08:30:15 +0100583 total_size = total_mapping_size(interp_elf_phdata,
584 interp_elf_ex->e_phnum);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100585 if (!total_size) {
586 error = -EINVAL;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100587 goto out;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100588 }
589
Paul Burtona9d9ef12014-09-11 08:30:15 +0100590 eppnt = interp_elf_phdata;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700591 for (i = 0; i < interp_elf_ex->e_phnum; i++, eppnt++) {
592 if (eppnt->p_type == PT_LOAD) {
593 int elf_type = MAP_PRIVATE | MAP_DENYWRITE;
Alexey Dobriyand8e7cb32019-05-14 15:43:51 -0700594 int elf_prot = make_prot(eppnt->p_flags);
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700595 unsigned long vaddr = 0;
596 unsigned long k, map_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700597
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700598 vaddr = eppnt->p_vaddr;
599 if (interp_elf_ex->e_type == ET_EXEC || load_addr_set)
Michal Hocko4ed28632018-04-10 16:36:01 -0700600 elf_type |= MAP_FIXED_NOREPLACE;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100601 else if (no_base && interp_elf_ex->e_type == ET_DYN)
602 load_addr = -vaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700603
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700604 map_addr = elf_map(interpreter, load_addr + vaddr,
Andrew Mortonbb1ad822008-01-30 13:31:07 +0100605 eppnt, elf_prot, elf_type, total_size);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100606 total_size = 0;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700607 error = map_addr;
608 if (BAD_ADDR(map_addr))
Paul Burtona9d9ef12014-09-11 08:30:15 +0100609 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700610
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700611 if (!load_addr_set &&
612 interp_elf_ex->e_type == ET_DYN) {
613 load_addr = map_addr - ELF_PAGESTART(vaddr);
614 load_addr_set = 1;
615 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700616
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700617 /*
618 * Check to see if the section's size will overflow the
619 * allowed task size. Note that p_filesz must always be
620 * <= p_memsize so it's only necessary to check p_memsz.
621 */
622 k = load_addr + eppnt->p_vaddr;
Chuck Ebbertce510592006-07-03 00:24:14 -0700623 if (BAD_ADDR(k) ||
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700624 eppnt->p_filesz > eppnt->p_memsz ||
625 eppnt->p_memsz > TASK_SIZE ||
626 TASK_SIZE - eppnt->p_memsz < k) {
627 error = -ENOMEM;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100628 goto out;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700629 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700630
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700631 /*
632 * Find the end of the file mapping for this phdr, and
633 * keep track of the largest address we see for this.
634 */
635 k = load_addr + eppnt->p_vaddr + eppnt->p_filesz;
636 if (k > elf_bss)
637 elf_bss = k;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700638
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700639 /*
640 * Do the same thing for the memory mapping - between
641 * elf_bss and last_bss is the bss section.
642 */
Kees Cook0036d1f2016-08-02 14:04:51 -0700643 k = load_addr + eppnt->p_vaddr + eppnt->p_memsz;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800644 if (k > last_bss) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700645 last_bss = k;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800646 bss_prot = elf_prot;
647 }
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700648 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700649 }
650
Kees Cook0036d1f2016-08-02 14:04:51 -0700651 /*
652 * Now fill out the bss section: first pad the last page from
653 * the file up to the page boundary, and zero it from elf_bss
654 * up to the end of the page.
655 */
656 if (padzero(elf_bss)) {
657 error = -EFAULT;
658 goto out;
659 }
660 /*
661 * Next, align both the file and mem bss up to the page size,
662 * since this is where elf_bss was just zeroed up to, and where
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800663 * last_bss will end after the vm_brk_flags() below.
Kees Cook0036d1f2016-08-02 14:04:51 -0700664 */
665 elf_bss = ELF_PAGEALIGN(elf_bss);
666 last_bss = ELF_PAGEALIGN(last_bss);
667 /* Finally, if there is still more bss to allocate, do it. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700668 if (last_bss > elf_bss) {
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800669 error = vm_brk_flags(elf_bss, last_bss - elf_bss,
670 bss_prot & PROT_EXEC ? VM_EXEC : 0);
Linus Torvalds5d22fc22016-05-27 15:57:31 -0700671 if (error)
Paul Burtona9d9ef12014-09-11 08:30:15 +0100672 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700673 }
674
Jiri Kosinacc503c12008-01-30 13:31:07 +0100675 error = load_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676out:
677 return error;
678}
679
Linus Torvalds1da177e2005-04-16 15:20:36 -0700680/*
681 * These are the functions used to load ELF style executables and shared
682 * libraries. There is no binary dependent code anywhere else.
683 */
684
Al Viro71613c32012-10-20 22:00:48 -0400685static int load_elf_binary(struct linux_binprm *bprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700686{
687 struct file *interpreter = NULL; /* to shut gcc up */
688 unsigned long load_addr = 0, load_bias = 0;
689 int load_addr_set = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700690 unsigned long error;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100691 struct elf_phdr *elf_ppnt, *elf_phdata, *interp_elf_phdata = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700692 unsigned long elf_bss, elf_brk;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800693 int bss_prot = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700694 int retval, i;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100695 unsigned long elf_entry;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800696 unsigned long e_entry;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100697 unsigned long interp_load_addr = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700698 unsigned long start_code, end_code, start_data, end_data;
David Daney1a530a62011-03-22 16:34:48 -0700699 unsigned long reloc_func_desc __maybe_unused = 0;
David Rientjes8de61e62006-12-06 20:40:16 -0800700 int executable_stack = EXSTACK_DEFAULT;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800701 struct elfhdr *elf_ex = (struct elfhdr *)bprm->buf;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700702 struct {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700703 struct elfhdr interp_elf_ex;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700704 } *loc;
Paul Burton774c1052014-09-11 08:30:16 +0100705 struct arch_elf_state arch_state = INIT_ARCH_ELF_STATE;
Alexey Dobriyan03c6d722020-01-30 22:16:58 -0800706 struct mm_struct *mm;
Alexey Dobriyan249b08e2019-05-14 15:43:54 -0700707 struct pt_regs *regs;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700708
709 loc = kmalloc(sizeof(*loc), GFP_KERNEL);
710 if (!loc) {
711 retval = -ENOMEM;
712 goto out_ret;
713 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700714
715 retval = -ENOEXEC;
716 /* First of all, some simple consistency checks */
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800717 if (memcmp(elf_ex->e_ident, ELFMAG, SELFMAG) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700718 goto out;
719
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800720 if (elf_ex->e_type != ET_EXEC && elf_ex->e_type != ET_DYN)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700721 goto out;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800722 if (!elf_check_arch(elf_ex))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700723 goto out;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800724 if (elf_check_fdpic(elf_ex))
Nicolas Pitre47552002017-08-16 16:05:13 -0400725 goto out;
Al Viro72c2d532013-09-22 16:27:52 -0400726 if (!bprm->file->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700727 goto out;
728
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800729 elf_phdata = load_elf_phdrs(elf_ex, bprm->file);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700730 if (!elf_phdata)
731 goto out;
732
Linus Torvalds1da177e2005-04-16 15:20:36 -0700733 elf_ppnt = elf_phdata;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800734 for (i = 0; i < elf_ex->e_phnum; i++, elf_ppnt++) {
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700735 char *elf_interpreter;
Alexey Dobriyan5cf4a362019-05-14 15:43:36 -0700736
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700737 if (elf_ppnt->p_type != PT_INTERP)
738 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700739
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700740 /*
741 * This is the program interpreter used for shared libraries -
742 * for now assume that this is an a.out format binary.
743 */
744 retval = -ENOEXEC;
745 if (elf_ppnt->p_filesz > PATH_MAX || elf_ppnt->p_filesz < 2)
746 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700747
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700748 retval = -ENOMEM;
749 elf_interpreter = kmalloc(elf_ppnt->p_filesz, GFP_KERNEL);
750 if (!elf_interpreter)
751 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700752
Alexey Dobriyan658c0332019-12-04 16:52:25 -0800753 retval = elf_read(bprm->file, elf_interpreter, elf_ppnt->p_filesz,
754 elf_ppnt->p_offset);
755 if (retval < 0)
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700756 goto out_free_interp;
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700757 /* make sure path is NULL terminated */
758 retval = -ENOEXEC;
759 if (elf_interpreter[elf_ppnt->p_filesz - 1] != '\0')
760 goto out_free_interp;
Alexey Dobriyan1fb84492007-01-26 00:57:16 -0800761
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700762 interpreter = open_exec(elf_interpreter);
763 kfree(elf_interpreter);
764 retval = PTR_ERR(interpreter);
765 if (IS_ERR(interpreter))
766 goto out_free_ph;
Alexey Dobriyan1fb84492007-01-26 00:57:16 -0800767
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700768 /*
769 * If the binary is not readable then enforce mm->dumpable = 0
770 * regardless of the interpreter's permissions.
771 */
772 would_dump(bprm, interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700773
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700774 /* Get the exec headers */
Alexey Dobriyan658c0332019-12-04 16:52:25 -0800775 retval = elf_read(interpreter, &loc->interp_elf_ex,
776 sizeof(loc->interp_elf_ex), 0);
777 if (retval < 0)
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700778 goto out_free_dentry;
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700779
780 break;
Alexey Dobriyancc338012019-05-14 15:43:39 -0700781
782out_free_interp:
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700783 kfree(elf_interpreter);
784 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700785 }
786
787 elf_ppnt = elf_phdata;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800788 for (i = 0; i < elf_ex->e_phnum; i++, elf_ppnt++)
Paul Burton774c1052014-09-11 08:30:16 +0100789 switch (elf_ppnt->p_type) {
790 case PT_GNU_STACK:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700791 if (elf_ppnt->p_flags & PF_X)
792 executable_stack = EXSTACK_ENABLE_X;
793 else
794 executable_stack = EXSTACK_DISABLE_X;
795 break;
Paul Burton774c1052014-09-11 08:30:16 +0100796
797 case PT_LOPROC ... PT_HIPROC:
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800798 retval = arch_elf_pt_proc(elf_ex, elf_ppnt,
Paul Burton774c1052014-09-11 08:30:16 +0100799 bprm->file, false,
800 &arch_state);
801 if (retval)
802 goto out_free_dentry;
803 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700804 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700805
806 /* Some simple consistency checks for the interpreter */
Alexey Dobriyancc338012019-05-14 15:43:39 -0700807 if (interpreter) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700808 retval = -ELIBBAD;
Andi Kleend20894a2008-02-08 04:21:54 -0800809 /* Not an ELF interpreter */
810 if (memcmp(loc->interp_elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700811 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700812 /* Verify the interpreter has a valid arch */
Nicolas Pitre47552002017-08-16 16:05:13 -0400813 if (!elf_check_arch(&loc->interp_elf_ex) ||
814 elf_check_fdpic(&loc->interp_elf_ex))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700815 goto out_free_dentry;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100816
817 /* Load the interpreter program headers */
818 interp_elf_phdata = load_elf_phdrs(&loc->interp_elf_ex,
819 interpreter);
820 if (!interp_elf_phdata)
821 goto out_free_dentry;
Paul Burton774c1052014-09-11 08:30:16 +0100822
823 /* Pass PT_LOPROC..PT_HIPROC headers to arch code */
824 elf_ppnt = interp_elf_phdata;
825 for (i = 0; i < loc->interp_elf_ex.e_phnum; i++, elf_ppnt++)
826 switch (elf_ppnt->p_type) {
827 case PT_LOPROC ... PT_HIPROC:
828 retval = arch_elf_pt_proc(&loc->interp_elf_ex,
829 elf_ppnt, interpreter,
830 true, &arch_state);
831 if (retval)
832 goto out_free_dentry;
833 break;
834 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700835 }
836
Paul Burton774c1052014-09-11 08:30:16 +0100837 /*
838 * Allow arch code to reject the ELF at this point, whilst it's
839 * still possible to return an error to the code that invoked
840 * the exec syscall.
841 */
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800842 retval = arch_check_elf(elf_ex,
Maciej W. Rozyckieb4bc072015-11-13 00:47:48 +0000843 !!interpreter, &loc->interp_elf_ex,
844 &arch_state);
Paul Burton774c1052014-09-11 08:30:16 +0100845 if (retval)
846 goto out_free_dentry;
847
Linus Torvalds1da177e2005-04-16 15:20:36 -0700848 /* Flush all traces of the currently running executable */
849 retval = flush_old_exec(bprm);
850 if (retval)
851 goto out_free_dentry;
852
Linus Torvalds1da177e2005-04-16 15:20:36 -0700853 /* Do this immediately, since STACK_TOP as used in setup_arg_pages
854 may depend on the personality. */
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800855 SET_PERSONALITY2(*elf_ex, &arch_state);
856 if (elf_read_implies_exec(*elf_ex, executable_stack))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700857 current->personality |= READ_IMPLIES_EXEC;
858
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700859 if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700860 current->flags |= PF_RANDOMIZE;
Linus Torvalds221af7f2010-01-28 22:14:42 -0800861
862 setup_new_exec(bprm);
Linus Torvalds9f834ec2016-08-22 16:41:46 -0700863 install_exec_creds(bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700864
865 /* Do this so that we can load the interpreter, if need be. We will
866 change some of these later */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700867 retval = setup_arg_pages(bprm, randomize_stack_top(STACK_TOP),
868 executable_stack);
Al Viro19d860a2014-05-04 20:11:36 -0400869 if (retval < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700870 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700871
Alexey Dobriyan852643162019-05-14 15:43:48 -0700872 elf_bss = 0;
873 elf_brk = 0;
874
875 start_code = ~0UL;
876 end_code = 0;
877 start_data = 0;
878 end_data = 0;
879
André Goddard Rosaaf901ca2009-11-14 13:09:05 -0200880 /* Now we do a little grungy work by mmapping the ELF image into
Jiri Kosinacc503c12008-01-30 13:31:07 +0100881 the correct location in memory. */
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700882 for(i = 0, elf_ppnt = elf_phdata;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800883 i < elf_ex->e_phnum; i++, elf_ppnt++) {
Linus Torvaldsb2129212019-10-06 13:53:27 -0700884 int elf_prot, elf_flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700885 unsigned long k, vaddr;
Michael Davidsona87938b2015-04-14 15:47:38 -0700886 unsigned long total_size = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700887
888 if (elf_ppnt->p_type != PT_LOAD)
889 continue;
890
891 if (unlikely (elf_brk > elf_bss)) {
892 unsigned long nbyte;
893
894 /* There was a PT_LOAD segment with p_memsz > p_filesz
895 before this one. Map anonymous pages, if needed,
896 and clear the area. */
Mikael Petterssonf670d0e2011-01-12 17:00:02 -0800897 retval = set_brk(elf_bss + load_bias,
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800898 elf_brk + load_bias,
899 bss_prot);
Al Viro19d860a2014-05-04 20:11:36 -0400900 if (retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700901 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700902 nbyte = ELF_PAGEOFFSET(elf_bss);
903 if (nbyte) {
904 nbyte = ELF_MIN_ALIGN - nbyte;
905 if (nbyte > elf_brk - elf_bss)
906 nbyte = elf_brk - elf_bss;
907 if (clear_user((void __user *)elf_bss +
908 load_bias, nbyte)) {
909 /*
910 * This bss-zeroing can fail if the ELF
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700911 * file specifies odd protections. So
Linus Torvalds1da177e2005-04-16 15:20:36 -0700912 * we don't check the return value
913 */
914 }
915 }
916 }
917
Alexey Dobriyand8e7cb32019-05-14 15:43:51 -0700918 elf_prot = make_prot(elf_ppnt->p_flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700919
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700920 elf_flags = MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700921
922 vaddr = elf_ppnt->p_vaddr;
Kees Cookeab09532017-07-10 15:52:37 -0700923 /*
924 * If we are loading ET_EXEC or we have already performed
925 * the ET_DYN load_addr calculations, proceed normally.
926 */
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800927 if (elf_ex->e_type == ET_EXEC || load_addr_set) {
Linus Torvaldsb2129212019-10-06 13:53:27 -0700928 elf_flags |= MAP_FIXED;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800929 } else if (elf_ex->e_type == ET_DYN) {
Kees Cookeab09532017-07-10 15:52:37 -0700930 /*
931 * This logic is run once for the first LOAD Program
932 * Header for ET_DYN binaries to calculate the
933 * randomization (load_bias) for all the LOAD
934 * Program Headers, and to calculate the entire
935 * size of the ELF mapping (total_size). (Note that
936 * load_addr_set is set to true later once the
937 * initial mapping is performed.)
938 *
939 * There are effectively two types of ET_DYN
940 * binaries: programs (i.e. PIE: ET_DYN with INTERP)
941 * and loaders (ET_DYN without INTERP, since they
942 * _are_ the ELF interpreter). The loaders must
943 * be loaded away from programs since the program
944 * may otherwise collide with the loader (especially
945 * for ET_EXEC which does not have a randomized
946 * position). For example to handle invocations of
947 * "./ld.so someprog" to test out a new version of
948 * the loader, the subsequent program that the
949 * loader loads must avoid the loader itself, so
950 * they cannot share the same load range. Sufficient
951 * room for the brk must be allocated with the
952 * loader as well, since brk must be available with
953 * the loader.
954 *
955 * Therefore, programs are loaded offset from
956 * ELF_ET_DYN_BASE and loaders are loaded into the
957 * independently randomized mmap region (0 load_bias
958 * without MAP_FIXED).
959 */
Alexey Dobriyancc338012019-05-14 15:43:39 -0700960 if (interpreter) {
Kees Cookeab09532017-07-10 15:52:37 -0700961 load_bias = ELF_ET_DYN_BASE;
962 if (current->flags & PF_RANDOMIZE)
963 load_bias += arch_mmap_rnd();
Linus Torvaldsb2129212019-10-06 13:53:27 -0700964 elf_flags |= MAP_FIXED;
Kees Cookeab09532017-07-10 15:52:37 -0700965 } else
966 load_bias = 0;
967
968 /*
969 * Since load_bias is used for all subsequent loading
970 * calculations, we must lower it by the first vaddr
971 * so that the remaining calculations based on the
972 * ELF vaddrs will be correctly offset. The result
973 * is then page aligned.
974 */
975 load_bias = ELF_PAGESTART(load_bias - vaddr);
976
Michael Davidsona87938b2015-04-14 15:47:38 -0700977 total_size = total_mapping_size(elf_phdata,
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800978 elf_ex->e_phnum);
Michael Davidsona87938b2015-04-14 15:47:38 -0700979 if (!total_size) {
Andrew Morton2b1d3ae2015-05-28 15:44:24 -0700980 retval = -EINVAL;
Michael Davidsona87938b2015-04-14 15:47:38 -0700981 goto out_free_dentry;
982 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700983 }
984
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700985 error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt,
Michael Davidsona87938b2015-04-14 15:47:38 -0700986 elf_prot, elf_flags, total_size);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700987 if (BAD_ADDR(error)) {
Alexey Kuznetsovb140f2512007-05-08 00:31:57 -0700988 retval = IS_ERR((void *)error) ?
989 PTR_ERR((void*)error) : -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700990 goto out_free_dentry;
991 }
992
993 if (!load_addr_set) {
994 load_addr_set = 1;
995 load_addr = (elf_ppnt->p_vaddr - elf_ppnt->p_offset);
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800996 if (elf_ex->e_type == ET_DYN) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700997 load_bias += error -
998 ELF_PAGESTART(load_bias + vaddr);
999 load_addr += load_bias;
1000 reloc_func_desc = load_bias;
1001 }
1002 }
1003 k = elf_ppnt->p_vaddr;
Alexey Dobriyanf67ef442020-01-30 22:16:52 -08001004 if ((elf_ppnt->p_flags & PF_X) && k < start_code)
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001005 start_code = k;
1006 if (start_data < k)
1007 start_data = k;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001008
1009 /*
1010 * Check to see if the section's size will overflow the
1011 * allowed task size. Note that p_filesz must always be
1012 * <= p_memsz so it is only necessary to check p_memsz.
1013 */
Chuck Ebbertce510592006-07-03 00:24:14 -07001014 if (BAD_ADDR(k) || elf_ppnt->p_filesz > elf_ppnt->p_memsz ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07001015 elf_ppnt->p_memsz > TASK_SIZE ||
1016 TASK_SIZE - elf_ppnt->p_memsz < k) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001017 /* set_brk can never work. Avoid overflows. */
Alexey Kuznetsovb140f2512007-05-08 00:31:57 -07001018 retval = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001019 goto out_free_dentry;
1020 }
1021
1022 k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz;
1023
1024 if (k > elf_bss)
1025 elf_bss = k;
1026 if ((elf_ppnt->p_flags & PF_X) && end_code < k)
1027 end_code = k;
1028 if (end_data < k)
1029 end_data = k;
1030 k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz;
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001031 if (k > elf_brk) {
1032 bss_prot = elf_prot;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001033 elf_brk = k;
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001034 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001035 }
1036
Alexey Dobriyana62c5b12020-01-30 22:16:55 -08001037 e_entry = elf_ex->e_entry + load_bias;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001038 elf_bss += load_bias;
1039 elf_brk += load_bias;
1040 start_code += load_bias;
1041 end_code += load_bias;
1042 start_data += load_bias;
1043 end_data += load_bias;
1044
1045 /* Calling set_brk effectively mmaps the pages that we need
1046 * for the bss and break sections. We must do this before
1047 * mapping in the interpreter, to make sure it doesn't wind
1048 * up getting placed where the bss needs to go.
1049 */
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001050 retval = set_brk(elf_bss, elf_brk, bss_prot);
Al Viro19d860a2014-05-04 20:11:36 -04001051 if (retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001052 goto out_free_dentry;
akpm@osdl.org6de50512005-10-11 08:29:08 -07001053 if (likely(elf_bss != elf_brk) && unlikely(padzero(elf_bss))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001054 retval = -EFAULT; /* Nobody gets to see this, but.. */
1055 goto out_free_dentry;
1056 }
1057
Alexey Dobriyancc338012019-05-14 15:43:39 -07001058 if (interpreter) {
Andi Kleend20894a2008-02-08 04:21:54 -08001059 elf_entry = load_elf_interp(&loc->interp_elf_ex,
1060 interpreter,
Paul Burtona9d9ef12014-09-11 08:30:15 +01001061 load_bias, interp_elf_phdata);
Andi Kleend20894a2008-02-08 04:21:54 -08001062 if (!IS_ERR((void *)elf_entry)) {
1063 /*
1064 * load_elf_interp() returns relocation
1065 * adjustment
1066 */
1067 interp_load_addr = elf_entry;
1068 elf_entry += loc->interp_elf_ex.e_entry;
Jiri Kosinacc503c12008-01-30 13:31:07 +01001069 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001070 if (BAD_ADDR(elf_entry)) {
Chuck Ebbertce510592006-07-03 00:24:14 -07001071 retval = IS_ERR((void *)elf_entry) ?
1072 (int)elf_entry : -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001073 goto out_free_dentry;
1074 }
1075 reloc_func_desc = interp_load_addr;
1076
1077 allow_write_access(interpreter);
1078 fput(interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001079 } else {
Alexey Dobriyana62c5b12020-01-30 22:16:55 -08001080 elf_entry = e_entry;
Suresh Siddha5342fba2006-02-26 04:18:28 +01001081 if (BAD_ADDR(elf_entry)) {
Chuck Ebbertce510592006-07-03 00:24:14 -07001082 retval = -EINVAL;
Suresh Siddha5342fba2006-02-26 04:18:28 +01001083 goto out_free_dentry;
1084 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001085 }
1086
Paul Burton774c1052014-09-11 08:30:16 +01001087 kfree(interp_elf_phdata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001088 kfree(elf_phdata);
1089
Linus Torvalds1da177e2005-04-16 15:20:36 -07001090 set_binfmt(&elf_format);
1091
Benjamin Herrenschmidt547ee842005-04-16 15:24:35 -07001092#ifdef ARCH_HAS_SETUP_ADDITIONAL_PAGES
Alexey Dobriyancc338012019-05-14 15:43:39 -07001093 retval = arch_setup_additional_pages(bprm, !!interpreter);
Al Viro19d860a2014-05-04 20:11:36 -04001094 if (retval < 0)
Roland McGrath18c8baff2005-04-28 15:17:19 -07001095 goto out;
Benjamin Herrenschmidt547ee842005-04-16 15:24:35 -07001096#endif /* ARCH_HAS_SETUP_ADDITIONAL_PAGES */
1097
Alexey Dobriyana62c5b12020-01-30 22:16:55 -08001098 retval = create_elf_tables(bprm, elf_ex,
1099 load_addr, interp_load_addr, e_entry);
Al Viro19d860a2014-05-04 20:11:36 -04001100 if (retval < 0)
Ollie Wildb6a2fea2007-07-19 01:48:16 -07001101 goto out;
Alexey Dobriyan03c6d722020-01-30 22:16:58 -08001102
1103 mm = current->mm;
1104 mm->end_code = end_code;
1105 mm->start_code = start_code;
1106 mm->start_data = start_data;
1107 mm->end_data = end_data;
1108 mm->start_stack = bprm->p;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001109
Jiri Kosina4471a672011-04-14 15:22:09 -07001110 if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1)) {
Kees Cookbbdc6072019-05-14 15:43:57 -07001111 /*
1112 * For architectures with ELF randomization, when executing
1113 * a loader directly (i.e. no interpreter listed in ELF
1114 * headers), move the brk area out of the mmap region
1115 * (since it grows up, and may collide early with the stack
1116 * growing down), and into the unused ELF_ET_DYN_BASE region.
1117 */
Kees Cook7be3cb02019-09-26 10:15:25 -07001118 if (IS_ENABLED(CONFIG_ARCH_HAS_ELF_RANDOMIZE) &&
Alexey Dobriyan03c6d722020-01-30 22:16:58 -08001119 elf_ex->e_type == ET_DYN && !interpreter) {
1120 mm->brk = mm->start_brk = ELF_ET_DYN_BASE;
1121 }
Kees Cookbbdc6072019-05-14 15:43:57 -07001122
Alexey Dobriyan03c6d722020-01-30 22:16:58 -08001123 mm->brk = mm->start_brk = arch_randomize_brk(mm);
Kees Cook204db6e2015-04-14 15:48:12 -07001124#ifdef compat_brk_randomized
Jiri Kosina4471a672011-04-14 15:22:09 -07001125 current->brk_randomized = 1;
1126#endif
1127 }
Jiri Kosinac1d171a2008-01-30 13:30:40 +01001128
Linus Torvalds1da177e2005-04-16 15:20:36 -07001129 if (current->personality & MMAP_PAGE_ZERO) {
1130 /* Why this, you ask??? Well SVr4 maps page 0 as read-only,
1131 and some applications "depend" upon this behavior.
1132 Since we do not have the power to recompile these, we
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001133 emulate the SVr4 behavior. Sigh. */
Linus Torvalds6be5ceb2012-04-20 17:13:58 -07001134 error = vm_mmap(NULL, 0, PAGE_SIZE, PROT_READ | PROT_EXEC,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001135 MAP_FIXED | MAP_PRIVATE, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001136 }
1137
Alexey Dobriyan249b08e2019-05-14 15:43:54 -07001138 regs = current_pt_regs();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001139#ifdef ELF_PLAT_INIT
1140 /*
1141 * The ABI may specify that certain registers be set up in special
1142 * ways (on i386 %edx is the address of a DT_FINI function, for
1143 * example. In addition, it may also specify (eg, PowerPC64 ELF)
1144 * that the e_entry field is the address of the function descriptor
1145 * for the startup routine, rather than the address of the startup
1146 * routine itself. This macro performs whatever initialization to
1147 * the regs structure is required as well as any relocations to the
1148 * function descriptor entries when executing dynamically links apps.
1149 */
1150 ELF_PLAT_INIT(regs, reloc_func_desc);
1151#endif
1152
Kees Cookb8383832018-04-10 16:34:57 -07001153 finalize_exec(bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001154 start_thread(regs, elf_entry, bprm->p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001155 retval = 0;
1156out:
1157 kfree(loc);
1158out_ret:
1159 return retval;
1160
1161 /* error cleanup */
1162out_free_dentry:
Paul Burtona9d9ef12014-09-11 08:30:15 +01001163 kfree(interp_elf_phdata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001164 allow_write_access(interpreter);
1165 if (interpreter)
1166 fput(interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001167out_free_ph:
1168 kfree(elf_phdata);
1169 goto out;
1170}
1171
Josh Triplett69369a72014-04-03 14:48:27 -07001172#ifdef CONFIG_USELIB
Linus Torvalds1da177e2005-04-16 15:20:36 -07001173/* This is really simpleminded and specialized - we are loading an
1174 a.out library that is given an ELF header. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001175static int load_elf_library(struct file *file)
1176{
1177 struct elf_phdr *elf_phdata;
1178 struct elf_phdr *eppnt;
1179 unsigned long elf_bss, bss, len;
1180 int retval, error, i, j;
1181 struct elfhdr elf_ex;
1182
1183 error = -ENOEXEC;
Alexey Dobriyan658c0332019-12-04 16:52:25 -08001184 retval = elf_read(file, &elf_ex, sizeof(elf_ex), 0);
1185 if (retval < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001186 goto out;
1187
1188 if (memcmp(elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
1189 goto out;
1190
1191 /* First of all, some simple consistency checks */
1192 if (elf_ex.e_type != ET_EXEC || elf_ex.e_phnum > 2 ||
Al Viro72c2d532013-09-22 16:27:52 -04001193 !elf_check_arch(&elf_ex) || !file->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001194 goto out;
Nicolas Pitre47552002017-08-16 16:05:13 -04001195 if (elf_check_fdpic(&elf_ex))
1196 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001197
1198 /* Now read in all of the header information */
1199
1200 j = sizeof(struct elf_phdr) * elf_ex.e_phnum;
1201 /* j < ELF_MIN_ALIGN because elf_ex.e_phnum <= 2 */
1202
1203 error = -ENOMEM;
1204 elf_phdata = kmalloc(j, GFP_KERNEL);
1205 if (!elf_phdata)
1206 goto out;
1207
1208 eppnt = elf_phdata;
1209 error = -ENOEXEC;
Alexey Dobriyan658c0332019-12-04 16:52:25 -08001210 retval = elf_read(file, eppnt, j, elf_ex.e_phoff);
1211 if (retval < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001212 goto out_free_ph;
1213
1214 for (j = 0, i = 0; i<elf_ex.e_phnum; i++)
1215 if ((eppnt + i)->p_type == PT_LOAD)
1216 j++;
1217 if (j != 1)
1218 goto out_free_ph;
1219
1220 while (eppnt->p_type != PT_LOAD)
1221 eppnt++;
1222
1223 /* Now use mmap to map the library into memory. */
Linus Torvalds6be5ceb2012-04-20 17:13:58 -07001224 error = vm_mmap(file,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001225 ELF_PAGESTART(eppnt->p_vaddr),
1226 (eppnt->p_filesz +
1227 ELF_PAGEOFFSET(eppnt->p_vaddr)),
1228 PROT_READ | PROT_WRITE | PROT_EXEC,
Michal Hocko4ed28632018-04-10 16:36:01 -07001229 MAP_FIXED_NOREPLACE | MAP_PRIVATE | MAP_DENYWRITE,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001230 (eppnt->p_offset -
1231 ELF_PAGEOFFSET(eppnt->p_vaddr)));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001232 if (error != ELF_PAGESTART(eppnt->p_vaddr))
1233 goto out_free_ph;
1234
1235 elf_bss = eppnt->p_vaddr + eppnt->p_filesz;
1236 if (padzero(elf_bss)) {
1237 error = -EFAULT;
1238 goto out_free_ph;
1239 }
1240
Oscar Salvador24962af2018-07-13 16:59:13 -07001241 len = ELF_PAGEALIGN(eppnt->p_filesz + eppnt->p_vaddr);
1242 bss = ELF_PAGEALIGN(eppnt->p_memsz + eppnt->p_vaddr);
Michal Hockoecc2bc82016-05-23 16:25:39 -07001243 if (bss > len) {
1244 error = vm_brk(len, bss - len);
Linus Torvalds5d22fc22016-05-27 15:57:31 -07001245 if (error)
Michal Hockoecc2bc82016-05-23 16:25:39 -07001246 goto out_free_ph;
1247 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001248 error = 0;
1249
1250out_free_ph:
1251 kfree(elf_phdata);
1252out:
1253 return error;
1254}
Josh Triplett69369a72014-04-03 14:48:27 -07001255#endif /* #ifdef CONFIG_USELIB */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001256
Christoph Hellwig698ba7b2009-12-15 16:47:37 -08001257#ifdef CONFIG_ELF_CORE
Linus Torvalds1da177e2005-04-16 15:20:36 -07001258/*
1259 * ELF core dumper
1260 *
1261 * Modelled on fs/exec.c:aout_core_dump()
1262 * Jeremy Fitzhardinge <jeremy@sw.oz.au>
1263 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001264
1265/*
Jason Baron909af762012-03-23 15:02:51 -07001266 * The purpose of always_dump_vma() is to make sure that special kernel mappings
1267 * that are useful for post-mortem analysis are included in every core dump.
1268 * In that way we ensure that the core dump is fully interpretable later
1269 * without matching up the same kernel and hardware config to see what PC values
1270 * meant. These special mappings include - vDSO, vsyscall, and other
1271 * architecture specific mappings
1272 */
1273static bool always_dump_vma(struct vm_area_struct *vma)
1274{
1275 /* Any vsyscall mappings? */
1276 if (vma == get_gate_vma(vma->vm_mm))
1277 return true;
Andy Lutomirski78d683e2014-05-19 15:58:32 -07001278
1279 /*
1280 * Assume that all vmas with a .name op should always be dumped.
1281 * If this changes, a new vm_ops field can easily be added.
1282 */
1283 if (vma->vm_ops && vma->vm_ops->name && vma->vm_ops->name(vma))
1284 return true;
1285
Jason Baron909af762012-03-23 15:02:51 -07001286 /*
1287 * arch_vma_name() returns non-NULL for special architecture mappings,
1288 * such as vDSO sections.
1289 */
1290 if (arch_vma_name(vma))
1291 return true;
1292
1293 return false;
1294}
1295
1296/*
Roland McGrath82df3972007-10-16 23:27:02 -07001297 * Decide what to dump of a segment, part, all or none.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001298 */
Roland McGrath82df3972007-10-16 23:27:02 -07001299static unsigned long vma_dump_size(struct vm_area_struct *vma,
1300 unsigned long mm_flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001301{
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001302#define FILTER(type) (mm_flags & (1UL << MMF_DUMP_##type))
1303
Jason Baron909af762012-03-23 15:02:51 -07001304 /* always dump the vdso and vsyscall sections */
1305 if (always_dump_vma(vma))
Roland McGrath82df3972007-10-16 23:27:02 -07001306 goto whole;
Roland McGrathe5b97dd2007-01-26 00:56:48 -08001307
Konstantin Khlebnikov0103bd12012-10-08 16:28:59 -07001308 if (vma->vm_flags & VM_DONTDUMP)
Jason Baronaccb61f2012-03-23 15:02:51 -07001309 return 0;
1310
Ross Zwisler50378352015-10-05 16:33:36 -06001311 /* support for DAX */
1312 if (vma_is_dax(vma)) {
1313 if ((vma->vm_flags & VM_SHARED) && FILTER(DAX_SHARED))
1314 goto whole;
1315 if (!(vma->vm_flags & VM_SHARED) && FILTER(DAX_PRIVATE))
1316 goto whole;
1317 return 0;
1318 }
1319
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001320 /* Hugetlb memory check */
Anshuman Khandual03911132020-04-06 20:03:51 -07001321 if (is_vm_hugetlb_page(vma)) {
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001322 if ((vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_SHARED))
1323 goto whole;
1324 if (!(vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_PRIVATE))
1325 goto whole;
Naoya Horiguchi23d9e482013-04-17 15:58:28 -07001326 return 0;
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001327 }
1328
Linus Torvalds1da177e2005-04-16 15:20:36 -07001329 /* Do not dump I/O mapped devices or special mappings */
Konstantin Khlebnikov314e51b2012-10-08 16:29:02 -07001330 if (vma->vm_flags & VM_IO)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001331 return 0;
1332
Kawai, Hidehiroa1b59e82007-07-19 01:48:29 -07001333 /* By default, dump shared memory if mapped from an anonymous file. */
1334 if (vma->vm_flags & VM_SHARED) {
Al Viro496ad9a2013-01-23 17:07:38 -05001335 if (file_inode(vma->vm_file)->i_nlink == 0 ?
Roland McGrath82df3972007-10-16 23:27:02 -07001336 FILTER(ANON_SHARED) : FILTER(MAPPED_SHARED))
1337 goto whole;
1338 return 0;
Kawai, Hidehiroa1b59e82007-07-19 01:48:29 -07001339 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001340
Roland McGrath82df3972007-10-16 23:27:02 -07001341 /* Dump segments that have been written to. */
1342 if (vma->anon_vma && FILTER(ANON_PRIVATE))
1343 goto whole;
1344 if (vma->vm_file == NULL)
1345 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001346
Roland McGrath82df3972007-10-16 23:27:02 -07001347 if (FILTER(MAPPED_PRIVATE))
1348 goto whole;
1349
1350 /*
1351 * If this looks like the beginning of a DSO or executable mapping,
1352 * check for an ELF header. If we find one, dump the first page to
1353 * aid in determining what was mapped here.
1354 */
Roland McGrath92dc07b2009-02-06 17:34:07 -08001355 if (FILTER(ELF_HEADERS) &&
1356 vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) {
Roland McGrath82df3972007-10-16 23:27:02 -07001357 u32 __user *header = (u32 __user *) vma->vm_start;
1358 u32 word;
Roland McGrath92dc07b2009-02-06 17:34:07 -08001359 mm_segment_t fs = get_fs();
Roland McGrath82df3972007-10-16 23:27:02 -07001360 /*
1361 * Doing it this way gets the constant folded by GCC.
1362 */
1363 union {
1364 u32 cmp;
1365 char elfmag[SELFMAG];
1366 } magic;
1367 BUILD_BUG_ON(SELFMAG != sizeof word);
1368 magic.elfmag[EI_MAG0] = ELFMAG0;
1369 magic.elfmag[EI_MAG1] = ELFMAG1;
1370 magic.elfmag[EI_MAG2] = ELFMAG2;
1371 magic.elfmag[EI_MAG3] = ELFMAG3;
Roland McGrath92dc07b2009-02-06 17:34:07 -08001372 /*
1373 * Switch to the user "segment" for get_user(),
1374 * then put back what elf_core_dump() had in place.
1375 */
1376 set_fs(USER_DS);
1377 if (unlikely(get_user(word, header)))
1378 word = 0;
1379 set_fs(fs);
1380 if (word == magic.cmp)
Roland McGrath82df3972007-10-16 23:27:02 -07001381 return PAGE_SIZE;
1382 }
1383
1384#undef FILTER
1385
1386 return 0;
1387
1388whole:
1389 return vma->vm_end - vma->vm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001390}
1391
Linus Torvalds1da177e2005-04-16 15:20:36 -07001392/* An ELF note in memory */
1393struct memelfnote
1394{
1395 const char *name;
1396 int type;
1397 unsigned int datasz;
1398 void *data;
1399};
1400
1401static int notesize(struct memelfnote *en)
1402{
1403 int sz;
1404
1405 sz = sizeof(struct elf_note);
1406 sz += roundup(strlen(en->name) + 1, 4);
1407 sz += roundup(en->datasz, 4);
1408
1409 return sz;
1410}
1411
Al Viroecc8c772013-10-05 15:32:35 -04001412static int writenote(struct memelfnote *men, struct coredump_params *cprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001413{
1414 struct elf_note en;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001415 en.n_namesz = strlen(men->name) + 1;
1416 en.n_descsz = men->datasz;
1417 en.n_type = men->type;
1418
Al Viroecc8c772013-10-05 15:32:35 -04001419 return dump_emit(cprm, &en, sizeof(en)) &&
Al Viro22a8cb82013-10-08 11:05:01 -04001420 dump_emit(cprm, men->name, en.n_namesz) && dump_align(cprm, 4) &&
1421 dump_emit(cprm, men->data, men->datasz) && dump_align(cprm, 4);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001422}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001423
Roland McGrath3aba4812008-01-30 13:31:44 +01001424static void fill_elf_header(struct elfhdr *elf, int segs,
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001425 u16 machine, u32 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001426{
Cyrill Gorcunov6970c8e2008-04-29 01:01:18 -07001427 memset(elf, 0, sizeof(*elf));
1428
Linus Torvalds1da177e2005-04-16 15:20:36 -07001429 memcpy(elf->e_ident, ELFMAG, SELFMAG);
1430 elf->e_ident[EI_CLASS] = ELF_CLASS;
1431 elf->e_ident[EI_DATA] = ELF_DATA;
1432 elf->e_ident[EI_VERSION] = EV_CURRENT;
1433 elf->e_ident[EI_OSABI] = ELF_OSABI;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001434
1435 elf->e_type = ET_CORE;
Roland McGrath3aba4812008-01-30 13:31:44 +01001436 elf->e_machine = machine;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001437 elf->e_version = EV_CURRENT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001438 elf->e_phoff = sizeof(struct elfhdr);
Roland McGrath3aba4812008-01-30 13:31:44 +01001439 elf->e_flags = flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001440 elf->e_ehsize = sizeof(struct elfhdr);
1441 elf->e_phentsize = sizeof(struct elf_phdr);
1442 elf->e_phnum = segs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001443}
1444
Andrew Morton8d6b5eee2006-09-25 23:32:04 -07001445static void fill_elf_note_phdr(struct elf_phdr *phdr, int sz, loff_t offset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001446{
1447 phdr->p_type = PT_NOTE;
1448 phdr->p_offset = offset;
1449 phdr->p_vaddr = 0;
1450 phdr->p_paddr = 0;
1451 phdr->p_filesz = sz;
1452 phdr->p_memsz = 0;
1453 phdr->p_flags = 0;
1454 phdr->p_align = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001455}
1456
1457static void fill_note(struct memelfnote *note, const char *name, int type,
1458 unsigned int sz, void *data)
1459{
1460 note->name = name;
1461 note->type = type;
1462 note->datasz = sz;
1463 note->data = data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001464}
1465
1466/*
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001467 * fill up all the fields in prstatus from the given task struct, except
1468 * registers which need to be filled up separately.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001469 */
1470static void fill_prstatus(struct elf_prstatus *prstatus,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001471 struct task_struct *p, long signr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001472{
1473 prstatus->pr_info.si_signo = prstatus->pr_cursig = signr;
1474 prstatus->pr_sigpend = p->pending.signal.sig[0];
1475 prstatus->pr_sighold = p->blocked.sig[0];
Oleg Nesterov3b34fc52009-06-17 16:27:38 -07001476 rcu_read_lock();
1477 prstatus->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1478 rcu_read_unlock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001479 prstatus->pr_pid = task_pid_vnr(p);
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001480 prstatus->pr_pgrp = task_pgrp_vnr(p);
1481 prstatus->pr_sid = task_session_vnr(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001482 if (thread_group_leader(p)) {
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001483 struct task_cputime cputime;
Frank Mayharf06febc2008-09-12 09:54:39 -07001484
Linus Torvalds1da177e2005-04-16 15:20:36 -07001485 /*
Frank Mayharf06febc2008-09-12 09:54:39 -07001486 * This is the record for the group leader. It shows the
1487 * group-wide total, not its individual thread total.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001488 */
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001489 thread_group_cputime(p, &cputime);
Arnd Bergmanne2bb80d2017-11-23 13:46:33 +01001490 prstatus->pr_utime = ns_to_kernel_old_timeval(cputime.utime);
1491 prstatus->pr_stime = ns_to_kernel_old_timeval(cputime.stime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001492 } else {
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001493 u64 utime, stime;
Frederic Weisbecker6fac4822012-11-13 14:20:55 +01001494
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001495 task_cputime(p, &utime, &stime);
Arnd Bergmanne2bb80d2017-11-23 13:46:33 +01001496 prstatus->pr_utime = ns_to_kernel_old_timeval(utime);
1497 prstatus->pr_stime = ns_to_kernel_old_timeval(stime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001498 }
Frederic Weisbecker5613fda2017-01-31 04:09:23 +01001499
Arnd Bergmanne2bb80d2017-11-23 13:46:33 +01001500 prstatus->pr_cutime = ns_to_kernel_old_timeval(p->signal->cutime);
1501 prstatus->pr_cstime = ns_to_kernel_old_timeval(p->signal->cstime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001502}
1503
1504static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p,
1505 struct mm_struct *mm)
1506{
David Howellsc69e8d92008-11-14 10:39:19 +11001507 const struct cred *cred;
Greg Kroah-Hartmana84a5052005-05-11 00:10:44 -07001508 unsigned int i, len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001509
1510 /* first copy the parameters from user space */
1511 memset(psinfo, 0, sizeof(struct elf_prpsinfo));
1512
1513 len = mm->arg_end - mm->arg_start;
1514 if (len >= ELF_PRARGSZ)
1515 len = ELF_PRARGSZ-1;
1516 if (copy_from_user(&psinfo->pr_psargs,
1517 (const char __user *)mm->arg_start, len))
1518 return -EFAULT;
1519 for(i = 0; i < len; i++)
1520 if (psinfo->pr_psargs[i] == 0)
1521 psinfo->pr_psargs[i] = ' ';
1522 psinfo->pr_psargs[len] = 0;
1523
Oleg Nesterov3b34fc52009-06-17 16:27:38 -07001524 rcu_read_lock();
1525 psinfo->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1526 rcu_read_unlock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001527 psinfo->pr_pid = task_pid_vnr(p);
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001528 psinfo->pr_pgrp = task_pgrp_vnr(p);
1529 psinfo->pr_sid = task_session_vnr(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001530
1531 i = p->state ? ffz(~p->state) + 1 : 0;
1532 psinfo->pr_state = i;
Carsten Otte55148542006-03-25 03:08:22 -08001533 psinfo->pr_sname = (i > 5) ? '.' : "RSDTZW"[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001534 psinfo->pr_zomb = psinfo->pr_sname == 'Z';
1535 psinfo->pr_nice = task_nice(p);
1536 psinfo->pr_flag = p->flags;
David Howellsc69e8d92008-11-14 10:39:19 +11001537 rcu_read_lock();
1538 cred = __task_cred(p);
Eric W. Biedermanebc887b2012-02-07 18:36:10 -08001539 SET_UID(psinfo->pr_uid, from_kuid_munged(cred->user_ns, cred->uid));
1540 SET_GID(psinfo->pr_gid, from_kgid_munged(cred->user_ns, cred->gid));
David Howellsc69e8d92008-11-14 10:39:19 +11001541 rcu_read_unlock();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001542 strncpy(psinfo->pr_fname, p->comm, sizeof(psinfo->pr_fname));
1543
1544 return 0;
1545}
1546
Roland McGrath3aba4812008-01-30 13:31:44 +01001547static void fill_auxv_note(struct memelfnote *note, struct mm_struct *mm)
1548{
1549 elf_addr_t *auxv = (elf_addr_t *) mm->saved_auxv;
1550 int i = 0;
1551 do
1552 i += 2;
1553 while (auxv[i - 2] != AT_NULL);
1554 fill_note(note, "CORE", NT_AUXV, i * sizeof(elf_addr_t), auxv);
1555}
1556
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001557static void fill_siginfo_note(struct memelfnote *note, user_siginfo_t *csigdata,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02001558 const kernel_siginfo_t *siginfo)
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001559{
1560 mm_segment_t old_fs = get_fs();
1561 set_fs(KERNEL_DS);
1562 copy_siginfo_to_user((user_siginfo_t __user *) csigdata, siginfo);
1563 set_fs(old_fs);
1564 fill_note(note, "CORE", NT_SIGINFO, sizeof(*csigdata), csigdata);
1565}
1566
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001567#define MAX_FILE_NOTE_SIZE (4*1024*1024)
1568/*
1569 * Format of NT_FILE note:
1570 *
1571 * long count -- how many files are mapped
1572 * long page_size -- units for file_ofs
1573 * array of [COUNT] elements of
1574 * long start
1575 * long end
1576 * long file_ofs
1577 * followed by COUNT filenames in ASCII: "FILE1" NUL "FILE2" NUL...
1578 */
Dan Aloni72023652013-09-30 13:45:02 -07001579static int fill_files_note(struct memelfnote *note)
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001580{
Alexey Dobriyan03c6d722020-01-30 22:16:58 -08001581 struct mm_struct *mm = current->mm;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001582 struct vm_area_struct *vma;
1583 unsigned count, size, names_ofs, remaining, n;
1584 user_long_t *data;
1585 user_long_t *start_end_ofs;
1586 char *name_base, *name_curpos;
1587
1588 /* *Estimated* file count and total data size needed */
Alexey Dobriyan03c6d722020-01-30 22:16:58 -08001589 count = mm->map_count;
Alexey Dobriyan60c9d922018-02-06 15:39:13 -08001590 if (count > UINT_MAX / 64)
1591 return -EINVAL;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001592 size = count * 64;
1593
1594 names_ofs = (2 + 3 * count) * sizeof(data[0]);
1595 alloc:
1596 if (size >= MAX_FILE_NOTE_SIZE) /* paranoia check */
Dan Aloni72023652013-09-30 13:45:02 -07001597 return -EINVAL;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001598 size = round_up(size, PAGE_SIZE);
Alexey Dobriyan1fbede62020-01-30 22:17:10 -08001599 /*
1600 * "size" can be 0 here legitimately.
1601 * Let it ENOMEM and omit NT_FILE section which will be empty anyway.
1602 */
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001603 data = kvmalloc(size, GFP_KERNEL);
1604 if (ZERO_OR_NULL_PTR(data))
Dan Aloni72023652013-09-30 13:45:02 -07001605 return -ENOMEM;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001606
1607 start_end_ofs = data + 2;
1608 name_base = name_curpos = ((char *)data) + names_ofs;
1609 remaining = size - names_ofs;
1610 count = 0;
Alexey Dobriyan03c6d722020-01-30 22:16:58 -08001611 for (vma = mm->mmap; vma != NULL; vma = vma->vm_next) {
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001612 struct file *file;
1613 const char *filename;
1614
1615 file = vma->vm_file;
1616 if (!file)
1617 continue;
Miklos Szeredi9bf39ab2015-06-19 10:29:13 +02001618 filename = file_path(file, name_curpos, remaining);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001619 if (IS_ERR(filename)) {
1620 if (PTR_ERR(filename) == -ENAMETOOLONG) {
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001621 kvfree(data);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001622 size = size * 5 / 4;
1623 goto alloc;
1624 }
1625 continue;
1626 }
1627
Miklos Szeredi9bf39ab2015-06-19 10:29:13 +02001628 /* file_path() fills at the end, move name down */
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001629 /* n = strlen(filename) + 1: */
1630 n = (name_curpos + remaining) - filename;
1631 remaining = filename - name_curpos;
1632 memmove(name_curpos, filename, n);
1633 name_curpos += n;
1634
1635 *start_end_ofs++ = vma->vm_start;
1636 *start_end_ofs++ = vma->vm_end;
1637 *start_end_ofs++ = vma->vm_pgoff;
1638 count++;
1639 }
1640
1641 /* Now we know exact count of files, can store it */
1642 data[0] = count;
1643 data[1] = PAGE_SIZE;
1644 /*
Alexey Dobriyan03c6d722020-01-30 22:16:58 -08001645 * Count usually is less than mm->map_count,
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001646 * we need to move filenames down.
1647 */
Alexey Dobriyan03c6d722020-01-30 22:16:58 -08001648 n = mm->map_count - count;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001649 if (n != 0) {
1650 unsigned shift_bytes = n * 3 * sizeof(data[0]);
1651 memmove(name_base - shift_bytes, name_base,
1652 name_curpos - name_base);
1653 name_curpos -= shift_bytes;
1654 }
1655
1656 size = name_curpos - (char *)data;
1657 fill_note(note, "CORE", NT_FILE, size, data);
Dan Aloni72023652013-09-30 13:45:02 -07001658 return 0;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001659}
1660
Roland McGrath4206d3a2008-01-30 13:31:45 +01001661#ifdef CORE_DUMP_USE_REGSET
1662#include <linux/regset.h>
1663
1664struct elf_thread_core_info {
1665 struct elf_thread_core_info *next;
1666 struct task_struct *task;
1667 struct elf_prstatus prstatus;
1668 struct memelfnote notes[0];
1669};
1670
1671struct elf_note_info {
1672 struct elf_thread_core_info *thread;
1673 struct memelfnote psinfo;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001674 struct memelfnote signote;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001675 struct memelfnote auxv;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001676 struct memelfnote files;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001677 user_siginfo_t csigdata;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001678 size_t size;
1679 int thread_notes;
1680};
1681
Roland McGrathd31472b2008-03-04 14:28:30 -08001682/*
1683 * When a regset has a writeback hook, we call it on each thread before
1684 * dumping user memory. On register window machines, this makes sure the
1685 * user memory backing the register data is up to date before we read it.
1686 */
1687static void do_thread_regset_writeback(struct task_struct *task,
1688 const struct user_regset *regset)
1689{
1690 if (regset->writeback)
1691 regset->writeback(task, regset, 1);
1692}
1693
H. J. Lu0953f65d2012-02-14 13:34:52 -08001694#ifndef PRSTATUS_SIZE
Dmitry Safonov90954e72016-09-05 16:33:06 +03001695#define PRSTATUS_SIZE(S, R) sizeof(S)
H. J. Lu0953f65d2012-02-14 13:34:52 -08001696#endif
1697
1698#ifndef SET_PR_FPVALID
Dmitry Safonov90954e72016-09-05 16:33:06 +03001699#define SET_PR_FPVALID(S, V, R) ((S)->pr_fpvalid = (V))
H. J. Lu0953f65d2012-02-14 13:34:52 -08001700#endif
1701
Roland McGrath4206d3a2008-01-30 13:31:45 +01001702static int fill_thread_core_info(struct elf_thread_core_info *t,
1703 const struct user_regset_view *view,
1704 long signr, size_t *total)
1705{
1706 unsigned int i;
Dave Martin27e64b42017-10-31 15:50:53 +00001707 unsigned int regset0_size = regset_size(t->task, &view->regsets[0]);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001708
1709 /*
1710 * NT_PRSTATUS is the one special case, because the regset data
1711 * goes into the pr_reg field inside the note contents, rather
1712 * than being the whole note contents. We fill the reset in here.
1713 * We assume that regset 0 is NT_PRSTATUS.
1714 */
1715 fill_prstatus(&t->prstatus, t->task, signr);
Dave Martin27e64b42017-10-31 15:50:53 +00001716 (void) view->regsets[0].get(t->task, &view->regsets[0], 0, regset0_size,
Dmitry Safonov90954e72016-09-05 16:33:06 +03001717 &t->prstatus.pr_reg, NULL);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001718
1719 fill_note(&t->notes[0], "CORE", NT_PRSTATUS,
Dave Martin27e64b42017-10-31 15:50:53 +00001720 PRSTATUS_SIZE(t->prstatus, regset0_size), &t->prstatus);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001721 *total += notesize(&t->notes[0]);
1722
Roland McGrathd31472b2008-03-04 14:28:30 -08001723 do_thread_regset_writeback(t->task, &view->regsets[0]);
1724
Roland McGrath4206d3a2008-01-30 13:31:45 +01001725 /*
1726 * Each other regset might generate a note too. For each regset
1727 * that has no core_note_type or is inactive, we leave t->notes[i]
1728 * all zero and we'll know to skip writing it later.
1729 */
1730 for (i = 1; i < view->n; ++i) {
1731 const struct user_regset *regset = &view->regsets[i];
Roland McGrathd31472b2008-03-04 14:28:30 -08001732 do_thread_regset_writeback(t->task, regset);
H. Peter Anvinc8e25252012-03-02 10:43:48 -08001733 if (regset->core_note_type && regset->get &&
Maciej W. Rozycki2f819db2018-05-15 23:32:45 +01001734 (!regset->active || regset->active(t->task, regset) > 0)) {
Roland McGrath4206d3a2008-01-30 13:31:45 +01001735 int ret;
Dave Martin27e64b42017-10-31 15:50:53 +00001736 size_t size = regset_size(t->task, regset);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001737 void *data = kmalloc(size, GFP_KERNEL);
1738 if (unlikely(!data))
1739 return 0;
1740 ret = regset->get(t->task, regset,
1741 0, size, data, NULL);
1742 if (unlikely(ret))
1743 kfree(data);
1744 else {
1745 if (regset->core_note_type != NT_PRFPREG)
1746 fill_note(&t->notes[i], "LINUX",
1747 regset->core_note_type,
1748 size, data);
1749 else {
Dmitry Safonov90954e72016-09-05 16:33:06 +03001750 SET_PR_FPVALID(&t->prstatus,
Dave Martin27e64b42017-10-31 15:50:53 +00001751 1, regset0_size);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001752 fill_note(&t->notes[i], "CORE",
1753 NT_PRFPREG, size, data);
1754 }
1755 *total += notesize(&t->notes[i]);
1756 }
1757 }
1758 }
1759
1760 return 1;
1761}
1762
1763static int fill_note_info(struct elfhdr *elf, int phdrs,
1764 struct elf_note_info *info,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02001765 const kernel_siginfo_t *siginfo, struct pt_regs *regs)
Roland McGrath4206d3a2008-01-30 13:31:45 +01001766{
1767 struct task_struct *dump_task = current;
1768 const struct user_regset_view *view = task_user_regset_view(dump_task);
1769 struct elf_thread_core_info *t;
1770 struct elf_prpsinfo *psinfo;
Oleg Nesterov83914442008-07-25 01:47:45 -07001771 struct core_thread *ct;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001772 unsigned int i;
1773
1774 info->size = 0;
1775 info->thread = NULL;
1776
1777 psinfo = kmalloc(sizeof(*psinfo), GFP_KERNEL);
Alan Cox6899e922012-12-17 16:02:09 -08001778 if (psinfo == NULL) {
1779 info->psinfo.data = NULL; /* So we don't free this wrongly */
Roland McGrath4206d3a2008-01-30 13:31:45 +01001780 return 0;
Alan Cox6899e922012-12-17 16:02:09 -08001781 }
Roland McGrath4206d3a2008-01-30 13:31:45 +01001782
Amerigo Wange2dbe122009-07-01 01:06:26 -04001783 fill_note(&info->psinfo, "CORE", NT_PRPSINFO, sizeof(*psinfo), psinfo);
1784
Roland McGrath4206d3a2008-01-30 13:31:45 +01001785 /*
1786 * Figure out how many notes we're going to need for each thread.
1787 */
1788 info->thread_notes = 0;
1789 for (i = 0; i < view->n; ++i)
1790 if (view->regsets[i].core_note_type != 0)
1791 ++info->thread_notes;
1792
1793 /*
1794 * Sanity check. We rely on regset 0 being in NT_PRSTATUS,
1795 * since it is our one special case.
1796 */
1797 if (unlikely(info->thread_notes == 0) ||
1798 unlikely(view->regsets[0].core_note_type != NT_PRSTATUS)) {
1799 WARN_ON(1);
1800 return 0;
1801 }
1802
1803 /*
1804 * Initialize the ELF file header.
1805 */
1806 fill_elf_header(elf, phdrs,
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001807 view->e_machine, view->e_flags);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001808
1809 /*
1810 * Allocate a structure for each thread.
1811 */
Oleg Nesterov83914442008-07-25 01:47:45 -07001812 for (ct = &dump_task->mm->core_state->dumper; ct; ct = ct->next) {
1813 t = kzalloc(offsetof(struct elf_thread_core_info,
1814 notes[info->thread_notes]),
1815 GFP_KERNEL);
1816 if (unlikely(!t))
1817 return 0;
Oleg Nesterov24d52882008-07-25 01:47:40 -07001818
Oleg Nesterov83914442008-07-25 01:47:45 -07001819 t->task = ct->task;
1820 if (ct->task == dump_task || !info->thread) {
1821 t->next = info->thread;
1822 info->thread = t;
1823 } else {
1824 /*
1825 * Make sure to keep the original task at
1826 * the head of the list.
1827 */
1828 t->next = info->thread->next;
1829 info->thread->next = t;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001830 }
Oleg Nesterov83914442008-07-25 01:47:45 -07001831 }
Roland McGrath4206d3a2008-01-30 13:31:45 +01001832
1833 /*
1834 * Now fill in each thread's information.
1835 */
1836 for (t = info->thread; t != NULL; t = t->next)
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07001837 if (!fill_thread_core_info(t, view, siginfo->si_signo, &info->size))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001838 return 0;
1839
1840 /*
1841 * Fill in the two process-wide notes.
1842 */
1843 fill_psinfo(psinfo, dump_task->group_leader, dump_task->mm);
1844 info->size += notesize(&info->psinfo);
1845
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001846 fill_siginfo_note(&info->signote, &info->csigdata, siginfo);
1847 info->size += notesize(&info->signote);
1848
Roland McGrath4206d3a2008-01-30 13:31:45 +01001849 fill_auxv_note(&info->auxv, current->mm);
1850 info->size += notesize(&info->auxv);
1851
Dan Aloni72023652013-09-30 13:45:02 -07001852 if (fill_files_note(&info->files) == 0)
1853 info->size += notesize(&info->files);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001854
Roland McGrath4206d3a2008-01-30 13:31:45 +01001855 return 1;
1856}
1857
1858static size_t get_note_info_size(struct elf_note_info *info)
1859{
1860 return info->size;
1861}
1862
1863/*
1864 * Write all the notes for each thread. When writing the first thread, the
1865 * process-wide notes are interleaved after the first thread-specific note.
1866 */
1867static int write_note_info(struct elf_note_info *info,
Al Viroecc8c772013-10-05 15:32:35 -04001868 struct coredump_params *cprm)
Roland McGrath4206d3a2008-01-30 13:31:45 +01001869{
Fabian Frederickb219e252014-06-04 16:12:14 -07001870 bool first = true;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001871 struct elf_thread_core_info *t = info->thread;
1872
1873 do {
1874 int i;
1875
Al Viroecc8c772013-10-05 15:32:35 -04001876 if (!writenote(&t->notes[0], cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001877 return 0;
1878
Al Viroecc8c772013-10-05 15:32:35 -04001879 if (first && !writenote(&info->psinfo, cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001880 return 0;
Al Viroecc8c772013-10-05 15:32:35 -04001881 if (first && !writenote(&info->signote, cprm))
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001882 return 0;
Al Viroecc8c772013-10-05 15:32:35 -04001883 if (first && !writenote(&info->auxv, cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001884 return 0;
Dan Aloni72023652013-09-30 13:45:02 -07001885 if (first && info->files.data &&
Al Viroecc8c772013-10-05 15:32:35 -04001886 !writenote(&info->files, cprm))
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001887 return 0;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001888
1889 for (i = 1; i < info->thread_notes; ++i)
1890 if (t->notes[i].data &&
Al Viroecc8c772013-10-05 15:32:35 -04001891 !writenote(&t->notes[i], cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001892 return 0;
1893
Fabian Frederickb219e252014-06-04 16:12:14 -07001894 first = false;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001895 t = t->next;
1896 } while (t);
1897
1898 return 1;
1899}
1900
1901static void free_note_info(struct elf_note_info *info)
1902{
1903 struct elf_thread_core_info *threads = info->thread;
1904 while (threads) {
1905 unsigned int i;
1906 struct elf_thread_core_info *t = threads;
1907 threads = t->next;
1908 WARN_ON(t->notes[0].data && t->notes[0].data != &t->prstatus);
1909 for (i = 1; i < info->thread_notes; ++i)
1910 kfree(t->notes[i].data);
1911 kfree(t);
1912 }
1913 kfree(info->psinfo.data);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001914 kvfree(info->files.data);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001915}
1916
1917#else
1918
Linus Torvalds1da177e2005-04-16 15:20:36 -07001919/* Here is the structure in which status of each thread is captured. */
1920struct elf_thread_status
1921{
1922 struct list_head list;
1923 struct elf_prstatus prstatus; /* NT_PRSTATUS */
1924 elf_fpregset_t fpu; /* NT_PRFPREG */
1925 struct task_struct *thread;
1926#ifdef ELF_CORE_COPY_XFPREGS
Mark Nelson5b20cd82007-10-16 23:25:39 -07001927 elf_fpxregset_t xfpu; /* ELF_CORE_XFPREG_TYPE */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001928#endif
1929 struct memelfnote notes[3];
1930 int num_notes;
1931};
1932
1933/*
1934 * In order to add the specific thread information for the elf file format,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001935 * we need to keep a linked list of every threads pr_status and then create
1936 * a single section for them in the final core file.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001937 */
1938static int elf_dump_thread_status(long signr, struct elf_thread_status *t)
1939{
1940 int sz = 0;
1941 struct task_struct *p = t->thread;
1942 t->num_notes = 0;
1943
1944 fill_prstatus(&t->prstatus, p, signr);
1945 elf_core_copy_task_regs(p, &t->prstatus.pr_reg);
1946
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001947 fill_note(&t->notes[0], "CORE", NT_PRSTATUS, sizeof(t->prstatus),
1948 &(t->prstatus));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001949 t->num_notes++;
1950 sz += notesize(&t->notes[0]);
1951
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001952 if ((t->prstatus.pr_fpvalid = elf_core_copy_task_fpregs(p, NULL,
1953 &t->fpu))) {
1954 fill_note(&t->notes[1], "CORE", NT_PRFPREG, sizeof(t->fpu),
1955 &(t->fpu));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001956 t->num_notes++;
1957 sz += notesize(&t->notes[1]);
1958 }
1959
1960#ifdef ELF_CORE_COPY_XFPREGS
1961 if (elf_core_copy_task_xfpregs(p, &t->xfpu)) {
Mark Nelson5b20cd82007-10-16 23:25:39 -07001962 fill_note(&t->notes[2], "LINUX", ELF_CORE_XFPREG_TYPE,
1963 sizeof(t->xfpu), &t->xfpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001964 t->num_notes++;
1965 sz += notesize(&t->notes[2]);
1966 }
1967#endif
1968 return sz;
1969}
1970
Roland McGrath3aba4812008-01-30 13:31:44 +01001971struct elf_note_info {
1972 struct memelfnote *notes;
Dan Aloni72023652013-09-30 13:45:02 -07001973 struct memelfnote *notes_files;
Roland McGrath3aba4812008-01-30 13:31:44 +01001974 struct elf_prstatus *prstatus; /* NT_PRSTATUS */
1975 struct elf_prpsinfo *psinfo; /* NT_PRPSINFO */
1976 struct list_head thread_list;
1977 elf_fpregset_t *fpu;
1978#ifdef ELF_CORE_COPY_XFPREGS
1979 elf_fpxregset_t *xfpu;
1980#endif
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001981 user_siginfo_t csigdata;
Roland McGrath3aba4812008-01-30 13:31:44 +01001982 int thread_status_size;
1983 int numnote;
1984};
1985
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001986static int elf_note_info_init(struct elf_note_info *info)
Roland McGrath3aba4812008-01-30 13:31:44 +01001987{
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001988 memset(info, 0, sizeof(*info));
Roland McGrath3aba4812008-01-30 13:31:44 +01001989 INIT_LIST_HEAD(&info->thread_list);
1990
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001991 /* Allocate space for ELF notes */
Kees Cook6da2ec52018-06-12 13:55:00 -07001992 info->notes = kmalloc_array(8, sizeof(struct memelfnote), GFP_KERNEL);
Roland McGrath3aba4812008-01-30 13:31:44 +01001993 if (!info->notes)
1994 return 0;
1995 info->psinfo = kmalloc(sizeof(*info->psinfo), GFP_KERNEL);
1996 if (!info->psinfo)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10001997 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01001998 info->prstatus = kmalloc(sizeof(*info->prstatus), GFP_KERNEL);
1999 if (!info->prstatus)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002000 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002001 info->fpu = kmalloc(sizeof(*info->fpu), GFP_KERNEL);
2002 if (!info->fpu)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002003 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002004#ifdef ELF_CORE_COPY_XFPREGS
2005 info->xfpu = kmalloc(sizeof(*info->xfpu), GFP_KERNEL);
2006 if (!info->xfpu)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002007 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002008#endif
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002009 return 1;
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002010}
Roland McGrath3aba4812008-01-30 13:31:44 +01002011
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002012static int fill_note_info(struct elfhdr *elf, int phdrs,
2013 struct elf_note_info *info,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02002014 const kernel_siginfo_t *siginfo, struct pt_regs *regs)
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002015{
Al Viroafabada2013-10-14 07:39:56 -04002016 struct core_thread *ct;
2017 struct elf_thread_status *ets;
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002018
2019 if (!elf_note_info_init(info))
2020 return 0;
2021
Al Viroafabada2013-10-14 07:39:56 -04002022 for (ct = current->mm->core_state->dumper.next;
2023 ct; ct = ct->next) {
2024 ets = kzalloc(sizeof(*ets), GFP_KERNEL);
2025 if (!ets)
2026 return 0;
Oleg Nesterov24d52882008-07-25 01:47:40 -07002027
Al Viroafabada2013-10-14 07:39:56 -04002028 ets->thread = ct->task;
2029 list_add(&ets->list, &info->thread_list);
2030 }
Oleg Nesterov83914442008-07-25 01:47:45 -07002031
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002032 list_for_each_entry(ets, &info->thread_list, list) {
Al Viroafabada2013-10-14 07:39:56 -04002033 int sz;
Oleg Nesterov83914442008-07-25 01:47:45 -07002034
Al Viroafabada2013-10-14 07:39:56 -04002035 sz = elf_dump_thread_status(siginfo->si_signo, ets);
2036 info->thread_status_size += sz;
Roland McGrath3aba4812008-01-30 13:31:44 +01002037 }
2038 /* now collect the dump for the current */
2039 memset(info->prstatus, 0, sizeof(*info->prstatus));
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07002040 fill_prstatus(info->prstatus, current, siginfo->si_signo);
Roland McGrath3aba4812008-01-30 13:31:44 +01002041 elf_core_copy_regs(&info->prstatus->pr_reg, regs);
2042
2043 /* Set up header */
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08002044 fill_elf_header(elf, phdrs, ELF_ARCH, ELF_CORE_EFLAGS);
Roland McGrath3aba4812008-01-30 13:31:44 +01002045
2046 /*
2047 * Set up the notes in similar form to SVR4 core dumps made
2048 * with info from their /proc.
2049 */
2050
2051 fill_note(info->notes + 0, "CORE", NT_PRSTATUS,
2052 sizeof(*info->prstatus), info->prstatus);
2053 fill_psinfo(info->psinfo, current->group_leader, current->mm);
2054 fill_note(info->notes + 1, "CORE", NT_PRPSINFO,
2055 sizeof(*info->psinfo), info->psinfo);
2056
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07002057 fill_siginfo_note(info->notes + 2, &info->csigdata, siginfo);
2058 fill_auxv_note(info->notes + 3, current->mm);
Dan Aloni72023652013-09-30 13:45:02 -07002059 info->numnote = 4;
Roland McGrath3aba4812008-01-30 13:31:44 +01002060
Dan Aloni72023652013-09-30 13:45:02 -07002061 if (fill_files_note(info->notes + info->numnote) == 0) {
2062 info->notes_files = info->notes + info->numnote;
2063 info->numnote++;
2064 }
Roland McGrath3aba4812008-01-30 13:31:44 +01002065
2066 /* Try to dump the FPU. */
2067 info->prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, regs,
2068 info->fpu);
2069 if (info->prstatus->pr_fpvalid)
2070 fill_note(info->notes + info->numnote++,
2071 "CORE", NT_PRFPREG, sizeof(*info->fpu), info->fpu);
2072#ifdef ELF_CORE_COPY_XFPREGS
2073 if (elf_core_copy_task_xfpregs(current, info->xfpu))
2074 fill_note(info->notes + info->numnote++,
2075 "LINUX", ELF_CORE_XFPREG_TYPE,
2076 sizeof(*info->xfpu), info->xfpu);
2077#endif
2078
2079 return 1;
Roland McGrath3aba4812008-01-30 13:31:44 +01002080}
2081
2082static size_t get_note_info_size(struct elf_note_info *info)
2083{
2084 int sz = 0;
2085 int i;
2086
2087 for (i = 0; i < info->numnote; i++)
2088 sz += notesize(info->notes + i);
2089
2090 sz += info->thread_status_size;
2091
2092 return sz;
2093}
2094
2095static int write_note_info(struct elf_note_info *info,
Al Viroecc8c772013-10-05 15:32:35 -04002096 struct coredump_params *cprm)
Roland McGrath3aba4812008-01-30 13:31:44 +01002097{
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002098 struct elf_thread_status *ets;
Roland McGrath3aba4812008-01-30 13:31:44 +01002099 int i;
Roland McGrath3aba4812008-01-30 13:31:44 +01002100
2101 for (i = 0; i < info->numnote; i++)
Al Viroecc8c772013-10-05 15:32:35 -04002102 if (!writenote(info->notes + i, cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002103 return 0;
2104
2105 /* write out the thread status notes section */
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002106 list_for_each_entry(ets, &info->thread_list, list) {
2107 for (i = 0; i < ets->num_notes; i++)
2108 if (!writenote(&ets->notes[i], cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002109 return 0;
2110 }
2111
2112 return 1;
2113}
2114
2115static void free_note_info(struct elf_note_info *info)
2116{
2117 while (!list_empty(&info->thread_list)) {
2118 struct list_head *tmp = info->thread_list.next;
2119 list_del(tmp);
2120 kfree(list_entry(tmp, struct elf_thread_status, list));
2121 }
2122
Dan Aloni72023652013-09-30 13:45:02 -07002123 /* Free data possibly allocated by fill_files_note(): */
2124 if (info->notes_files)
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002125 kvfree(info->notes_files->data);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07002126
Roland McGrath3aba4812008-01-30 13:31:44 +01002127 kfree(info->prstatus);
2128 kfree(info->psinfo);
2129 kfree(info->notes);
2130 kfree(info->fpu);
2131#ifdef ELF_CORE_COPY_XFPREGS
2132 kfree(info->xfpu);
2133#endif
2134}
2135
Roland McGrath4206d3a2008-01-30 13:31:45 +01002136#endif
2137
Roland McGrathf47aef52007-01-26 00:56:49 -08002138static struct vm_area_struct *first_vma(struct task_struct *tsk,
2139 struct vm_area_struct *gate_vma)
2140{
2141 struct vm_area_struct *ret = tsk->mm->mmap;
2142
2143 if (ret)
2144 return ret;
2145 return gate_vma;
2146}
2147/*
2148 * Helper function for iterating across a vma list. It ensures that the caller
2149 * will visit `gate_vma' prior to terminating the search.
2150 */
2151static struct vm_area_struct *next_vma(struct vm_area_struct *this_vma,
2152 struct vm_area_struct *gate_vma)
2153{
2154 struct vm_area_struct *ret;
2155
2156 ret = this_vma->vm_next;
2157 if (ret)
2158 return ret;
2159 if (this_vma == gate_vma)
2160 return NULL;
2161 return gate_vma;
2162}
2163
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002164static void fill_extnum_info(struct elfhdr *elf, struct elf_shdr *shdr4extnum,
2165 elf_addr_t e_shoff, int segs)
2166{
2167 elf->e_shoff = e_shoff;
2168 elf->e_shentsize = sizeof(*shdr4extnum);
2169 elf->e_shnum = 1;
2170 elf->e_shstrndx = SHN_UNDEF;
2171
2172 memset(shdr4extnum, 0, sizeof(*shdr4extnum));
2173
2174 shdr4extnum->sh_type = SHT_NULL;
2175 shdr4extnum->sh_size = elf->e_shnum;
2176 shdr4extnum->sh_link = elf->e_shstrndx;
2177 shdr4extnum->sh_info = segs;
2178}
2179
Linus Torvalds1da177e2005-04-16 15:20:36 -07002180/*
2181 * Actual dumper
2182 *
2183 * This is a two-pass process; first we find the offsets of the bits,
2184 * and then they are actually written out. If we run out of core limit
2185 * we just truncate.
2186 */
Masami Hiramatsuf6151df2009-12-17 15:27:16 -08002187static int elf_core_dump(struct coredump_params *cprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002188{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002189 int has_dumped = 0;
2190 mm_segment_t fs;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002191 int segs, i;
2192 size_t vma_data_size = 0;
Roland McGrathf47aef52007-01-26 00:56:49 -08002193 struct vm_area_struct *vma, *gate_vma;
Alexey Dobriyan225a3f52020-01-30 22:17:04 -08002194 struct elfhdr elf;
Al Virocdc3d562013-10-05 22:24:29 -04002195 loff_t offset = 0, dataoff;
Dan Aloni72023652013-09-30 13:45:02 -07002196 struct elf_note_info info = { };
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002197 struct elf_phdr *phdr4note = NULL;
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002198 struct elf_shdr *shdr4extnum = NULL;
2199 Elf_Half e_phnum;
2200 elf_addr_t e_shoff;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002201 elf_addr_t *vma_filesz = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002202
2203 /*
2204 * We no longer stop all VM operations.
2205 *
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002206 * This is because those proceses that could possibly change map_count
2207 * or the mmap / vma pages are now blocked in do_exit on current
2208 * finishing this core dump.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002209 *
2210 * Only ptrace can touch these memory addresses, but it doesn't change
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002211 * the map_count or the pages allocated. So no possibility of crashing
Linus Torvalds1da177e2005-04-16 15:20:36 -07002212 * exists while dumping the mm->vm_next areas to the core file.
2213 */
2214
KAMEZAWA Hiroyuki341c87b2009-06-30 11:41:23 -07002215 /*
2216 * The number of segs are recored into ELF header as 16bit value.
2217 * Please check DEFAULT_MAX_MAP_COUNT definition when you modify here.
2218 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002219 segs = current->mm->map_count;
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002220 segs += elf_core_extra_phdrs();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002221
Stephen Wilson31db58b2011-03-13 15:49:15 -04002222 gate_vma = get_gate_vma(current->mm);
Roland McGrathf47aef52007-01-26 00:56:49 -08002223 if (gate_vma != NULL)
2224 segs++;
2225
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002226 /* for notes section */
2227 segs++;
2228
2229 /* If segs > PN_XNUM(0xffff), then e_phnum overflows. To avoid
2230 * this, kernel supports extended numbering. Have a look at
2231 * include/linux/elf.h for further information. */
2232 e_phnum = segs > PN_XNUM ? PN_XNUM : segs;
2233
Roland McGrath3aba4812008-01-30 13:31:44 +01002234 /*
2235 * Collect all the non-memory information about the process for the
2236 * notes. This also sets up the file header.
2237 */
Alexey Dobriyan225a3f52020-01-30 22:17:04 -08002238 if (!fill_note_info(&elf, e_phnum, &info, cprm->siginfo, cprm->regs))
Roland McGrath3aba4812008-01-30 13:31:44 +01002239 goto cleanup;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002240
2241 has_dumped = 1;
Oleg Nesterov079148b2013-04-30 15:28:16 -07002242
Linus Torvalds1da177e2005-04-16 15:20:36 -07002243 fs = get_fs();
2244 set_fs(KERNEL_DS);
2245
Alexey Dobriyan225a3f52020-01-30 22:17:04 -08002246 offset += sizeof(elf); /* Elf header */
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002247 offset += segs * sizeof(struct elf_phdr); /* Program headers */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002248
2249 /* Write notes phdr entry */
2250 {
Roland McGrath3aba4812008-01-30 13:31:44 +01002251 size_t sz = get_note_info_size(&info);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002252
Michael Ellermane5501492007-09-19 14:38:12 +10002253 sz += elf_coredump_extra_notes_size();
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +01002254
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002255 phdr4note = kmalloc(sizeof(*phdr4note), GFP_KERNEL);
2256 if (!phdr4note)
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -08002257 goto end_coredump;
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002258
2259 fill_elf_note_phdr(phdr4note, sz, offset);
2260 offset += sz;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002261 }
2262
Linus Torvalds1da177e2005-04-16 15:20:36 -07002263 dataoff = offset = roundup(offset, ELF_EXEC_PAGESIZE);
2264
Alexey Dobriyan1fbede62020-01-30 22:17:10 -08002265 /*
2266 * Zero vma process will get ZERO_SIZE_PTR here.
2267 * Let coredump continue for register state at least.
2268 */
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002269 vma_filesz = kvmalloc(array_size(sizeof(*vma_filesz), (segs - 1)),
2270 GFP_KERNEL);
Alexey Dobriyan1fbede62020-01-30 22:17:10 -08002271 if (!vma_filesz)
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002272 goto end_coredump;
2273
2274 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
2275 vma = next_vma(vma, gate_vma)) {
2276 unsigned long dump_size;
2277
2278 dump_size = vma_dump_size(vma, cprm->mm_flags);
2279 vma_filesz[i++] = dump_size;
2280 vma_data_size += dump_size;
2281 }
2282
2283 offset += vma_data_size;
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002284 offset += elf_core_extra_data_size();
2285 e_shoff = offset;
2286
2287 if (e_phnum == PN_XNUM) {
2288 shdr4extnum = kmalloc(sizeof(*shdr4extnum), GFP_KERNEL);
2289 if (!shdr4extnum)
2290 goto end_coredump;
Alexey Dobriyan225a3f52020-01-30 22:17:04 -08002291 fill_extnum_info(&elf, shdr4extnum, e_shoff, segs);
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002292 }
2293
2294 offset = dataoff;
2295
Alexey Dobriyan225a3f52020-01-30 22:17:04 -08002296 if (!dump_emit(cprm, &elf, sizeof(elf)))
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002297 goto end_coredump;
2298
Al Viroecc8c772013-10-05 15:32:35 -04002299 if (!dump_emit(cprm, phdr4note, sizeof(*phdr4note)))
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002300 goto end_coredump;
2301
Linus Torvalds1da177e2005-04-16 15:20:36 -07002302 /* Write program headers for segments dump */
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002303 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
Roland McGrathf47aef52007-01-26 00:56:49 -08002304 vma = next_vma(vma, gate_vma)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002305 struct elf_phdr phdr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002306
2307 phdr.p_type = PT_LOAD;
2308 phdr.p_offset = offset;
2309 phdr.p_vaddr = vma->vm_start;
2310 phdr.p_paddr = 0;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002311 phdr.p_filesz = vma_filesz[i++];
Roland McGrath82df3972007-10-16 23:27:02 -07002312 phdr.p_memsz = vma->vm_end - vma->vm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002313 offset += phdr.p_filesz;
2314 phdr.p_flags = vma->vm_flags & VM_READ ? PF_R : 0;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002315 if (vma->vm_flags & VM_WRITE)
2316 phdr.p_flags |= PF_W;
2317 if (vma->vm_flags & VM_EXEC)
2318 phdr.p_flags |= PF_X;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002319 phdr.p_align = ELF_EXEC_PAGESIZE;
2320
Al Viroecc8c772013-10-05 15:32:35 -04002321 if (!dump_emit(cprm, &phdr, sizeof(phdr)))
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -08002322 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002323 }
2324
Al Viro506f21c2013-10-05 17:22:57 -04002325 if (!elf_core_write_extra_phdrs(cprm, offset))
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002326 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002327
2328 /* write out the notes section */
Al Viroecc8c772013-10-05 15:32:35 -04002329 if (!write_note_info(&info, cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002330 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002331
Al Virocdc3d562013-10-05 22:24:29 -04002332 if (elf_coredump_extra_notes_write(cprm))
Michael Ellermane5501492007-09-19 14:38:12 +10002333 goto end_coredump;
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +01002334
Andi Kleend025c9d2006-09-30 23:29:28 -07002335 /* Align to page */
Mateusz Guzik1607f092016-06-05 23:14:14 +02002336 if (!dump_skip(cprm, dataoff - cprm->pos))
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002337 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002338
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002339 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
Roland McGrathf47aef52007-01-26 00:56:49 -08002340 vma = next_vma(vma, gate_vma)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002341 unsigned long addr;
Roland McGrath82df3972007-10-16 23:27:02 -07002342 unsigned long end;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002343
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002344 end = vma->vm_start + vma_filesz[i++];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002345
Roland McGrath82df3972007-10-16 23:27:02 -07002346 for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002347 struct page *page;
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002348 int stop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002349
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002350 page = get_dump_page(addr);
2351 if (page) {
2352 void *kaddr = kmap(page);
Al Viro13046ec2013-10-05 18:08:47 -04002353 stop = !dump_emit(cprm, kaddr, PAGE_SIZE);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002354 kunmap(page);
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03002355 put_page(page);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002356 } else
Al Viro9b56d542013-10-08 09:26:08 -04002357 stop = !dump_skip(cprm, PAGE_SIZE);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002358 if (stop)
2359 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002360 }
2361 }
Dave Kleikamp4d22c752017-01-11 13:25:00 -06002362 dump_truncate(cprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002363
Al Viroaa3e7ea2013-10-05 17:50:15 -04002364 if (!elf_core_write_extra_data(cprm))
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002365 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002366
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002367 if (e_phnum == PN_XNUM) {
Al Viro13046ec2013-10-05 18:08:47 -04002368 if (!dump_emit(cprm, shdr4extnum, sizeof(*shdr4extnum)))
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002369 goto end_coredump;
2370 }
2371
Linus Torvalds1da177e2005-04-16 15:20:36 -07002372end_coredump:
2373 set_fs(fs);
2374
2375cleanup:
Roland McGrath3aba4812008-01-30 13:31:44 +01002376 free_note_info(&info);
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002377 kfree(shdr4extnum);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002378 kvfree(vma_filesz);
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002379 kfree(phdr4note);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002380 return has_dumped;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002381}
2382
Christoph Hellwig698ba7b2009-12-15 16:47:37 -08002383#endif /* CONFIG_ELF_CORE */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002384
2385static int __init init_elf_binfmt(void)
2386{
Al Viro8fc3dc52012-03-17 03:05:16 -04002387 register_binfmt(&elf_format);
2388 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002389}
2390
2391static void __exit exit_elf_binfmt(void)
2392{
2393 /* Remove the COFF and ELF loaders. */
2394 unregister_binfmt(&elf_format);
2395}
2396
2397core_initcall(init_elf_binfmt);
2398module_exit(exit_elf_binfmt);
2399MODULE_LICENSE("GPL");