blob: 43eb8a78e84d84f14ff93584aeae8306ff602dc9 [file] [log] [blame]
Thomas Gleixner09c434b2019-05-19 13:08:20 +01001// SPDX-License-Identifier: GPL-2.0-only
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/*
3 * linux/fs/binfmt_elf.c
4 *
5 * These are the functions used to load ELF format executables as used
6 * on SVr4 machines. Information on the format may be found in the book
7 * "UNIX SYSTEM V RELEASE 4 Programmers Guide: Ansi C and Programming Support
8 * Tools".
9 *
10 * Copyright 1993, 1994: Eric Youngdale (ericy@cais.com).
11 */
12
13#include <linux/module.h>
14#include <linux/kernel.h>
15#include <linux/fs.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070016#include <linux/mm.h>
17#include <linux/mman.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070018#include <linux/errno.h>
19#include <linux/signal.h>
20#include <linux/binfmts.h>
21#include <linux/string.h>
22#include <linux/file.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070023#include <linux/slab.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070024#include <linux/personality.h>
25#include <linux/elfcore.h>
26#include <linux/init.h>
27#include <linux/highuid.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070028#include <linux/compiler.h>
29#include <linux/highmem.h>
30#include <linux/pagemap.h>
Denys Vlasenko2aa362c2012-10-04 17:15:36 -070031#include <linux/vmalloc.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070032#include <linux/security.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070033#include <linux/random.h>
Jesper Juhlf4e5cc22006-06-23 02:05:35 -070034#include <linux/elf.h>
Kees Cookd1fd8362015-04-14 15:48:07 -070035#include <linux/elf-randomize.h>
Alexey Dobriyan7e80d0d2007-05-08 00:28:59 -070036#include <linux/utsname.h>
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -080037#include <linux/coredump.h>
Frederic Weisbecker6fac4822012-11-13 14:20:55 +010038#include <linux/sched.h>
Ingo Molnarf7ccbae2017-02-08 18:51:30 +010039#include <linux/sched/coredump.h>
Ingo Molnar68db0cf2017-02-08 18:51:37 +010040#include <linux/sched/task_stack.h>
Ingo Molnar32ef5512017-02-05 11:48:36 +010041#include <linux/sched/cputime.h>
Ingo Molnar5b825c32017-02-02 17:54:15 +010042#include <linux/cred.h>
Ross Zwisler50378352015-10-05 16:33:36 -060043#include <linux/dax.h>
Linus Torvalds7c0f6ba2016-12-24 11:46:01 -080044#include <linux/uaccess.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070045#include <asm/param.h>
46#include <asm/page.h>
47
Denys Vlasenko2aa362c2012-10-04 17:15:36 -070048#ifndef user_long_t
49#define user_long_t long
50#endif
Denys Vlasenko49ae4d42012-10-04 17:15:35 -070051#ifndef user_siginfo_t
52#define user_siginfo_t siginfo_t
53#endif
54
Nicolas Pitre47552002017-08-16 16:05:13 -040055/* That's for binfmt_elf_fdpic to deal with */
56#ifndef elf_check_fdpic
57#define elf_check_fdpic(ex) false
58#endif
59
Al Viro71613c32012-10-20 22:00:48 -040060static int load_elf_binary(struct linux_binprm *bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -070061
Josh Triplett69369a72014-04-03 14:48:27 -070062#ifdef CONFIG_USELIB
63static int load_elf_library(struct file *);
64#else
65#define load_elf_library NULL
66#endif
67
Linus Torvalds1da177e2005-04-16 15:20:36 -070068/*
69 * If we don't support core dumping, then supply a NULL so we
70 * don't even try.
71 */
Christoph Hellwig698ba7b2009-12-15 16:47:37 -080072#ifdef CONFIG_ELF_CORE
Masami Hiramatsuf6151df2009-12-17 15:27:16 -080073static int elf_core_dump(struct coredump_params *cprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -070074#else
75#define elf_core_dump NULL
76#endif
77
78#if ELF_EXEC_PAGESIZE > PAGE_SIZE
Jesper Juhlf4e5cc22006-06-23 02:05:35 -070079#define ELF_MIN_ALIGN ELF_EXEC_PAGESIZE
Linus Torvalds1da177e2005-04-16 15:20:36 -070080#else
Jesper Juhlf4e5cc22006-06-23 02:05:35 -070081#define ELF_MIN_ALIGN PAGE_SIZE
Linus Torvalds1da177e2005-04-16 15:20:36 -070082#endif
83
84#ifndef ELF_CORE_EFLAGS
85#define ELF_CORE_EFLAGS 0
86#endif
87
88#define ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(ELF_MIN_ALIGN-1))
89#define ELF_PAGEOFFSET(_v) ((_v) & (ELF_MIN_ALIGN-1))
90#define ELF_PAGEALIGN(_v) (((_v) + ELF_MIN_ALIGN - 1) & ~(ELF_MIN_ALIGN - 1))
91
92static struct linux_binfmt elf_format = {
Mikael Petterssonf670d0e2011-01-12 17:00:02 -080093 .module = THIS_MODULE,
94 .load_binary = load_elf_binary,
95 .load_shlib = load_elf_library,
96 .core_dump = elf_core_dump,
97 .min_coredump = ELF_EXEC_PAGESIZE,
Linus Torvalds1da177e2005-04-16 15:20:36 -070098};
99
Andrew Mortond4e3cc32007-07-21 04:37:32 -0700100#define BAD_ADDR(x) ((unsigned long)(x) >= TASK_SIZE)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700101
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800102static int set_brk(unsigned long start, unsigned long end, int prot)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700103{
104 start = ELF_PAGEALIGN(start);
105 end = ELF_PAGEALIGN(end);
106 if (end > start) {
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800107 /*
108 * Map the last of the bss segment.
109 * If the header is requesting these pages to be
110 * executable, honour that (ppc32 needs this).
111 */
112 int error = vm_brk_flags(start, end - start,
113 prot & PROT_EXEC ? VM_EXEC : 0);
Linus Torvalds5d22fc22016-05-27 15:57:31 -0700114 if (error)
115 return error;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700116 }
117 current->mm->start_brk = current->mm->brk = end;
118 return 0;
119}
120
Linus Torvalds1da177e2005-04-16 15:20:36 -0700121/* We need to explicitly zero any fractional pages
122 after the data section (i.e. bss). This would
123 contain the junk from the file that should not
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700124 be in memory
125 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700126static int padzero(unsigned long elf_bss)
127{
128 unsigned long nbyte;
129
130 nbyte = ELF_PAGEOFFSET(elf_bss);
131 if (nbyte) {
132 nbyte = ELF_MIN_ALIGN - nbyte;
133 if (clear_user((void __user *) elf_bss, nbyte))
134 return -EFAULT;
135 }
136 return 0;
137}
138
Ohad Ben-Cohen09c6dd32008-02-03 18:05:15 +0200139/* Let's use some macros to make this stack manipulation a little clearer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700140#ifdef CONFIG_STACK_GROWSUP
141#define STACK_ADD(sp, items) ((elf_addr_t __user *)(sp) + (items))
142#define STACK_ROUND(sp, items) \
143 ((15 + (unsigned long) ((sp) + (items))) &~ 15UL)
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700144#define STACK_ALLOC(sp, len) ({ \
145 elf_addr_t __user *old_sp = (elf_addr_t __user *)sp; sp += len; \
146 old_sp; })
Linus Torvalds1da177e2005-04-16 15:20:36 -0700147#else
148#define STACK_ADD(sp, items) ((elf_addr_t __user *)(sp) - (items))
149#define STACK_ROUND(sp, items) \
150 (((unsigned long) (sp - items)) &~ 15UL)
151#define STACK_ALLOC(sp, len) ({ sp -= len ; sp; })
152#endif
153
Nathan Lynch483fad12008-07-22 04:48:46 +1000154#ifndef ELF_BASE_PLATFORM
155/*
156 * AT_BASE_PLATFORM indicates the "real" hardware/microarchitecture.
157 * If the arch defines ELF_BASE_PLATFORM (in asm/elf.h), the value
158 * will be copied to the user stack in the same manner as AT_PLATFORM.
159 */
160#define ELF_BASE_PLATFORM NULL
161#endif
162
Linus Torvalds1da177e2005-04-16 15:20:36 -0700163static int
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700164create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec,
Andi Kleend20894a2008-02-08 04:21:54 -0800165 unsigned long load_addr, unsigned long interp_load_addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700166{
167 unsigned long p = bprm->p;
168 int argc = bprm->argc;
169 int envc = bprm->envc;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700170 elf_addr_t __user *sp;
171 elf_addr_t __user *u_platform;
Nathan Lynch483fad12008-07-22 04:48:46 +1000172 elf_addr_t __user *u_base_platform;
Kees Cookf06295b2009-01-07 18:08:52 -0800173 elf_addr_t __user *u_rand_bytes;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700174 const char *k_platform = ELF_PLATFORM;
Nathan Lynch483fad12008-07-22 04:48:46 +1000175 const char *k_base_platform = ELF_BASE_PLATFORM;
Kees Cookf06295b2009-01-07 18:08:52 -0800176 unsigned char k_rand_bytes[16];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700177 int items;
178 elf_addr_t *elf_info;
179 int ei_index = 0;
David Howells86a264a2008-11-14 10:39:18 +1100180 const struct cred *cred = current_cred();
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700181 struct vm_area_struct *vma;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700182
183 /*
Franck Bui-Huud68c9d62007-10-16 23:30:24 -0700184 * In some cases (e.g. Hyper-Threading), we want to avoid L1
185 * evictions by the processes running on the same package. One
186 * thing we can do is to shuffle the initial stack for them.
187 */
188
189 p = arch_align_stack(p);
190
191 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700192 * If this architecture has a platform capability string, copy it
193 * to userspace. In some cases (Sparc), this info is impossible
194 * for userspace to get any other way, in others (i386) it is
195 * merely difficult.
196 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700197 u_platform = NULL;
198 if (k_platform) {
199 size_t len = strlen(k_platform) + 1;
200
Linus Torvalds1da177e2005-04-16 15:20:36 -0700201 u_platform = (elf_addr_t __user *)STACK_ALLOC(p, len);
202 if (__copy_to_user(u_platform, k_platform, len))
203 return -EFAULT;
204 }
205
Nathan Lynch483fad12008-07-22 04:48:46 +1000206 /*
207 * If this architecture has a "base" platform capability
208 * string, copy it to userspace.
209 */
210 u_base_platform = NULL;
211 if (k_base_platform) {
212 size_t len = strlen(k_base_platform) + 1;
213
214 u_base_platform = (elf_addr_t __user *)STACK_ALLOC(p, len);
215 if (__copy_to_user(u_base_platform, k_base_platform, len))
216 return -EFAULT;
217 }
218
Kees Cookf06295b2009-01-07 18:08:52 -0800219 /*
220 * Generate 16 random bytes for userspace PRNG seeding.
221 */
222 get_random_bytes(k_rand_bytes, sizeof(k_rand_bytes));
223 u_rand_bytes = (elf_addr_t __user *)
224 STACK_ALLOC(p, sizeof(k_rand_bytes));
225 if (__copy_to_user(u_rand_bytes, k_rand_bytes, sizeof(k_rand_bytes)))
226 return -EFAULT;
227
Linus Torvalds1da177e2005-04-16 15:20:36 -0700228 /* Create the ELF interpreter info */
Jesper Juhl785d5572006-06-23 02:05:35 -0700229 elf_info = (elf_addr_t *)current->mm->saved_auxv;
Olaf Hering4f9a58d2007-10-16 23:30:12 -0700230 /* update AT_VECTOR_SIZE_BASE if the number of NEW_AUX_ENT() changes */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700231#define NEW_AUX_ENT(id, val) \
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700232 do { \
Jesper Juhl785d5572006-06-23 02:05:35 -0700233 elf_info[ei_index++] = id; \
234 elf_info[ei_index++] = val; \
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700235 } while (0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700236
237#ifdef ARCH_DLINFO
238 /*
239 * ARCH_DLINFO must come first so PPC can do its special alignment of
240 * AUXV.
Olaf Hering4f9a58d2007-10-16 23:30:12 -0700241 * update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT() in
242 * ARCH_DLINFO changes
Linus Torvalds1da177e2005-04-16 15:20:36 -0700243 */
244 ARCH_DLINFO;
245#endif
246 NEW_AUX_ENT(AT_HWCAP, ELF_HWCAP);
247 NEW_AUX_ENT(AT_PAGESZ, ELF_EXEC_PAGESIZE);
248 NEW_AUX_ENT(AT_CLKTCK, CLOCKS_PER_SEC);
249 NEW_AUX_ENT(AT_PHDR, load_addr + exec->e_phoff);
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700250 NEW_AUX_ENT(AT_PHENT, sizeof(struct elf_phdr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700251 NEW_AUX_ENT(AT_PHNUM, exec->e_phnum);
252 NEW_AUX_ENT(AT_BASE, interp_load_addr);
253 NEW_AUX_ENT(AT_FLAGS, 0);
254 NEW_AUX_ENT(AT_ENTRY, exec->e_entry);
Eric W. Biedermanebc887b2012-02-07 18:36:10 -0800255 NEW_AUX_ENT(AT_UID, from_kuid_munged(cred->user_ns, cred->uid));
256 NEW_AUX_ENT(AT_EUID, from_kuid_munged(cred->user_ns, cred->euid));
257 NEW_AUX_ENT(AT_GID, from_kgid_munged(cred->user_ns, cred->gid));
258 NEW_AUX_ENT(AT_EGID, from_kgid_munged(cred->user_ns, cred->egid));
Kees Cookc425e182017-07-18 15:25:22 -0700259 NEW_AUX_ENT(AT_SECURE, bprm->secureexec);
Kees Cookf06295b2009-01-07 18:08:52 -0800260 NEW_AUX_ENT(AT_RANDOM, (elf_addr_t)(unsigned long)u_rand_bytes);
Michael Neuling21713642013-04-17 17:33:11 +0000261#ifdef ELF_HWCAP2
262 NEW_AUX_ENT(AT_HWCAP2, ELF_HWCAP2);
263#endif
John Reiser65191082008-07-21 14:21:32 -0700264 NEW_AUX_ENT(AT_EXECFN, bprm->exec);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700265 if (k_platform) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700266 NEW_AUX_ENT(AT_PLATFORM,
Jesper Juhl785d5572006-06-23 02:05:35 -0700267 (elf_addr_t)(unsigned long)u_platform);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700268 }
Nathan Lynch483fad12008-07-22 04:48:46 +1000269 if (k_base_platform) {
270 NEW_AUX_ENT(AT_BASE_PLATFORM,
271 (elf_addr_t)(unsigned long)u_base_platform);
272 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700273 if (bprm->interp_flags & BINPRM_FLAGS_EXECFD) {
Jesper Juhl785d5572006-06-23 02:05:35 -0700274 NEW_AUX_ENT(AT_EXECFD, bprm->interp_data);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700275 }
276#undef NEW_AUX_ENT
277 /* AT_NULL is zero; clear the rest too */
278 memset(&elf_info[ei_index], 0,
279 sizeof current->mm->saved_auxv - ei_index * sizeof elf_info[0]);
280
281 /* And advance past the AT_NULL entry. */
282 ei_index += 2;
283
284 sp = STACK_ADD(p, ei_index);
285
Andi Kleend20894a2008-02-08 04:21:54 -0800286 items = (argc + 1) + (envc + 1) + 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700287 bprm->p = STACK_ROUND(sp, items);
288
289 /* Point sp at the lowest address on the stack */
290#ifdef CONFIG_STACK_GROWSUP
291 sp = (elf_addr_t __user *)bprm->p - items - ei_index;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700292 bprm->exec = (unsigned long)sp; /* XXX: PARISC HACK */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700293#else
294 sp = (elf_addr_t __user *)bprm->p;
295#endif
296
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700297
298 /*
299 * Grow the stack manually; some architectures have a limit on how
300 * far ahead a user-space access may be in order to grow the stack.
301 */
302 vma = find_extend_vma(current->mm, bprm->p);
303 if (!vma)
304 return -EFAULT;
305
Linus Torvalds1da177e2005-04-16 15:20:36 -0700306 /* Now, let's put argc (and argv, envp if appropriate) on the stack */
307 if (__put_user(argc, sp++))
308 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700309
Kees Cook67c67772017-07-10 15:52:54 -0700310 /* Populate list of argv pointers back to argv strings. */
Greg Kroah-Hartmana84a5052005-05-11 00:10:44 -0700311 p = current->mm->arg_end = current->mm->arg_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700312 while (argc-- > 0) {
313 size_t len;
Kees Cook67c67772017-07-10 15:52:54 -0700314 if (__put_user((elf_addr_t)p, sp++))
Heiko Carstens841d5fb2006-12-06 20:36:35 -0800315 return -EFAULT;
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700316 len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);
317 if (!len || len > MAX_ARG_STRLEN)
WANG Cong23c49712008-05-08 21:52:33 +0800318 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700319 p += len;
320 }
Kees Cook67c67772017-07-10 15:52:54 -0700321 if (__put_user(0, sp++))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700322 return -EFAULT;
Kees Cook67c67772017-07-10 15:52:54 -0700323 current->mm->arg_end = p;
324
325 /* Populate list of envp pointers back to envp strings. */
326 current->mm->env_end = current->mm->env_start = p;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700327 while (envc-- > 0) {
328 size_t len;
Kees Cook67c67772017-07-10 15:52:54 -0700329 if (__put_user((elf_addr_t)p, sp++))
Heiko Carstens841d5fb2006-12-06 20:36:35 -0800330 return -EFAULT;
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700331 len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);
332 if (!len || len > MAX_ARG_STRLEN)
WANG Cong23c49712008-05-08 21:52:33 +0800333 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700334 p += len;
335 }
Kees Cook67c67772017-07-10 15:52:54 -0700336 if (__put_user(0, sp++))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700337 return -EFAULT;
338 current->mm->env_end = p;
339
340 /* Put the elf_info on the stack in the right place. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700341 if (copy_to_user(sp, elf_info, ei_index * sizeof(elf_addr_t)))
342 return -EFAULT;
343 return 0;
344}
345
James Hoganc07380b2011-05-09 10:58:40 +0100346#ifndef elf_map
347
Linus Torvalds1da177e2005-04-16 15:20:36 -0700348static unsigned long elf_map(struct file *filep, unsigned long addr,
Alexey Dobriyan49ac9812019-03-07 16:29:03 -0800349 const struct elf_phdr *eppnt, int prot, int type,
Jiri Kosinacc503c12008-01-30 13:31:07 +0100350 unsigned long total_size)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700351{
352 unsigned long map_addr;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100353 unsigned long size = eppnt->p_filesz + ELF_PAGEOFFSET(eppnt->p_vaddr);
354 unsigned long off = eppnt->p_offset - ELF_PAGEOFFSET(eppnt->p_vaddr);
355 addr = ELF_PAGESTART(addr);
356 size = ELF_PAGEALIGN(size);
Jan Kratochvil60bfba72007-07-15 23:40:06 -0700357
Andrew Mortond4e3cc32007-07-21 04:37:32 -0700358 /* mmap() will return -EINVAL if given a zero size, but a
359 * segment with zero filesize is perfectly valid */
Jiri Kosinacc503c12008-01-30 13:31:07 +0100360 if (!size)
361 return addr;
362
Jiri Kosinacc503c12008-01-30 13:31:07 +0100363 /*
364 * total_size is the size of the ELF (interpreter) image.
365 * The _first_ mmap needs to know the full size, otherwise
366 * randomization might put this image into an overlapping
367 * position with the ELF binary image. (since size < total_size)
368 * So we first map the 'big' image - and unmap the remainder at
369 * the end. (which unmap is needed for ELF images with holes.)
370 */
371 if (total_size) {
372 total_size = ELF_PAGEALIGN(total_size);
Al Viro5a5e4c22012-05-30 01:49:38 -0400373 map_addr = vm_mmap(filep, addr, total_size, prot, type, off);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100374 if (!BAD_ADDR(map_addr))
Al Viro5a5e4c22012-05-30 01:49:38 -0400375 vm_munmap(map_addr+size, total_size-size);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100376 } else
Al Viro5a5e4c22012-05-30 01:49:38 -0400377 map_addr = vm_mmap(filep, addr, size, prot, type, off);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100378
Tetsuo Handad23a61e2018-04-20 14:56:13 -0700379 if ((type & MAP_FIXED_NOREPLACE) &&
380 PTR_ERR((void *)map_addr) == -EEXIST)
381 pr_info("%d (%s): Uhuuh, elf segment at %px requested but the memory is mapped already\n",
382 task_pid_nr(current), current->comm, (void *)addr);
Michal Hocko4ed28632018-04-10 16:36:01 -0700383
Linus Torvalds1da177e2005-04-16 15:20:36 -0700384 return(map_addr);
385}
386
James Hoganc07380b2011-05-09 10:58:40 +0100387#endif /* !elf_map */
388
Alexey Dobriyan49ac9812019-03-07 16:29:03 -0800389static unsigned long total_mapping_size(const struct elf_phdr *cmds, int nr)
Jiri Kosinacc503c12008-01-30 13:31:07 +0100390{
391 int i, first_idx = -1, last_idx = -1;
392
393 for (i = 0; i < nr; i++) {
394 if (cmds[i].p_type == PT_LOAD) {
395 last_idx = i;
396 if (first_idx == -1)
397 first_idx = i;
398 }
399 }
400 if (first_idx == -1)
401 return 0;
402
403 return cmds[last_idx].p_vaddr + cmds[last_idx].p_memsz -
404 ELF_PAGESTART(cmds[first_idx].p_vaddr);
405}
406
Paul Burton6a8d3892014-09-11 08:30:14 +0100407/**
408 * load_elf_phdrs() - load ELF program headers
409 * @elf_ex: ELF header of the binary whose program headers should be loaded
410 * @elf_file: the opened ELF binary file
411 *
412 * Loads ELF program headers from the binary file elf_file, which has the ELF
413 * header pointed to by elf_ex, into a newly allocated array. The caller is
414 * responsible for freeing the allocated data. Returns an ERR_PTR upon failure.
415 */
Alexey Dobriyan49ac9812019-03-07 16:29:03 -0800416static struct elf_phdr *load_elf_phdrs(const struct elfhdr *elf_ex,
Paul Burton6a8d3892014-09-11 08:30:14 +0100417 struct file *elf_file)
418{
419 struct elf_phdr *elf_phdata = NULL;
Alexey Dobriyanfaf1c312019-03-07 16:28:56 -0800420 int retval, err = -1;
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +0200421 loff_t pos = elf_ex->e_phoff;
Alexey Dobriyanfaf1c312019-03-07 16:28:56 -0800422 unsigned int size;
Paul Burton6a8d3892014-09-11 08:30:14 +0100423
424 /*
425 * If the size of this structure has changed, then punt, since
426 * we will be doing the wrong thing.
427 */
428 if (elf_ex->e_phentsize != sizeof(struct elf_phdr))
429 goto out;
430
431 /* Sanity check the number of program headers... */
Paul Burton6a8d3892014-09-11 08:30:14 +0100432 /* ...and their total size. */
433 size = sizeof(struct elf_phdr) * elf_ex->e_phnum;
Alexey Dobriyanfaf1c312019-03-07 16:28:56 -0800434 if (size == 0 || size > 65536 || size > ELF_MIN_ALIGN)
Paul Burton6a8d3892014-09-11 08:30:14 +0100435 goto out;
436
437 elf_phdata = kmalloc(size, GFP_KERNEL);
438 if (!elf_phdata)
439 goto out;
440
441 /* Read in the program headers */
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +0200442 retval = kernel_read(elf_file, elf_phdata, size, &pos);
Paul Burton6a8d3892014-09-11 08:30:14 +0100443 if (retval != size) {
444 err = (retval < 0) ? retval : -EIO;
445 goto out;
446 }
447
448 /* Success! */
449 err = 0;
450out:
451 if (err) {
452 kfree(elf_phdata);
453 elf_phdata = NULL;
454 }
455 return elf_phdata;
456}
Jiri Kosinacc503c12008-01-30 13:31:07 +0100457
Paul Burton774c1052014-09-11 08:30:16 +0100458#ifndef CONFIG_ARCH_BINFMT_ELF_STATE
459
460/**
461 * struct arch_elf_state - arch-specific ELF loading state
462 *
463 * This structure is used to preserve architecture specific data during
464 * the loading of an ELF file, throughout the checking of architecture
465 * specific ELF headers & through to the point where the ELF load is
466 * known to be proceeding (ie. SET_PERSONALITY).
467 *
468 * This implementation is a dummy for architectures which require no
469 * specific state.
470 */
471struct arch_elf_state {
472};
473
474#define INIT_ARCH_ELF_STATE {}
475
476/**
477 * arch_elf_pt_proc() - check a PT_LOPROC..PT_HIPROC ELF program header
478 * @ehdr: The main ELF header
479 * @phdr: The program header to check
480 * @elf: The open ELF file
481 * @is_interp: True if the phdr is from the interpreter of the ELF being
482 * loaded, else false.
483 * @state: Architecture-specific state preserved throughout the process
484 * of loading the ELF.
485 *
486 * Inspects the program header phdr to validate its correctness and/or
487 * suitability for the system. Called once per ELF program header in the
488 * range PT_LOPROC to PT_HIPROC, for both the ELF being loaded and its
489 * interpreter.
490 *
491 * Return: Zero to proceed with the ELF load, non-zero to fail the ELF load
492 * with that return code.
493 */
494static inline int arch_elf_pt_proc(struct elfhdr *ehdr,
495 struct elf_phdr *phdr,
496 struct file *elf, bool is_interp,
497 struct arch_elf_state *state)
498{
499 /* Dummy implementation, always proceed */
500 return 0;
501}
502
503/**
Maciej W. Rozycki54d157142015-10-26 15:47:57 +0000504 * arch_check_elf() - check an ELF executable
Paul Burton774c1052014-09-11 08:30:16 +0100505 * @ehdr: The main ELF header
506 * @has_interp: True if the ELF has an interpreter, else false.
Maciej W. Rozyckieb4bc072015-11-13 00:47:48 +0000507 * @interp_ehdr: The interpreter's ELF header
Paul Burton774c1052014-09-11 08:30:16 +0100508 * @state: Architecture-specific state preserved throughout the process
509 * of loading the ELF.
510 *
511 * Provides a final opportunity for architecture code to reject the loading
512 * of the ELF & cause an exec syscall to return an error. This is called after
513 * all program headers to be checked by arch_elf_pt_proc have been.
514 *
515 * Return: Zero to proceed with the ELF load, non-zero to fail the ELF load
516 * with that return code.
517 */
518static inline int arch_check_elf(struct elfhdr *ehdr, bool has_interp,
Maciej W. Rozyckieb4bc072015-11-13 00:47:48 +0000519 struct elfhdr *interp_ehdr,
Paul Burton774c1052014-09-11 08:30:16 +0100520 struct arch_elf_state *state)
521{
522 /* Dummy implementation, always proceed */
523 return 0;
524}
525
526#endif /* !CONFIG_ARCH_BINFMT_ELF_STATE */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700527
Alexey Dobriyand8e7cb32019-05-14 15:43:51 -0700528static inline int make_prot(u32 p_flags)
529{
530 int prot = 0;
531
532 if (p_flags & PF_R)
533 prot |= PROT_READ;
534 if (p_flags & PF_W)
535 prot |= PROT_WRITE;
536 if (p_flags & PF_X)
537 prot |= PROT_EXEC;
538 return prot;
539}
540
Linus Torvalds1da177e2005-04-16 15:20:36 -0700541/* This is much more generalized than the library routine read function,
542 so we keep this separate. Technically the library read function
543 is only provided so that we can read a.out libraries that have
544 an ELF header */
545
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700546static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
Alexey Dobriyan81696d52019-12-04 16:52:22 -0800547 struct file *interpreter,
Paul Burtona9d9ef12014-09-11 08:30:15 +0100548 unsigned long no_base, struct elf_phdr *interp_elf_phdata)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700549{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700550 struct elf_phdr *eppnt;
551 unsigned long load_addr = 0;
552 int load_addr_set = 0;
553 unsigned long last_bss = 0, elf_bss = 0;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800554 int bss_prot = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700555 unsigned long error = ~0UL;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100556 unsigned long total_size;
Paul Burton6a8d3892014-09-11 08:30:14 +0100557 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700558
559 /* First of all, some simple consistency checks */
560 if (interp_elf_ex->e_type != ET_EXEC &&
561 interp_elf_ex->e_type != ET_DYN)
562 goto out;
Nicolas Pitre47552002017-08-16 16:05:13 -0400563 if (!elf_check_arch(interp_elf_ex) ||
564 elf_check_fdpic(interp_elf_ex))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700565 goto out;
Al Viro72c2d532013-09-22 16:27:52 -0400566 if (!interpreter->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700567 goto out;
568
Paul Burtona9d9ef12014-09-11 08:30:15 +0100569 total_size = total_mapping_size(interp_elf_phdata,
570 interp_elf_ex->e_phnum);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100571 if (!total_size) {
572 error = -EINVAL;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100573 goto out;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100574 }
575
Paul Burtona9d9ef12014-09-11 08:30:15 +0100576 eppnt = interp_elf_phdata;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700577 for (i = 0; i < interp_elf_ex->e_phnum; i++, eppnt++) {
578 if (eppnt->p_type == PT_LOAD) {
579 int elf_type = MAP_PRIVATE | MAP_DENYWRITE;
Alexey Dobriyand8e7cb32019-05-14 15:43:51 -0700580 int elf_prot = make_prot(eppnt->p_flags);
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700581 unsigned long vaddr = 0;
582 unsigned long k, map_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700583
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700584 vaddr = eppnt->p_vaddr;
585 if (interp_elf_ex->e_type == ET_EXEC || load_addr_set)
Michal Hocko4ed28632018-04-10 16:36:01 -0700586 elf_type |= MAP_FIXED_NOREPLACE;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100587 else if (no_base && interp_elf_ex->e_type == ET_DYN)
588 load_addr = -vaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700589
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700590 map_addr = elf_map(interpreter, load_addr + vaddr,
Andrew Mortonbb1ad822008-01-30 13:31:07 +0100591 eppnt, elf_prot, elf_type, total_size);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100592 total_size = 0;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700593 error = map_addr;
594 if (BAD_ADDR(map_addr))
Paul Burtona9d9ef12014-09-11 08:30:15 +0100595 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700596
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700597 if (!load_addr_set &&
598 interp_elf_ex->e_type == ET_DYN) {
599 load_addr = map_addr - ELF_PAGESTART(vaddr);
600 load_addr_set = 1;
601 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700602
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700603 /*
604 * Check to see if the section's size will overflow the
605 * allowed task size. Note that p_filesz must always be
606 * <= p_memsize so it's only necessary to check p_memsz.
607 */
608 k = load_addr + eppnt->p_vaddr;
Chuck Ebbertce510592006-07-03 00:24:14 -0700609 if (BAD_ADDR(k) ||
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700610 eppnt->p_filesz > eppnt->p_memsz ||
611 eppnt->p_memsz > TASK_SIZE ||
612 TASK_SIZE - eppnt->p_memsz < k) {
613 error = -ENOMEM;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100614 goto out;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700615 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700616
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700617 /*
618 * Find the end of the file mapping for this phdr, and
619 * keep track of the largest address we see for this.
620 */
621 k = load_addr + eppnt->p_vaddr + eppnt->p_filesz;
622 if (k > elf_bss)
623 elf_bss = k;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700624
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700625 /*
626 * Do the same thing for the memory mapping - between
627 * elf_bss and last_bss is the bss section.
628 */
Kees Cook0036d1f2016-08-02 14:04:51 -0700629 k = load_addr + eppnt->p_vaddr + eppnt->p_memsz;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800630 if (k > last_bss) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700631 last_bss = k;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800632 bss_prot = elf_prot;
633 }
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700634 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700635 }
636
Kees Cook0036d1f2016-08-02 14:04:51 -0700637 /*
638 * Now fill out the bss section: first pad the last page from
639 * the file up to the page boundary, and zero it from elf_bss
640 * up to the end of the page.
641 */
642 if (padzero(elf_bss)) {
643 error = -EFAULT;
644 goto out;
645 }
646 /*
647 * Next, align both the file and mem bss up to the page size,
648 * since this is where elf_bss was just zeroed up to, and where
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800649 * last_bss will end after the vm_brk_flags() below.
Kees Cook0036d1f2016-08-02 14:04:51 -0700650 */
651 elf_bss = ELF_PAGEALIGN(elf_bss);
652 last_bss = ELF_PAGEALIGN(last_bss);
653 /* Finally, if there is still more bss to allocate, do it. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700654 if (last_bss > elf_bss) {
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800655 error = vm_brk_flags(elf_bss, last_bss - elf_bss,
656 bss_prot & PROT_EXEC ? VM_EXEC : 0);
Linus Torvalds5d22fc22016-05-27 15:57:31 -0700657 if (error)
Paul Burtona9d9ef12014-09-11 08:30:15 +0100658 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700659 }
660
Jiri Kosinacc503c12008-01-30 13:31:07 +0100661 error = load_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700662out:
663 return error;
664}
665
Linus Torvalds1da177e2005-04-16 15:20:36 -0700666/*
667 * These are the functions used to load ELF style executables and shared
668 * libraries. There is no binary dependent code anywhere else.
669 */
670
Al Viro71613c32012-10-20 22:00:48 -0400671static int load_elf_binary(struct linux_binprm *bprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700672{
673 struct file *interpreter = NULL; /* to shut gcc up */
674 unsigned long load_addr = 0, load_bias = 0;
675 int load_addr_set = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676 unsigned long error;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100677 struct elf_phdr *elf_ppnt, *elf_phdata, *interp_elf_phdata = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700678 unsigned long elf_bss, elf_brk;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800679 int bss_prot = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700680 int retval, i;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100681 unsigned long elf_entry;
682 unsigned long interp_load_addr = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700683 unsigned long start_code, end_code, start_data, end_data;
David Daney1a530a62011-03-22 16:34:48 -0700684 unsigned long reloc_func_desc __maybe_unused = 0;
David Rientjes8de61e62006-12-06 20:40:16 -0800685 int executable_stack = EXSTACK_DEFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700686 struct {
687 struct elfhdr elf_ex;
688 struct elfhdr interp_elf_ex;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700689 } *loc;
Paul Burton774c1052014-09-11 08:30:16 +0100690 struct arch_elf_state arch_state = INIT_ARCH_ELF_STATE;
Alexey Dobriyan249b08e2019-05-14 15:43:54 -0700691 struct pt_regs *regs;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700692
693 loc = kmalloc(sizeof(*loc), GFP_KERNEL);
694 if (!loc) {
695 retval = -ENOMEM;
696 goto out_ret;
697 }
698
699 /* Get the exec-header */
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700700 loc->elf_ex = *((struct elfhdr *)bprm->buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700701
702 retval = -ENOEXEC;
703 /* First of all, some simple consistency checks */
704 if (memcmp(loc->elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
705 goto out;
706
707 if (loc->elf_ex.e_type != ET_EXEC && loc->elf_ex.e_type != ET_DYN)
708 goto out;
709 if (!elf_check_arch(&loc->elf_ex))
710 goto out;
Nicolas Pitre47552002017-08-16 16:05:13 -0400711 if (elf_check_fdpic(&loc->elf_ex))
712 goto out;
Al Viro72c2d532013-09-22 16:27:52 -0400713 if (!bprm->file->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700714 goto out;
715
Paul Burton6a8d3892014-09-11 08:30:14 +0100716 elf_phdata = load_elf_phdrs(&loc->elf_ex, bprm->file);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700717 if (!elf_phdata)
718 goto out;
719
Linus Torvalds1da177e2005-04-16 15:20:36 -0700720 elf_ppnt = elf_phdata;
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700721 for (i = 0; i < loc->elf_ex.e_phnum; i++, elf_ppnt++) {
722 char *elf_interpreter;
723 loff_t pos;
Alexey Dobriyan5cf4a362019-05-14 15:43:36 -0700724
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700725 if (elf_ppnt->p_type != PT_INTERP)
726 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700727
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700728 /*
729 * This is the program interpreter used for shared libraries -
730 * for now assume that this is an a.out format binary.
731 */
732 retval = -ENOEXEC;
733 if (elf_ppnt->p_filesz > PATH_MAX || elf_ppnt->p_filesz < 2)
734 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700735
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700736 retval = -ENOMEM;
737 elf_interpreter = kmalloc(elf_ppnt->p_filesz, GFP_KERNEL);
738 if (!elf_interpreter)
739 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700740
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700741 pos = elf_ppnt->p_offset;
742 retval = kernel_read(bprm->file, elf_interpreter,
743 elf_ppnt->p_filesz, &pos);
744 if (retval != elf_ppnt->p_filesz) {
745 if (retval >= 0)
746 retval = -EIO;
747 goto out_free_interp;
748 }
749 /* make sure path is NULL terminated */
750 retval = -ENOEXEC;
751 if (elf_interpreter[elf_ppnt->p_filesz - 1] != '\0')
752 goto out_free_interp;
Alexey Dobriyan1fb84492007-01-26 00:57:16 -0800753
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700754 interpreter = open_exec(elf_interpreter);
755 kfree(elf_interpreter);
756 retval = PTR_ERR(interpreter);
757 if (IS_ERR(interpreter))
758 goto out_free_ph;
Alexey Dobriyan1fb84492007-01-26 00:57:16 -0800759
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700760 /*
761 * If the binary is not readable then enforce mm->dumpable = 0
762 * regardless of the interpreter's permissions.
763 */
764 would_dump(bprm, interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700765
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700766 /* Get the exec headers */
767 pos = 0;
768 retval = kernel_read(interpreter, &loc->interp_elf_ex,
769 sizeof(loc->interp_elf_ex), &pos);
770 if (retval != sizeof(loc->interp_elf_ex)) {
771 if (retval >= 0)
772 retval = -EIO;
773 goto out_free_dentry;
774 }
775
776 break;
Alexey Dobriyancc338012019-05-14 15:43:39 -0700777
778out_free_interp:
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700779 kfree(elf_interpreter);
780 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700781 }
782
783 elf_ppnt = elf_phdata;
784 for (i = 0; i < loc->elf_ex.e_phnum; i++, elf_ppnt++)
Paul Burton774c1052014-09-11 08:30:16 +0100785 switch (elf_ppnt->p_type) {
786 case PT_GNU_STACK:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700787 if (elf_ppnt->p_flags & PF_X)
788 executable_stack = EXSTACK_ENABLE_X;
789 else
790 executable_stack = EXSTACK_DISABLE_X;
791 break;
Paul Burton774c1052014-09-11 08:30:16 +0100792
793 case PT_LOPROC ... PT_HIPROC:
794 retval = arch_elf_pt_proc(&loc->elf_ex, elf_ppnt,
795 bprm->file, false,
796 &arch_state);
797 if (retval)
798 goto out_free_dentry;
799 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700800 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700801
802 /* Some simple consistency checks for the interpreter */
Alexey Dobriyancc338012019-05-14 15:43:39 -0700803 if (interpreter) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700804 retval = -ELIBBAD;
Andi Kleend20894a2008-02-08 04:21:54 -0800805 /* Not an ELF interpreter */
806 if (memcmp(loc->interp_elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700807 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700808 /* Verify the interpreter has a valid arch */
Nicolas Pitre47552002017-08-16 16:05:13 -0400809 if (!elf_check_arch(&loc->interp_elf_ex) ||
810 elf_check_fdpic(&loc->interp_elf_ex))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700811 goto out_free_dentry;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100812
813 /* Load the interpreter program headers */
814 interp_elf_phdata = load_elf_phdrs(&loc->interp_elf_ex,
815 interpreter);
816 if (!interp_elf_phdata)
817 goto out_free_dentry;
Paul Burton774c1052014-09-11 08:30:16 +0100818
819 /* Pass PT_LOPROC..PT_HIPROC headers to arch code */
820 elf_ppnt = interp_elf_phdata;
821 for (i = 0; i < loc->interp_elf_ex.e_phnum; i++, elf_ppnt++)
822 switch (elf_ppnt->p_type) {
823 case PT_LOPROC ... PT_HIPROC:
824 retval = arch_elf_pt_proc(&loc->interp_elf_ex,
825 elf_ppnt, interpreter,
826 true, &arch_state);
827 if (retval)
828 goto out_free_dentry;
829 break;
830 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700831 }
832
Paul Burton774c1052014-09-11 08:30:16 +0100833 /*
834 * Allow arch code to reject the ELF at this point, whilst it's
835 * still possible to return an error to the code that invoked
836 * the exec syscall.
837 */
Maciej W. Rozyckieb4bc072015-11-13 00:47:48 +0000838 retval = arch_check_elf(&loc->elf_ex,
839 !!interpreter, &loc->interp_elf_ex,
840 &arch_state);
Paul Burton774c1052014-09-11 08:30:16 +0100841 if (retval)
842 goto out_free_dentry;
843
Linus Torvalds1da177e2005-04-16 15:20:36 -0700844 /* Flush all traces of the currently running executable */
845 retval = flush_old_exec(bprm);
846 if (retval)
847 goto out_free_dentry;
848
Linus Torvalds1da177e2005-04-16 15:20:36 -0700849 /* Do this immediately, since STACK_TOP as used in setup_arg_pages
850 may depend on the personality. */
Paul Burton774c1052014-09-11 08:30:16 +0100851 SET_PERSONALITY2(loc->elf_ex, &arch_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700852 if (elf_read_implies_exec(loc->elf_ex, executable_stack))
853 current->personality |= READ_IMPLIES_EXEC;
854
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700855 if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700856 current->flags |= PF_RANDOMIZE;
Linus Torvalds221af7f2010-01-28 22:14:42 -0800857
858 setup_new_exec(bprm);
Linus Torvalds9f834ec2016-08-22 16:41:46 -0700859 install_exec_creds(bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700860
861 /* Do this so that we can load the interpreter, if need be. We will
862 change some of these later */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700863 retval = setup_arg_pages(bprm, randomize_stack_top(STACK_TOP),
864 executable_stack);
Al Viro19d860a2014-05-04 20:11:36 -0400865 if (retval < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700866 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700867
Alexey Dobriyan852643162019-05-14 15:43:48 -0700868 elf_bss = 0;
869 elf_brk = 0;
870
871 start_code = ~0UL;
872 end_code = 0;
873 start_data = 0;
874 end_data = 0;
875
André Goddard Rosaaf901ca2009-11-14 13:09:05 -0200876 /* Now we do a little grungy work by mmapping the ELF image into
Jiri Kosinacc503c12008-01-30 13:31:07 +0100877 the correct location in memory. */
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700878 for(i = 0, elf_ppnt = elf_phdata;
879 i < loc->elf_ex.e_phnum; i++, elf_ppnt++) {
Linus Torvaldsb2129212019-10-06 13:53:27 -0700880 int elf_prot, elf_flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700881 unsigned long k, vaddr;
Michael Davidsona87938b2015-04-14 15:47:38 -0700882 unsigned long total_size = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700883
884 if (elf_ppnt->p_type != PT_LOAD)
885 continue;
886
887 if (unlikely (elf_brk > elf_bss)) {
888 unsigned long nbyte;
889
890 /* There was a PT_LOAD segment with p_memsz > p_filesz
891 before this one. Map anonymous pages, if needed,
892 and clear the area. */
Mikael Petterssonf670d0e2011-01-12 17:00:02 -0800893 retval = set_brk(elf_bss + load_bias,
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800894 elf_brk + load_bias,
895 bss_prot);
Al Viro19d860a2014-05-04 20:11:36 -0400896 if (retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700897 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700898 nbyte = ELF_PAGEOFFSET(elf_bss);
899 if (nbyte) {
900 nbyte = ELF_MIN_ALIGN - nbyte;
901 if (nbyte > elf_brk - elf_bss)
902 nbyte = elf_brk - elf_bss;
903 if (clear_user((void __user *)elf_bss +
904 load_bias, nbyte)) {
905 /*
906 * This bss-zeroing can fail if the ELF
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700907 * file specifies odd protections. So
Linus Torvalds1da177e2005-04-16 15:20:36 -0700908 * we don't check the return value
909 */
910 }
911 }
912 }
913
Alexey Dobriyand8e7cb32019-05-14 15:43:51 -0700914 elf_prot = make_prot(elf_ppnt->p_flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700915
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700916 elf_flags = MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700917
918 vaddr = elf_ppnt->p_vaddr;
Kees Cookeab09532017-07-10 15:52:37 -0700919 /*
920 * If we are loading ET_EXEC or we have already performed
921 * the ET_DYN load_addr calculations, proceed normally.
922 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700923 if (loc->elf_ex.e_type == ET_EXEC || load_addr_set) {
Linus Torvaldsb2129212019-10-06 13:53:27 -0700924 elf_flags |= MAP_FIXED;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700925 } else if (loc->elf_ex.e_type == ET_DYN) {
Kees Cookeab09532017-07-10 15:52:37 -0700926 /*
927 * This logic is run once for the first LOAD Program
928 * Header for ET_DYN binaries to calculate the
929 * randomization (load_bias) for all the LOAD
930 * Program Headers, and to calculate the entire
931 * size of the ELF mapping (total_size). (Note that
932 * load_addr_set is set to true later once the
933 * initial mapping is performed.)
934 *
935 * There are effectively two types of ET_DYN
936 * binaries: programs (i.e. PIE: ET_DYN with INTERP)
937 * and loaders (ET_DYN without INTERP, since they
938 * _are_ the ELF interpreter). The loaders must
939 * be loaded away from programs since the program
940 * may otherwise collide with the loader (especially
941 * for ET_EXEC which does not have a randomized
942 * position). For example to handle invocations of
943 * "./ld.so someprog" to test out a new version of
944 * the loader, the subsequent program that the
945 * loader loads must avoid the loader itself, so
946 * they cannot share the same load range. Sufficient
947 * room for the brk must be allocated with the
948 * loader as well, since brk must be available with
949 * the loader.
950 *
951 * Therefore, programs are loaded offset from
952 * ELF_ET_DYN_BASE and loaders are loaded into the
953 * independently randomized mmap region (0 load_bias
954 * without MAP_FIXED).
955 */
Alexey Dobriyancc338012019-05-14 15:43:39 -0700956 if (interpreter) {
Kees Cookeab09532017-07-10 15:52:37 -0700957 load_bias = ELF_ET_DYN_BASE;
958 if (current->flags & PF_RANDOMIZE)
959 load_bias += arch_mmap_rnd();
Linus Torvaldsb2129212019-10-06 13:53:27 -0700960 elf_flags |= MAP_FIXED;
Kees Cookeab09532017-07-10 15:52:37 -0700961 } else
962 load_bias = 0;
963
964 /*
965 * Since load_bias is used for all subsequent loading
966 * calculations, we must lower it by the first vaddr
967 * so that the remaining calculations based on the
968 * ELF vaddrs will be correctly offset. The result
969 * is then page aligned.
970 */
971 load_bias = ELF_PAGESTART(load_bias - vaddr);
972
Michael Davidsona87938b2015-04-14 15:47:38 -0700973 total_size = total_mapping_size(elf_phdata,
974 loc->elf_ex.e_phnum);
975 if (!total_size) {
Andrew Morton2b1d3ae2015-05-28 15:44:24 -0700976 retval = -EINVAL;
Michael Davidsona87938b2015-04-14 15:47:38 -0700977 goto out_free_dentry;
978 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700979 }
980
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700981 error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt,
Michael Davidsona87938b2015-04-14 15:47:38 -0700982 elf_prot, elf_flags, total_size);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700983 if (BAD_ADDR(error)) {
Alexey Kuznetsovb140f2512007-05-08 00:31:57 -0700984 retval = IS_ERR((void *)error) ?
985 PTR_ERR((void*)error) : -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700986 goto out_free_dentry;
987 }
988
989 if (!load_addr_set) {
990 load_addr_set = 1;
991 load_addr = (elf_ppnt->p_vaddr - elf_ppnt->p_offset);
992 if (loc->elf_ex.e_type == ET_DYN) {
993 load_bias += error -
994 ELF_PAGESTART(load_bias + vaddr);
995 load_addr += load_bias;
996 reloc_func_desc = load_bias;
997 }
998 }
999 k = elf_ppnt->p_vaddr;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001000 if (k < start_code)
1001 start_code = k;
1002 if (start_data < k)
1003 start_data = k;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001004
1005 /*
1006 * Check to see if the section's size will overflow the
1007 * allowed task size. Note that p_filesz must always be
1008 * <= p_memsz so it is only necessary to check p_memsz.
1009 */
Chuck Ebbertce510592006-07-03 00:24:14 -07001010 if (BAD_ADDR(k) || elf_ppnt->p_filesz > elf_ppnt->p_memsz ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07001011 elf_ppnt->p_memsz > TASK_SIZE ||
1012 TASK_SIZE - elf_ppnt->p_memsz < k) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001013 /* set_brk can never work. Avoid overflows. */
Alexey Kuznetsovb140f2512007-05-08 00:31:57 -07001014 retval = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001015 goto out_free_dentry;
1016 }
1017
1018 k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz;
1019
1020 if (k > elf_bss)
1021 elf_bss = k;
1022 if ((elf_ppnt->p_flags & PF_X) && end_code < k)
1023 end_code = k;
1024 if (end_data < k)
1025 end_data = k;
1026 k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz;
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001027 if (k > elf_brk) {
1028 bss_prot = elf_prot;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001029 elf_brk = k;
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001030 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001031 }
1032
1033 loc->elf_ex.e_entry += load_bias;
1034 elf_bss += load_bias;
1035 elf_brk += load_bias;
1036 start_code += load_bias;
1037 end_code += load_bias;
1038 start_data += load_bias;
1039 end_data += load_bias;
1040
1041 /* Calling set_brk effectively mmaps the pages that we need
1042 * for the bss and break sections. We must do this before
1043 * mapping in the interpreter, to make sure it doesn't wind
1044 * up getting placed where the bss needs to go.
1045 */
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001046 retval = set_brk(elf_bss, elf_brk, bss_prot);
Al Viro19d860a2014-05-04 20:11:36 -04001047 if (retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001048 goto out_free_dentry;
akpm@osdl.org6de50512005-10-11 08:29:08 -07001049 if (likely(elf_bss != elf_brk) && unlikely(padzero(elf_bss))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001050 retval = -EFAULT; /* Nobody gets to see this, but.. */
1051 goto out_free_dentry;
1052 }
1053
Alexey Dobriyancc338012019-05-14 15:43:39 -07001054 if (interpreter) {
Andi Kleend20894a2008-02-08 04:21:54 -08001055 elf_entry = load_elf_interp(&loc->interp_elf_ex,
1056 interpreter,
Paul Burtona9d9ef12014-09-11 08:30:15 +01001057 load_bias, interp_elf_phdata);
Andi Kleend20894a2008-02-08 04:21:54 -08001058 if (!IS_ERR((void *)elf_entry)) {
1059 /*
1060 * load_elf_interp() returns relocation
1061 * adjustment
1062 */
1063 interp_load_addr = elf_entry;
1064 elf_entry += loc->interp_elf_ex.e_entry;
Jiri Kosinacc503c12008-01-30 13:31:07 +01001065 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001066 if (BAD_ADDR(elf_entry)) {
Chuck Ebbertce510592006-07-03 00:24:14 -07001067 retval = IS_ERR((void *)elf_entry) ?
1068 (int)elf_entry : -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001069 goto out_free_dentry;
1070 }
1071 reloc_func_desc = interp_load_addr;
1072
1073 allow_write_access(interpreter);
1074 fput(interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001075 } else {
1076 elf_entry = loc->elf_ex.e_entry;
Suresh Siddha5342fba2006-02-26 04:18:28 +01001077 if (BAD_ADDR(elf_entry)) {
Chuck Ebbertce510592006-07-03 00:24:14 -07001078 retval = -EINVAL;
Suresh Siddha5342fba2006-02-26 04:18:28 +01001079 goto out_free_dentry;
1080 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001081 }
1082
Paul Burton774c1052014-09-11 08:30:16 +01001083 kfree(interp_elf_phdata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001084 kfree(elf_phdata);
1085
Linus Torvalds1da177e2005-04-16 15:20:36 -07001086 set_binfmt(&elf_format);
1087
Benjamin Herrenschmidt547ee842005-04-16 15:24:35 -07001088#ifdef ARCH_HAS_SETUP_ADDITIONAL_PAGES
Alexey Dobriyancc338012019-05-14 15:43:39 -07001089 retval = arch_setup_additional_pages(bprm, !!interpreter);
Al Viro19d860a2014-05-04 20:11:36 -04001090 if (retval < 0)
Roland McGrath18c8baff2005-04-28 15:17:19 -07001091 goto out;
Benjamin Herrenschmidt547ee842005-04-16 15:24:35 -07001092#endif /* ARCH_HAS_SETUP_ADDITIONAL_PAGES */
1093
Ollie Wildb6a2fea2007-07-19 01:48:16 -07001094 retval = create_elf_tables(bprm, &loc->elf_ex,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001095 load_addr, interp_load_addr);
Al Viro19d860a2014-05-04 20:11:36 -04001096 if (retval < 0)
Ollie Wildb6a2fea2007-07-19 01:48:16 -07001097 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001098 current->mm->end_code = end_code;
1099 current->mm->start_code = start_code;
1100 current->mm->start_data = start_data;
1101 current->mm->end_data = end_data;
1102 current->mm->start_stack = bprm->p;
1103
Jiri Kosina4471a672011-04-14 15:22:09 -07001104 if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1)) {
Kees Cookbbdc6072019-05-14 15:43:57 -07001105 /*
1106 * For architectures with ELF randomization, when executing
1107 * a loader directly (i.e. no interpreter listed in ELF
1108 * headers), move the brk area out of the mmap region
1109 * (since it grows up, and may collide early with the stack
1110 * growing down), and into the unused ELF_ET_DYN_BASE region.
1111 */
Kees Cook7be3cb02019-09-26 10:15:25 -07001112 if (IS_ENABLED(CONFIG_ARCH_HAS_ELF_RANDOMIZE) &&
1113 loc->elf_ex.e_type == ET_DYN && !interpreter)
Kees Cookbbdc6072019-05-14 15:43:57 -07001114 current->mm->brk = current->mm->start_brk =
1115 ELF_ET_DYN_BASE;
1116
Jiri Kosinac1d171a2008-01-30 13:30:40 +01001117 current->mm->brk = current->mm->start_brk =
1118 arch_randomize_brk(current->mm);
Kees Cook204db6e2015-04-14 15:48:12 -07001119#ifdef compat_brk_randomized
Jiri Kosina4471a672011-04-14 15:22:09 -07001120 current->brk_randomized = 1;
1121#endif
1122 }
Jiri Kosinac1d171a2008-01-30 13:30:40 +01001123
Linus Torvalds1da177e2005-04-16 15:20:36 -07001124 if (current->personality & MMAP_PAGE_ZERO) {
1125 /* Why this, you ask??? Well SVr4 maps page 0 as read-only,
1126 and some applications "depend" upon this behavior.
1127 Since we do not have the power to recompile these, we
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001128 emulate the SVr4 behavior. Sigh. */
Linus Torvalds6be5ceb2012-04-20 17:13:58 -07001129 error = vm_mmap(NULL, 0, PAGE_SIZE, PROT_READ | PROT_EXEC,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001130 MAP_FIXED | MAP_PRIVATE, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001131 }
1132
Alexey Dobriyan249b08e2019-05-14 15:43:54 -07001133 regs = current_pt_regs();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001134#ifdef ELF_PLAT_INIT
1135 /*
1136 * The ABI may specify that certain registers be set up in special
1137 * ways (on i386 %edx is the address of a DT_FINI function, for
1138 * example. In addition, it may also specify (eg, PowerPC64 ELF)
1139 * that the e_entry field is the address of the function descriptor
1140 * for the startup routine, rather than the address of the startup
1141 * routine itself. This macro performs whatever initialization to
1142 * the regs structure is required as well as any relocations to the
1143 * function descriptor entries when executing dynamically links apps.
1144 */
1145 ELF_PLAT_INIT(regs, reloc_func_desc);
1146#endif
1147
Kees Cookb8383832018-04-10 16:34:57 -07001148 finalize_exec(bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001149 start_thread(regs, elf_entry, bprm->p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001150 retval = 0;
1151out:
1152 kfree(loc);
1153out_ret:
1154 return retval;
1155
1156 /* error cleanup */
1157out_free_dentry:
Paul Burtona9d9ef12014-09-11 08:30:15 +01001158 kfree(interp_elf_phdata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001159 allow_write_access(interpreter);
1160 if (interpreter)
1161 fput(interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001162out_free_ph:
1163 kfree(elf_phdata);
1164 goto out;
1165}
1166
Josh Triplett69369a72014-04-03 14:48:27 -07001167#ifdef CONFIG_USELIB
Linus Torvalds1da177e2005-04-16 15:20:36 -07001168/* This is really simpleminded and specialized - we are loading an
1169 a.out library that is given an ELF header. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001170static int load_elf_library(struct file *file)
1171{
1172 struct elf_phdr *elf_phdata;
1173 struct elf_phdr *eppnt;
1174 unsigned long elf_bss, bss, len;
1175 int retval, error, i, j;
1176 struct elfhdr elf_ex;
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +02001177 loff_t pos = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001178
1179 error = -ENOEXEC;
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +02001180 retval = kernel_read(file, &elf_ex, sizeof(elf_ex), &pos);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001181 if (retval != sizeof(elf_ex))
1182 goto out;
1183
1184 if (memcmp(elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
1185 goto out;
1186
1187 /* First of all, some simple consistency checks */
1188 if (elf_ex.e_type != ET_EXEC || elf_ex.e_phnum > 2 ||
Al Viro72c2d532013-09-22 16:27:52 -04001189 !elf_check_arch(&elf_ex) || !file->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001190 goto out;
Nicolas Pitre47552002017-08-16 16:05:13 -04001191 if (elf_check_fdpic(&elf_ex))
1192 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001193
1194 /* Now read in all of the header information */
1195
1196 j = sizeof(struct elf_phdr) * elf_ex.e_phnum;
1197 /* j < ELF_MIN_ALIGN because elf_ex.e_phnum <= 2 */
1198
1199 error = -ENOMEM;
1200 elf_phdata = kmalloc(j, GFP_KERNEL);
1201 if (!elf_phdata)
1202 goto out;
1203
1204 eppnt = elf_phdata;
1205 error = -ENOEXEC;
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +02001206 pos = elf_ex.e_phoff;
1207 retval = kernel_read(file, eppnt, j, &pos);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001208 if (retval != j)
1209 goto out_free_ph;
1210
1211 for (j = 0, i = 0; i<elf_ex.e_phnum; i++)
1212 if ((eppnt + i)->p_type == PT_LOAD)
1213 j++;
1214 if (j != 1)
1215 goto out_free_ph;
1216
1217 while (eppnt->p_type != PT_LOAD)
1218 eppnt++;
1219
1220 /* Now use mmap to map the library into memory. */
Linus Torvalds6be5ceb2012-04-20 17:13:58 -07001221 error = vm_mmap(file,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001222 ELF_PAGESTART(eppnt->p_vaddr),
1223 (eppnt->p_filesz +
1224 ELF_PAGEOFFSET(eppnt->p_vaddr)),
1225 PROT_READ | PROT_WRITE | PROT_EXEC,
Michal Hocko4ed28632018-04-10 16:36:01 -07001226 MAP_FIXED_NOREPLACE | MAP_PRIVATE | MAP_DENYWRITE,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001227 (eppnt->p_offset -
1228 ELF_PAGEOFFSET(eppnt->p_vaddr)));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001229 if (error != ELF_PAGESTART(eppnt->p_vaddr))
1230 goto out_free_ph;
1231
1232 elf_bss = eppnt->p_vaddr + eppnt->p_filesz;
1233 if (padzero(elf_bss)) {
1234 error = -EFAULT;
1235 goto out_free_ph;
1236 }
1237
Oscar Salvador24962af2018-07-13 16:59:13 -07001238 len = ELF_PAGEALIGN(eppnt->p_filesz + eppnt->p_vaddr);
1239 bss = ELF_PAGEALIGN(eppnt->p_memsz + eppnt->p_vaddr);
Michal Hockoecc2bc82016-05-23 16:25:39 -07001240 if (bss > len) {
1241 error = vm_brk(len, bss - len);
Linus Torvalds5d22fc22016-05-27 15:57:31 -07001242 if (error)
Michal Hockoecc2bc82016-05-23 16:25:39 -07001243 goto out_free_ph;
1244 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001245 error = 0;
1246
1247out_free_ph:
1248 kfree(elf_phdata);
1249out:
1250 return error;
1251}
Josh Triplett69369a72014-04-03 14:48:27 -07001252#endif /* #ifdef CONFIG_USELIB */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001253
Christoph Hellwig698ba7b2009-12-15 16:47:37 -08001254#ifdef CONFIG_ELF_CORE
Linus Torvalds1da177e2005-04-16 15:20:36 -07001255/*
1256 * ELF core dumper
1257 *
1258 * Modelled on fs/exec.c:aout_core_dump()
1259 * Jeremy Fitzhardinge <jeremy@sw.oz.au>
1260 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001261
1262/*
Jason Baron909af762012-03-23 15:02:51 -07001263 * The purpose of always_dump_vma() is to make sure that special kernel mappings
1264 * that are useful for post-mortem analysis are included in every core dump.
1265 * In that way we ensure that the core dump is fully interpretable later
1266 * without matching up the same kernel and hardware config to see what PC values
1267 * meant. These special mappings include - vDSO, vsyscall, and other
1268 * architecture specific mappings
1269 */
1270static bool always_dump_vma(struct vm_area_struct *vma)
1271{
1272 /* Any vsyscall mappings? */
1273 if (vma == get_gate_vma(vma->vm_mm))
1274 return true;
Andy Lutomirski78d683e2014-05-19 15:58:32 -07001275
1276 /*
1277 * Assume that all vmas with a .name op should always be dumped.
1278 * If this changes, a new vm_ops field can easily be added.
1279 */
1280 if (vma->vm_ops && vma->vm_ops->name && vma->vm_ops->name(vma))
1281 return true;
1282
Jason Baron909af762012-03-23 15:02:51 -07001283 /*
1284 * arch_vma_name() returns non-NULL for special architecture mappings,
1285 * such as vDSO sections.
1286 */
1287 if (arch_vma_name(vma))
1288 return true;
1289
1290 return false;
1291}
1292
1293/*
Roland McGrath82df3972007-10-16 23:27:02 -07001294 * Decide what to dump of a segment, part, all or none.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001295 */
Roland McGrath82df3972007-10-16 23:27:02 -07001296static unsigned long vma_dump_size(struct vm_area_struct *vma,
1297 unsigned long mm_flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001298{
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001299#define FILTER(type) (mm_flags & (1UL << MMF_DUMP_##type))
1300
Jason Baron909af762012-03-23 15:02:51 -07001301 /* always dump the vdso and vsyscall sections */
1302 if (always_dump_vma(vma))
Roland McGrath82df3972007-10-16 23:27:02 -07001303 goto whole;
Roland McGrathe5b97dd2007-01-26 00:56:48 -08001304
Konstantin Khlebnikov0103bd12012-10-08 16:28:59 -07001305 if (vma->vm_flags & VM_DONTDUMP)
Jason Baronaccb61f2012-03-23 15:02:51 -07001306 return 0;
1307
Ross Zwisler50378352015-10-05 16:33:36 -06001308 /* support for DAX */
1309 if (vma_is_dax(vma)) {
1310 if ((vma->vm_flags & VM_SHARED) && FILTER(DAX_SHARED))
1311 goto whole;
1312 if (!(vma->vm_flags & VM_SHARED) && FILTER(DAX_PRIVATE))
1313 goto whole;
1314 return 0;
1315 }
1316
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001317 /* Hugetlb memory check */
1318 if (vma->vm_flags & VM_HUGETLB) {
1319 if ((vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_SHARED))
1320 goto whole;
1321 if (!(vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_PRIVATE))
1322 goto whole;
Naoya Horiguchi23d9e482013-04-17 15:58:28 -07001323 return 0;
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001324 }
1325
Linus Torvalds1da177e2005-04-16 15:20:36 -07001326 /* Do not dump I/O mapped devices or special mappings */
Konstantin Khlebnikov314e51b2012-10-08 16:29:02 -07001327 if (vma->vm_flags & VM_IO)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001328 return 0;
1329
Kawai, Hidehiroa1b59e82007-07-19 01:48:29 -07001330 /* By default, dump shared memory if mapped from an anonymous file. */
1331 if (vma->vm_flags & VM_SHARED) {
Al Viro496ad9a2013-01-23 17:07:38 -05001332 if (file_inode(vma->vm_file)->i_nlink == 0 ?
Roland McGrath82df3972007-10-16 23:27:02 -07001333 FILTER(ANON_SHARED) : FILTER(MAPPED_SHARED))
1334 goto whole;
1335 return 0;
Kawai, Hidehiroa1b59e82007-07-19 01:48:29 -07001336 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001337
Roland McGrath82df3972007-10-16 23:27:02 -07001338 /* Dump segments that have been written to. */
1339 if (vma->anon_vma && FILTER(ANON_PRIVATE))
1340 goto whole;
1341 if (vma->vm_file == NULL)
1342 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001343
Roland McGrath82df3972007-10-16 23:27:02 -07001344 if (FILTER(MAPPED_PRIVATE))
1345 goto whole;
1346
1347 /*
1348 * If this looks like the beginning of a DSO or executable mapping,
1349 * check for an ELF header. If we find one, dump the first page to
1350 * aid in determining what was mapped here.
1351 */
Roland McGrath92dc07b2009-02-06 17:34:07 -08001352 if (FILTER(ELF_HEADERS) &&
1353 vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) {
Roland McGrath82df3972007-10-16 23:27:02 -07001354 u32 __user *header = (u32 __user *) vma->vm_start;
1355 u32 word;
Roland McGrath92dc07b2009-02-06 17:34:07 -08001356 mm_segment_t fs = get_fs();
Roland McGrath82df3972007-10-16 23:27:02 -07001357 /*
1358 * Doing it this way gets the constant folded by GCC.
1359 */
1360 union {
1361 u32 cmp;
1362 char elfmag[SELFMAG];
1363 } magic;
1364 BUILD_BUG_ON(SELFMAG != sizeof word);
1365 magic.elfmag[EI_MAG0] = ELFMAG0;
1366 magic.elfmag[EI_MAG1] = ELFMAG1;
1367 magic.elfmag[EI_MAG2] = ELFMAG2;
1368 magic.elfmag[EI_MAG3] = ELFMAG3;
Roland McGrath92dc07b2009-02-06 17:34:07 -08001369 /*
1370 * Switch to the user "segment" for get_user(),
1371 * then put back what elf_core_dump() had in place.
1372 */
1373 set_fs(USER_DS);
1374 if (unlikely(get_user(word, header)))
1375 word = 0;
1376 set_fs(fs);
1377 if (word == magic.cmp)
Roland McGrath82df3972007-10-16 23:27:02 -07001378 return PAGE_SIZE;
1379 }
1380
1381#undef FILTER
1382
1383 return 0;
1384
1385whole:
1386 return vma->vm_end - vma->vm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001387}
1388
Linus Torvalds1da177e2005-04-16 15:20:36 -07001389/* An ELF note in memory */
1390struct memelfnote
1391{
1392 const char *name;
1393 int type;
1394 unsigned int datasz;
1395 void *data;
1396};
1397
1398static int notesize(struct memelfnote *en)
1399{
1400 int sz;
1401
1402 sz = sizeof(struct elf_note);
1403 sz += roundup(strlen(en->name) + 1, 4);
1404 sz += roundup(en->datasz, 4);
1405
1406 return sz;
1407}
1408
Al Viroecc8c772013-10-05 15:32:35 -04001409static int writenote(struct memelfnote *men, struct coredump_params *cprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001410{
1411 struct elf_note en;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001412 en.n_namesz = strlen(men->name) + 1;
1413 en.n_descsz = men->datasz;
1414 en.n_type = men->type;
1415
Al Viroecc8c772013-10-05 15:32:35 -04001416 return dump_emit(cprm, &en, sizeof(en)) &&
Al Viro22a8cb82013-10-08 11:05:01 -04001417 dump_emit(cprm, men->name, en.n_namesz) && dump_align(cprm, 4) &&
1418 dump_emit(cprm, men->data, men->datasz) && dump_align(cprm, 4);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001419}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001420
Roland McGrath3aba4812008-01-30 13:31:44 +01001421static void fill_elf_header(struct elfhdr *elf, int segs,
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001422 u16 machine, u32 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001423{
Cyrill Gorcunov6970c8e2008-04-29 01:01:18 -07001424 memset(elf, 0, sizeof(*elf));
1425
Linus Torvalds1da177e2005-04-16 15:20:36 -07001426 memcpy(elf->e_ident, ELFMAG, SELFMAG);
1427 elf->e_ident[EI_CLASS] = ELF_CLASS;
1428 elf->e_ident[EI_DATA] = ELF_DATA;
1429 elf->e_ident[EI_VERSION] = EV_CURRENT;
1430 elf->e_ident[EI_OSABI] = ELF_OSABI;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001431
1432 elf->e_type = ET_CORE;
Roland McGrath3aba4812008-01-30 13:31:44 +01001433 elf->e_machine = machine;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001434 elf->e_version = EV_CURRENT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001435 elf->e_phoff = sizeof(struct elfhdr);
Roland McGrath3aba4812008-01-30 13:31:44 +01001436 elf->e_flags = flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001437 elf->e_ehsize = sizeof(struct elfhdr);
1438 elf->e_phentsize = sizeof(struct elf_phdr);
1439 elf->e_phnum = segs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001440}
1441
Andrew Morton8d6b5eee2006-09-25 23:32:04 -07001442static void fill_elf_note_phdr(struct elf_phdr *phdr, int sz, loff_t offset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001443{
1444 phdr->p_type = PT_NOTE;
1445 phdr->p_offset = offset;
1446 phdr->p_vaddr = 0;
1447 phdr->p_paddr = 0;
1448 phdr->p_filesz = sz;
1449 phdr->p_memsz = 0;
1450 phdr->p_flags = 0;
1451 phdr->p_align = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001452}
1453
1454static void fill_note(struct memelfnote *note, const char *name, int type,
1455 unsigned int sz, void *data)
1456{
1457 note->name = name;
1458 note->type = type;
1459 note->datasz = sz;
1460 note->data = data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001461}
1462
1463/*
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001464 * fill up all the fields in prstatus from the given task struct, except
1465 * registers which need to be filled up separately.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001466 */
1467static void fill_prstatus(struct elf_prstatus *prstatus,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001468 struct task_struct *p, long signr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001469{
1470 prstatus->pr_info.si_signo = prstatus->pr_cursig = signr;
1471 prstatus->pr_sigpend = p->pending.signal.sig[0];
1472 prstatus->pr_sighold = p->blocked.sig[0];
Oleg Nesterov3b34fc52009-06-17 16:27:38 -07001473 rcu_read_lock();
1474 prstatus->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1475 rcu_read_unlock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001476 prstatus->pr_pid = task_pid_vnr(p);
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001477 prstatus->pr_pgrp = task_pgrp_vnr(p);
1478 prstatus->pr_sid = task_session_vnr(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001479 if (thread_group_leader(p)) {
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001480 struct task_cputime cputime;
Frank Mayharf06febc2008-09-12 09:54:39 -07001481
Linus Torvalds1da177e2005-04-16 15:20:36 -07001482 /*
Frank Mayharf06febc2008-09-12 09:54:39 -07001483 * This is the record for the group leader. It shows the
1484 * group-wide total, not its individual thread total.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001485 */
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001486 thread_group_cputime(p, &cputime);
Arnd Bergmanne2bb80d2017-11-23 13:46:33 +01001487 prstatus->pr_utime = ns_to_kernel_old_timeval(cputime.utime);
1488 prstatus->pr_stime = ns_to_kernel_old_timeval(cputime.stime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001489 } else {
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001490 u64 utime, stime;
Frederic Weisbecker6fac4822012-11-13 14:20:55 +01001491
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001492 task_cputime(p, &utime, &stime);
Arnd Bergmanne2bb80d2017-11-23 13:46:33 +01001493 prstatus->pr_utime = ns_to_kernel_old_timeval(utime);
1494 prstatus->pr_stime = ns_to_kernel_old_timeval(stime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001495 }
Frederic Weisbecker5613fda2017-01-31 04:09:23 +01001496
Arnd Bergmanne2bb80d2017-11-23 13:46:33 +01001497 prstatus->pr_cutime = ns_to_kernel_old_timeval(p->signal->cutime);
1498 prstatus->pr_cstime = ns_to_kernel_old_timeval(p->signal->cstime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001499}
1500
1501static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p,
1502 struct mm_struct *mm)
1503{
David Howellsc69e8d92008-11-14 10:39:19 +11001504 const struct cred *cred;
Greg Kroah-Hartmana84a5052005-05-11 00:10:44 -07001505 unsigned int i, len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001506
1507 /* first copy the parameters from user space */
1508 memset(psinfo, 0, sizeof(struct elf_prpsinfo));
1509
1510 len = mm->arg_end - mm->arg_start;
1511 if (len >= ELF_PRARGSZ)
1512 len = ELF_PRARGSZ-1;
1513 if (copy_from_user(&psinfo->pr_psargs,
1514 (const char __user *)mm->arg_start, len))
1515 return -EFAULT;
1516 for(i = 0; i < len; i++)
1517 if (psinfo->pr_psargs[i] == 0)
1518 psinfo->pr_psargs[i] = ' ';
1519 psinfo->pr_psargs[len] = 0;
1520
Oleg Nesterov3b34fc52009-06-17 16:27:38 -07001521 rcu_read_lock();
1522 psinfo->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1523 rcu_read_unlock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001524 psinfo->pr_pid = task_pid_vnr(p);
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001525 psinfo->pr_pgrp = task_pgrp_vnr(p);
1526 psinfo->pr_sid = task_session_vnr(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001527
1528 i = p->state ? ffz(~p->state) + 1 : 0;
1529 psinfo->pr_state = i;
Carsten Otte55148542006-03-25 03:08:22 -08001530 psinfo->pr_sname = (i > 5) ? '.' : "RSDTZW"[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001531 psinfo->pr_zomb = psinfo->pr_sname == 'Z';
1532 psinfo->pr_nice = task_nice(p);
1533 psinfo->pr_flag = p->flags;
David Howellsc69e8d92008-11-14 10:39:19 +11001534 rcu_read_lock();
1535 cred = __task_cred(p);
Eric W. Biedermanebc887b2012-02-07 18:36:10 -08001536 SET_UID(psinfo->pr_uid, from_kuid_munged(cred->user_ns, cred->uid));
1537 SET_GID(psinfo->pr_gid, from_kgid_munged(cred->user_ns, cred->gid));
David Howellsc69e8d92008-11-14 10:39:19 +11001538 rcu_read_unlock();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001539 strncpy(psinfo->pr_fname, p->comm, sizeof(psinfo->pr_fname));
1540
1541 return 0;
1542}
1543
Roland McGrath3aba4812008-01-30 13:31:44 +01001544static void fill_auxv_note(struct memelfnote *note, struct mm_struct *mm)
1545{
1546 elf_addr_t *auxv = (elf_addr_t *) mm->saved_auxv;
1547 int i = 0;
1548 do
1549 i += 2;
1550 while (auxv[i - 2] != AT_NULL);
1551 fill_note(note, "CORE", NT_AUXV, i * sizeof(elf_addr_t), auxv);
1552}
1553
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001554static void fill_siginfo_note(struct memelfnote *note, user_siginfo_t *csigdata,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02001555 const kernel_siginfo_t *siginfo)
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001556{
1557 mm_segment_t old_fs = get_fs();
1558 set_fs(KERNEL_DS);
1559 copy_siginfo_to_user((user_siginfo_t __user *) csigdata, siginfo);
1560 set_fs(old_fs);
1561 fill_note(note, "CORE", NT_SIGINFO, sizeof(*csigdata), csigdata);
1562}
1563
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001564#define MAX_FILE_NOTE_SIZE (4*1024*1024)
1565/*
1566 * Format of NT_FILE note:
1567 *
1568 * long count -- how many files are mapped
1569 * long page_size -- units for file_ofs
1570 * array of [COUNT] elements of
1571 * long start
1572 * long end
1573 * long file_ofs
1574 * followed by COUNT filenames in ASCII: "FILE1" NUL "FILE2" NUL...
1575 */
Dan Aloni72023652013-09-30 13:45:02 -07001576static int fill_files_note(struct memelfnote *note)
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001577{
1578 struct vm_area_struct *vma;
1579 unsigned count, size, names_ofs, remaining, n;
1580 user_long_t *data;
1581 user_long_t *start_end_ofs;
1582 char *name_base, *name_curpos;
1583
1584 /* *Estimated* file count and total data size needed */
1585 count = current->mm->map_count;
Alexey Dobriyan60c9d922018-02-06 15:39:13 -08001586 if (count > UINT_MAX / 64)
1587 return -EINVAL;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001588 size = count * 64;
1589
1590 names_ofs = (2 + 3 * count) * sizeof(data[0]);
1591 alloc:
1592 if (size >= MAX_FILE_NOTE_SIZE) /* paranoia check */
Dan Aloni72023652013-09-30 13:45:02 -07001593 return -EINVAL;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001594 size = round_up(size, PAGE_SIZE);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001595 data = kvmalloc(size, GFP_KERNEL);
1596 if (ZERO_OR_NULL_PTR(data))
Dan Aloni72023652013-09-30 13:45:02 -07001597 return -ENOMEM;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001598
1599 start_end_ofs = data + 2;
1600 name_base = name_curpos = ((char *)data) + names_ofs;
1601 remaining = size - names_ofs;
1602 count = 0;
1603 for (vma = current->mm->mmap; vma != NULL; vma = vma->vm_next) {
1604 struct file *file;
1605 const char *filename;
1606
1607 file = vma->vm_file;
1608 if (!file)
1609 continue;
Miklos Szeredi9bf39ab2015-06-19 10:29:13 +02001610 filename = file_path(file, name_curpos, remaining);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001611 if (IS_ERR(filename)) {
1612 if (PTR_ERR(filename) == -ENAMETOOLONG) {
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001613 kvfree(data);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001614 size = size * 5 / 4;
1615 goto alloc;
1616 }
1617 continue;
1618 }
1619
Miklos Szeredi9bf39ab2015-06-19 10:29:13 +02001620 /* file_path() fills at the end, move name down */
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001621 /* n = strlen(filename) + 1: */
1622 n = (name_curpos + remaining) - filename;
1623 remaining = filename - name_curpos;
1624 memmove(name_curpos, filename, n);
1625 name_curpos += n;
1626
1627 *start_end_ofs++ = vma->vm_start;
1628 *start_end_ofs++ = vma->vm_end;
1629 *start_end_ofs++ = vma->vm_pgoff;
1630 count++;
1631 }
1632
1633 /* Now we know exact count of files, can store it */
1634 data[0] = count;
1635 data[1] = PAGE_SIZE;
1636 /*
1637 * Count usually is less than current->mm->map_count,
1638 * we need to move filenames down.
1639 */
1640 n = current->mm->map_count - count;
1641 if (n != 0) {
1642 unsigned shift_bytes = n * 3 * sizeof(data[0]);
1643 memmove(name_base - shift_bytes, name_base,
1644 name_curpos - name_base);
1645 name_curpos -= shift_bytes;
1646 }
1647
1648 size = name_curpos - (char *)data;
1649 fill_note(note, "CORE", NT_FILE, size, data);
Dan Aloni72023652013-09-30 13:45:02 -07001650 return 0;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001651}
1652
Roland McGrath4206d3a2008-01-30 13:31:45 +01001653#ifdef CORE_DUMP_USE_REGSET
1654#include <linux/regset.h>
1655
1656struct elf_thread_core_info {
1657 struct elf_thread_core_info *next;
1658 struct task_struct *task;
1659 struct elf_prstatus prstatus;
1660 struct memelfnote notes[0];
1661};
1662
1663struct elf_note_info {
1664 struct elf_thread_core_info *thread;
1665 struct memelfnote psinfo;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001666 struct memelfnote signote;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001667 struct memelfnote auxv;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001668 struct memelfnote files;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001669 user_siginfo_t csigdata;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001670 size_t size;
1671 int thread_notes;
1672};
1673
Roland McGrathd31472b2008-03-04 14:28:30 -08001674/*
1675 * When a regset has a writeback hook, we call it on each thread before
1676 * dumping user memory. On register window machines, this makes sure the
1677 * user memory backing the register data is up to date before we read it.
1678 */
1679static void do_thread_regset_writeback(struct task_struct *task,
1680 const struct user_regset *regset)
1681{
1682 if (regset->writeback)
1683 regset->writeback(task, regset, 1);
1684}
1685
H. J. Lu0953f65d2012-02-14 13:34:52 -08001686#ifndef PRSTATUS_SIZE
Dmitry Safonov90954e72016-09-05 16:33:06 +03001687#define PRSTATUS_SIZE(S, R) sizeof(S)
H. J. Lu0953f65d2012-02-14 13:34:52 -08001688#endif
1689
1690#ifndef SET_PR_FPVALID
Dmitry Safonov90954e72016-09-05 16:33:06 +03001691#define SET_PR_FPVALID(S, V, R) ((S)->pr_fpvalid = (V))
H. J. Lu0953f65d2012-02-14 13:34:52 -08001692#endif
1693
Roland McGrath4206d3a2008-01-30 13:31:45 +01001694static int fill_thread_core_info(struct elf_thread_core_info *t,
1695 const struct user_regset_view *view,
1696 long signr, size_t *total)
1697{
1698 unsigned int i;
Dave Martin27e64b42017-10-31 15:50:53 +00001699 unsigned int regset0_size = regset_size(t->task, &view->regsets[0]);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001700
1701 /*
1702 * NT_PRSTATUS is the one special case, because the regset data
1703 * goes into the pr_reg field inside the note contents, rather
1704 * than being the whole note contents. We fill the reset in here.
1705 * We assume that regset 0 is NT_PRSTATUS.
1706 */
1707 fill_prstatus(&t->prstatus, t->task, signr);
Dave Martin27e64b42017-10-31 15:50:53 +00001708 (void) view->regsets[0].get(t->task, &view->regsets[0], 0, regset0_size,
Dmitry Safonov90954e72016-09-05 16:33:06 +03001709 &t->prstatus.pr_reg, NULL);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001710
1711 fill_note(&t->notes[0], "CORE", NT_PRSTATUS,
Dave Martin27e64b42017-10-31 15:50:53 +00001712 PRSTATUS_SIZE(t->prstatus, regset0_size), &t->prstatus);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001713 *total += notesize(&t->notes[0]);
1714
Roland McGrathd31472b2008-03-04 14:28:30 -08001715 do_thread_regset_writeback(t->task, &view->regsets[0]);
1716
Roland McGrath4206d3a2008-01-30 13:31:45 +01001717 /*
1718 * Each other regset might generate a note too. For each regset
1719 * that has no core_note_type or is inactive, we leave t->notes[i]
1720 * all zero and we'll know to skip writing it later.
1721 */
1722 for (i = 1; i < view->n; ++i) {
1723 const struct user_regset *regset = &view->regsets[i];
Roland McGrathd31472b2008-03-04 14:28:30 -08001724 do_thread_regset_writeback(t->task, regset);
H. Peter Anvinc8e25252012-03-02 10:43:48 -08001725 if (regset->core_note_type && regset->get &&
Maciej W. Rozycki2f819db2018-05-15 23:32:45 +01001726 (!regset->active || regset->active(t->task, regset) > 0)) {
Roland McGrath4206d3a2008-01-30 13:31:45 +01001727 int ret;
Dave Martin27e64b42017-10-31 15:50:53 +00001728 size_t size = regset_size(t->task, regset);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001729 void *data = kmalloc(size, GFP_KERNEL);
1730 if (unlikely(!data))
1731 return 0;
1732 ret = regset->get(t->task, regset,
1733 0, size, data, NULL);
1734 if (unlikely(ret))
1735 kfree(data);
1736 else {
1737 if (regset->core_note_type != NT_PRFPREG)
1738 fill_note(&t->notes[i], "LINUX",
1739 regset->core_note_type,
1740 size, data);
1741 else {
Dmitry Safonov90954e72016-09-05 16:33:06 +03001742 SET_PR_FPVALID(&t->prstatus,
Dave Martin27e64b42017-10-31 15:50:53 +00001743 1, regset0_size);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001744 fill_note(&t->notes[i], "CORE",
1745 NT_PRFPREG, size, data);
1746 }
1747 *total += notesize(&t->notes[i]);
1748 }
1749 }
1750 }
1751
1752 return 1;
1753}
1754
1755static int fill_note_info(struct elfhdr *elf, int phdrs,
1756 struct elf_note_info *info,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02001757 const kernel_siginfo_t *siginfo, struct pt_regs *regs)
Roland McGrath4206d3a2008-01-30 13:31:45 +01001758{
1759 struct task_struct *dump_task = current;
1760 const struct user_regset_view *view = task_user_regset_view(dump_task);
1761 struct elf_thread_core_info *t;
1762 struct elf_prpsinfo *psinfo;
Oleg Nesterov83914442008-07-25 01:47:45 -07001763 struct core_thread *ct;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001764 unsigned int i;
1765
1766 info->size = 0;
1767 info->thread = NULL;
1768
1769 psinfo = kmalloc(sizeof(*psinfo), GFP_KERNEL);
Alan Cox6899e922012-12-17 16:02:09 -08001770 if (psinfo == NULL) {
1771 info->psinfo.data = NULL; /* So we don't free this wrongly */
Roland McGrath4206d3a2008-01-30 13:31:45 +01001772 return 0;
Alan Cox6899e922012-12-17 16:02:09 -08001773 }
Roland McGrath4206d3a2008-01-30 13:31:45 +01001774
Amerigo Wange2dbe122009-07-01 01:06:26 -04001775 fill_note(&info->psinfo, "CORE", NT_PRPSINFO, sizeof(*psinfo), psinfo);
1776
Roland McGrath4206d3a2008-01-30 13:31:45 +01001777 /*
1778 * Figure out how many notes we're going to need for each thread.
1779 */
1780 info->thread_notes = 0;
1781 for (i = 0; i < view->n; ++i)
1782 if (view->regsets[i].core_note_type != 0)
1783 ++info->thread_notes;
1784
1785 /*
1786 * Sanity check. We rely on regset 0 being in NT_PRSTATUS,
1787 * since it is our one special case.
1788 */
1789 if (unlikely(info->thread_notes == 0) ||
1790 unlikely(view->regsets[0].core_note_type != NT_PRSTATUS)) {
1791 WARN_ON(1);
1792 return 0;
1793 }
1794
1795 /*
1796 * Initialize the ELF file header.
1797 */
1798 fill_elf_header(elf, phdrs,
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001799 view->e_machine, view->e_flags);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001800
1801 /*
1802 * Allocate a structure for each thread.
1803 */
Oleg Nesterov83914442008-07-25 01:47:45 -07001804 for (ct = &dump_task->mm->core_state->dumper; ct; ct = ct->next) {
1805 t = kzalloc(offsetof(struct elf_thread_core_info,
1806 notes[info->thread_notes]),
1807 GFP_KERNEL);
1808 if (unlikely(!t))
1809 return 0;
Oleg Nesterov24d52882008-07-25 01:47:40 -07001810
Oleg Nesterov83914442008-07-25 01:47:45 -07001811 t->task = ct->task;
1812 if (ct->task == dump_task || !info->thread) {
1813 t->next = info->thread;
1814 info->thread = t;
1815 } else {
1816 /*
1817 * Make sure to keep the original task at
1818 * the head of the list.
1819 */
1820 t->next = info->thread->next;
1821 info->thread->next = t;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001822 }
Oleg Nesterov83914442008-07-25 01:47:45 -07001823 }
Roland McGrath4206d3a2008-01-30 13:31:45 +01001824
1825 /*
1826 * Now fill in each thread's information.
1827 */
1828 for (t = info->thread; t != NULL; t = t->next)
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07001829 if (!fill_thread_core_info(t, view, siginfo->si_signo, &info->size))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001830 return 0;
1831
1832 /*
1833 * Fill in the two process-wide notes.
1834 */
1835 fill_psinfo(psinfo, dump_task->group_leader, dump_task->mm);
1836 info->size += notesize(&info->psinfo);
1837
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001838 fill_siginfo_note(&info->signote, &info->csigdata, siginfo);
1839 info->size += notesize(&info->signote);
1840
Roland McGrath4206d3a2008-01-30 13:31:45 +01001841 fill_auxv_note(&info->auxv, current->mm);
1842 info->size += notesize(&info->auxv);
1843
Dan Aloni72023652013-09-30 13:45:02 -07001844 if (fill_files_note(&info->files) == 0)
1845 info->size += notesize(&info->files);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001846
Roland McGrath4206d3a2008-01-30 13:31:45 +01001847 return 1;
1848}
1849
1850static size_t get_note_info_size(struct elf_note_info *info)
1851{
1852 return info->size;
1853}
1854
1855/*
1856 * Write all the notes for each thread. When writing the first thread, the
1857 * process-wide notes are interleaved after the first thread-specific note.
1858 */
1859static int write_note_info(struct elf_note_info *info,
Al Viroecc8c772013-10-05 15:32:35 -04001860 struct coredump_params *cprm)
Roland McGrath4206d3a2008-01-30 13:31:45 +01001861{
Fabian Frederickb219e252014-06-04 16:12:14 -07001862 bool first = true;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001863 struct elf_thread_core_info *t = info->thread;
1864
1865 do {
1866 int i;
1867
Al Viroecc8c772013-10-05 15:32:35 -04001868 if (!writenote(&t->notes[0], cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001869 return 0;
1870
Al Viroecc8c772013-10-05 15:32:35 -04001871 if (first && !writenote(&info->psinfo, cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001872 return 0;
Al Viroecc8c772013-10-05 15:32:35 -04001873 if (first && !writenote(&info->signote, cprm))
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001874 return 0;
Al Viroecc8c772013-10-05 15:32:35 -04001875 if (first && !writenote(&info->auxv, cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001876 return 0;
Dan Aloni72023652013-09-30 13:45:02 -07001877 if (first && info->files.data &&
Al Viroecc8c772013-10-05 15:32:35 -04001878 !writenote(&info->files, cprm))
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001879 return 0;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001880
1881 for (i = 1; i < info->thread_notes; ++i)
1882 if (t->notes[i].data &&
Al Viroecc8c772013-10-05 15:32:35 -04001883 !writenote(&t->notes[i], cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001884 return 0;
1885
Fabian Frederickb219e252014-06-04 16:12:14 -07001886 first = false;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001887 t = t->next;
1888 } while (t);
1889
1890 return 1;
1891}
1892
1893static void free_note_info(struct elf_note_info *info)
1894{
1895 struct elf_thread_core_info *threads = info->thread;
1896 while (threads) {
1897 unsigned int i;
1898 struct elf_thread_core_info *t = threads;
1899 threads = t->next;
1900 WARN_ON(t->notes[0].data && t->notes[0].data != &t->prstatus);
1901 for (i = 1; i < info->thread_notes; ++i)
1902 kfree(t->notes[i].data);
1903 kfree(t);
1904 }
1905 kfree(info->psinfo.data);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001906 kvfree(info->files.data);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001907}
1908
1909#else
1910
Linus Torvalds1da177e2005-04-16 15:20:36 -07001911/* Here is the structure in which status of each thread is captured. */
1912struct elf_thread_status
1913{
1914 struct list_head list;
1915 struct elf_prstatus prstatus; /* NT_PRSTATUS */
1916 elf_fpregset_t fpu; /* NT_PRFPREG */
1917 struct task_struct *thread;
1918#ifdef ELF_CORE_COPY_XFPREGS
Mark Nelson5b20cd82007-10-16 23:25:39 -07001919 elf_fpxregset_t xfpu; /* ELF_CORE_XFPREG_TYPE */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001920#endif
1921 struct memelfnote notes[3];
1922 int num_notes;
1923};
1924
1925/*
1926 * In order to add the specific thread information for the elf file format,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001927 * we need to keep a linked list of every threads pr_status and then create
1928 * a single section for them in the final core file.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001929 */
1930static int elf_dump_thread_status(long signr, struct elf_thread_status *t)
1931{
1932 int sz = 0;
1933 struct task_struct *p = t->thread;
1934 t->num_notes = 0;
1935
1936 fill_prstatus(&t->prstatus, p, signr);
1937 elf_core_copy_task_regs(p, &t->prstatus.pr_reg);
1938
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001939 fill_note(&t->notes[0], "CORE", NT_PRSTATUS, sizeof(t->prstatus),
1940 &(t->prstatus));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001941 t->num_notes++;
1942 sz += notesize(&t->notes[0]);
1943
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001944 if ((t->prstatus.pr_fpvalid = elf_core_copy_task_fpregs(p, NULL,
1945 &t->fpu))) {
1946 fill_note(&t->notes[1], "CORE", NT_PRFPREG, sizeof(t->fpu),
1947 &(t->fpu));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001948 t->num_notes++;
1949 sz += notesize(&t->notes[1]);
1950 }
1951
1952#ifdef ELF_CORE_COPY_XFPREGS
1953 if (elf_core_copy_task_xfpregs(p, &t->xfpu)) {
Mark Nelson5b20cd82007-10-16 23:25:39 -07001954 fill_note(&t->notes[2], "LINUX", ELF_CORE_XFPREG_TYPE,
1955 sizeof(t->xfpu), &t->xfpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001956 t->num_notes++;
1957 sz += notesize(&t->notes[2]);
1958 }
1959#endif
1960 return sz;
1961}
1962
Roland McGrath3aba4812008-01-30 13:31:44 +01001963struct elf_note_info {
1964 struct memelfnote *notes;
Dan Aloni72023652013-09-30 13:45:02 -07001965 struct memelfnote *notes_files;
Roland McGrath3aba4812008-01-30 13:31:44 +01001966 struct elf_prstatus *prstatus; /* NT_PRSTATUS */
1967 struct elf_prpsinfo *psinfo; /* NT_PRPSINFO */
1968 struct list_head thread_list;
1969 elf_fpregset_t *fpu;
1970#ifdef ELF_CORE_COPY_XFPREGS
1971 elf_fpxregset_t *xfpu;
1972#endif
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001973 user_siginfo_t csigdata;
Roland McGrath3aba4812008-01-30 13:31:44 +01001974 int thread_status_size;
1975 int numnote;
1976};
1977
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001978static int elf_note_info_init(struct elf_note_info *info)
Roland McGrath3aba4812008-01-30 13:31:44 +01001979{
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001980 memset(info, 0, sizeof(*info));
Roland McGrath3aba4812008-01-30 13:31:44 +01001981 INIT_LIST_HEAD(&info->thread_list);
1982
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001983 /* Allocate space for ELF notes */
Kees Cook6da2ec52018-06-12 13:55:00 -07001984 info->notes = kmalloc_array(8, sizeof(struct memelfnote), GFP_KERNEL);
Roland McGrath3aba4812008-01-30 13:31:44 +01001985 if (!info->notes)
1986 return 0;
1987 info->psinfo = kmalloc(sizeof(*info->psinfo), GFP_KERNEL);
1988 if (!info->psinfo)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10001989 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01001990 info->prstatus = kmalloc(sizeof(*info->prstatus), GFP_KERNEL);
1991 if (!info->prstatus)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10001992 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01001993 info->fpu = kmalloc(sizeof(*info->fpu), GFP_KERNEL);
1994 if (!info->fpu)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10001995 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01001996#ifdef ELF_CORE_COPY_XFPREGS
1997 info->xfpu = kmalloc(sizeof(*info->xfpu), GFP_KERNEL);
1998 if (!info->xfpu)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10001999 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002000#endif
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002001 return 1;
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002002}
Roland McGrath3aba4812008-01-30 13:31:44 +01002003
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002004static int fill_note_info(struct elfhdr *elf, int phdrs,
2005 struct elf_note_info *info,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02002006 const kernel_siginfo_t *siginfo, struct pt_regs *regs)
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002007{
Al Viroafabada2013-10-14 07:39:56 -04002008 struct core_thread *ct;
2009 struct elf_thread_status *ets;
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002010
2011 if (!elf_note_info_init(info))
2012 return 0;
2013
Al Viroafabada2013-10-14 07:39:56 -04002014 for (ct = current->mm->core_state->dumper.next;
2015 ct; ct = ct->next) {
2016 ets = kzalloc(sizeof(*ets), GFP_KERNEL);
2017 if (!ets)
2018 return 0;
Oleg Nesterov24d52882008-07-25 01:47:40 -07002019
Al Viroafabada2013-10-14 07:39:56 -04002020 ets->thread = ct->task;
2021 list_add(&ets->list, &info->thread_list);
2022 }
Oleg Nesterov83914442008-07-25 01:47:45 -07002023
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002024 list_for_each_entry(ets, &info->thread_list, list) {
Al Viroafabada2013-10-14 07:39:56 -04002025 int sz;
Oleg Nesterov83914442008-07-25 01:47:45 -07002026
Al Viroafabada2013-10-14 07:39:56 -04002027 sz = elf_dump_thread_status(siginfo->si_signo, ets);
2028 info->thread_status_size += sz;
Roland McGrath3aba4812008-01-30 13:31:44 +01002029 }
2030 /* now collect the dump for the current */
2031 memset(info->prstatus, 0, sizeof(*info->prstatus));
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07002032 fill_prstatus(info->prstatus, current, siginfo->si_signo);
Roland McGrath3aba4812008-01-30 13:31:44 +01002033 elf_core_copy_regs(&info->prstatus->pr_reg, regs);
2034
2035 /* Set up header */
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08002036 fill_elf_header(elf, phdrs, ELF_ARCH, ELF_CORE_EFLAGS);
Roland McGrath3aba4812008-01-30 13:31:44 +01002037
2038 /*
2039 * Set up the notes in similar form to SVR4 core dumps made
2040 * with info from their /proc.
2041 */
2042
2043 fill_note(info->notes + 0, "CORE", NT_PRSTATUS,
2044 sizeof(*info->prstatus), info->prstatus);
2045 fill_psinfo(info->psinfo, current->group_leader, current->mm);
2046 fill_note(info->notes + 1, "CORE", NT_PRPSINFO,
2047 sizeof(*info->psinfo), info->psinfo);
2048
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07002049 fill_siginfo_note(info->notes + 2, &info->csigdata, siginfo);
2050 fill_auxv_note(info->notes + 3, current->mm);
Dan Aloni72023652013-09-30 13:45:02 -07002051 info->numnote = 4;
Roland McGrath3aba4812008-01-30 13:31:44 +01002052
Dan Aloni72023652013-09-30 13:45:02 -07002053 if (fill_files_note(info->notes + info->numnote) == 0) {
2054 info->notes_files = info->notes + info->numnote;
2055 info->numnote++;
2056 }
Roland McGrath3aba4812008-01-30 13:31:44 +01002057
2058 /* Try to dump the FPU. */
2059 info->prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, regs,
2060 info->fpu);
2061 if (info->prstatus->pr_fpvalid)
2062 fill_note(info->notes + info->numnote++,
2063 "CORE", NT_PRFPREG, sizeof(*info->fpu), info->fpu);
2064#ifdef ELF_CORE_COPY_XFPREGS
2065 if (elf_core_copy_task_xfpregs(current, info->xfpu))
2066 fill_note(info->notes + info->numnote++,
2067 "LINUX", ELF_CORE_XFPREG_TYPE,
2068 sizeof(*info->xfpu), info->xfpu);
2069#endif
2070
2071 return 1;
Roland McGrath3aba4812008-01-30 13:31:44 +01002072}
2073
2074static size_t get_note_info_size(struct elf_note_info *info)
2075{
2076 int sz = 0;
2077 int i;
2078
2079 for (i = 0; i < info->numnote; i++)
2080 sz += notesize(info->notes + i);
2081
2082 sz += info->thread_status_size;
2083
2084 return sz;
2085}
2086
2087static int write_note_info(struct elf_note_info *info,
Al Viroecc8c772013-10-05 15:32:35 -04002088 struct coredump_params *cprm)
Roland McGrath3aba4812008-01-30 13:31:44 +01002089{
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002090 struct elf_thread_status *ets;
Roland McGrath3aba4812008-01-30 13:31:44 +01002091 int i;
Roland McGrath3aba4812008-01-30 13:31:44 +01002092
2093 for (i = 0; i < info->numnote; i++)
Al Viroecc8c772013-10-05 15:32:35 -04002094 if (!writenote(info->notes + i, cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002095 return 0;
2096
2097 /* write out the thread status notes section */
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002098 list_for_each_entry(ets, &info->thread_list, list) {
2099 for (i = 0; i < ets->num_notes; i++)
2100 if (!writenote(&ets->notes[i], cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002101 return 0;
2102 }
2103
2104 return 1;
2105}
2106
2107static void free_note_info(struct elf_note_info *info)
2108{
2109 while (!list_empty(&info->thread_list)) {
2110 struct list_head *tmp = info->thread_list.next;
2111 list_del(tmp);
2112 kfree(list_entry(tmp, struct elf_thread_status, list));
2113 }
2114
Dan Aloni72023652013-09-30 13:45:02 -07002115 /* Free data possibly allocated by fill_files_note(): */
2116 if (info->notes_files)
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002117 kvfree(info->notes_files->data);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07002118
Roland McGrath3aba4812008-01-30 13:31:44 +01002119 kfree(info->prstatus);
2120 kfree(info->psinfo);
2121 kfree(info->notes);
2122 kfree(info->fpu);
2123#ifdef ELF_CORE_COPY_XFPREGS
2124 kfree(info->xfpu);
2125#endif
2126}
2127
Roland McGrath4206d3a2008-01-30 13:31:45 +01002128#endif
2129
Roland McGrathf47aef52007-01-26 00:56:49 -08002130static struct vm_area_struct *first_vma(struct task_struct *tsk,
2131 struct vm_area_struct *gate_vma)
2132{
2133 struct vm_area_struct *ret = tsk->mm->mmap;
2134
2135 if (ret)
2136 return ret;
2137 return gate_vma;
2138}
2139/*
2140 * Helper function for iterating across a vma list. It ensures that the caller
2141 * will visit `gate_vma' prior to terminating the search.
2142 */
2143static struct vm_area_struct *next_vma(struct vm_area_struct *this_vma,
2144 struct vm_area_struct *gate_vma)
2145{
2146 struct vm_area_struct *ret;
2147
2148 ret = this_vma->vm_next;
2149 if (ret)
2150 return ret;
2151 if (this_vma == gate_vma)
2152 return NULL;
2153 return gate_vma;
2154}
2155
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002156static void fill_extnum_info(struct elfhdr *elf, struct elf_shdr *shdr4extnum,
2157 elf_addr_t e_shoff, int segs)
2158{
2159 elf->e_shoff = e_shoff;
2160 elf->e_shentsize = sizeof(*shdr4extnum);
2161 elf->e_shnum = 1;
2162 elf->e_shstrndx = SHN_UNDEF;
2163
2164 memset(shdr4extnum, 0, sizeof(*shdr4extnum));
2165
2166 shdr4extnum->sh_type = SHT_NULL;
2167 shdr4extnum->sh_size = elf->e_shnum;
2168 shdr4extnum->sh_link = elf->e_shstrndx;
2169 shdr4extnum->sh_info = segs;
2170}
2171
Linus Torvalds1da177e2005-04-16 15:20:36 -07002172/*
2173 * Actual dumper
2174 *
2175 * This is a two-pass process; first we find the offsets of the bits,
2176 * and then they are actually written out. If we run out of core limit
2177 * we just truncate.
2178 */
Masami Hiramatsuf6151df2009-12-17 15:27:16 -08002179static int elf_core_dump(struct coredump_params *cprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002180{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002181 int has_dumped = 0;
2182 mm_segment_t fs;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002183 int segs, i;
2184 size_t vma_data_size = 0;
Roland McGrathf47aef52007-01-26 00:56:49 -08002185 struct vm_area_struct *vma, *gate_vma;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002186 struct elfhdr *elf = NULL;
Al Virocdc3d562013-10-05 22:24:29 -04002187 loff_t offset = 0, dataoff;
Dan Aloni72023652013-09-30 13:45:02 -07002188 struct elf_note_info info = { };
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002189 struct elf_phdr *phdr4note = NULL;
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002190 struct elf_shdr *shdr4extnum = NULL;
2191 Elf_Half e_phnum;
2192 elf_addr_t e_shoff;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002193 elf_addr_t *vma_filesz = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002194
2195 /*
2196 * We no longer stop all VM operations.
2197 *
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002198 * This is because those proceses that could possibly change map_count
2199 * or the mmap / vma pages are now blocked in do_exit on current
2200 * finishing this core dump.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002201 *
2202 * Only ptrace can touch these memory addresses, but it doesn't change
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002203 * the map_count or the pages allocated. So no possibility of crashing
Linus Torvalds1da177e2005-04-16 15:20:36 -07002204 * exists while dumping the mm->vm_next areas to the core file.
2205 */
2206
2207 /* alloc memory for large data structures: too large to be on stack */
2208 elf = kmalloc(sizeof(*elf), GFP_KERNEL);
2209 if (!elf)
WANG Cong5f719552008-05-06 12:45:35 +08002210 goto out;
KAMEZAWA Hiroyuki341c87b2009-06-30 11:41:23 -07002211 /*
2212 * The number of segs are recored into ELF header as 16bit value.
2213 * Please check DEFAULT_MAX_MAP_COUNT definition when you modify here.
2214 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002215 segs = current->mm->map_count;
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002216 segs += elf_core_extra_phdrs();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002217
Stephen Wilson31db58b2011-03-13 15:49:15 -04002218 gate_vma = get_gate_vma(current->mm);
Roland McGrathf47aef52007-01-26 00:56:49 -08002219 if (gate_vma != NULL)
2220 segs++;
2221
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002222 /* for notes section */
2223 segs++;
2224
2225 /* If segs > PN_XNUM(0xffff), then e_phnum overflows. To avoid
2226 * this, kernel supports extended numbering. Have a look at
2227 * include/linux/elf.h for further information. */
2228 e_phnum = segs > PN_XNUM ? PN_XNUM : segs;
2229
Roland McGrath3aba4812008-01-30 13:31:44 +01002230 /*
2231 * Collect all the non-memory information about the process for the
2232 * notes. This also sets up the file header.
2233 */
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07002234 if (!fill_note_info(elf, e_phnum, &info, cprm->siginfo, cprm->regs))
Roland McGrath3aba4812008-01-30 13:31:44 +01002235 goto cleanup;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002236
2237 has_dumped = 1;
Oleg Nesterov079148b2013-04-30 15:28:16 -07002238
Linus Torvalds1da177e2005-04-16 15:20:36 -07002239 fs = get_fs();
2240 set_fs(KERNEL_DS);
2241
Linus Torvalds1da177e2005-04-16 15:20:36 -07002242 offset += sizeof(*elf); /* Elf header */
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002243 offset += segs * sizeof(struct elf_phdr); /* Program headers */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002244
2245 /* Write notes phdr entry */
2246 {
Roland McGrath3aba4812008-01-30 13:31:44 +01002247 size_t sz = get_note_info_size(&info);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002248
Michael Ellermane5501492007-09-19 14:38:12 +10002249 sz += elf_coredump_extra_notes_size();
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +01002250
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002251 phdr4note = kmalloc(sizeof(*phdr4note), GFP_KERNEL);
2252 if (!phdr4note)
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -08002253 goto end_coredump;
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002254
2255 fill_elf_note_phdr(phdr4note, sz, offset);
2256 offset += sz;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002257 }
2258
Linus Torvalds1da177e2005-04-16 15:20:36 -07002259 dataoff = offset = roundup(offset, ELF_EXEC_PAGESIZE);
2260
Jason Baron30f74aa2016-12-12 16:46:40 -08002261 if (segs - 1 > ULONG_MAX / sizeof(*vma_filesz))
2262 goto end_coredump;
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002263 vma_filesz = kvmalloc(array_size(sizeof(*vma_filesz), (segs - 1)),
2264 GFP_KERNEL);
2265 if (ZERO_OR_NULL_PTR(vma_filesz))
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002266 goto end_coredump;
2267
2268 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
2269 vma = next_vma(vma, gate_vma)) {
2270 unsigned long dump_size;
2271
2272 dump_size = vma_dump_size(vma, cprm->mm_flags);
2273 vma_filesz[i++] = dump_size;
2274 vma_data_size += dump_size;
2275 }
2276
2277 offset += vma_data_size;
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002278 offset += elf_core_extra_data_size();
2279 e_shoff = offset;
2280
2281 if (e_phnum == PN_XNUM) {
2282 shdr4extnum = kmalloc(sizeof(*shdr4extnum), GFP_KERNEL);
2283 if (!shdr4extnum)
2284 goto end_coredump;
2285 fill_extnum_info(elf, shdr4extnum, e_shoff, segs);
2286 }
2287
2288 offset = dataoff;
2289
Al Viroecc8c772013-10-05 15:32:35 -04002290 if (!dump_emit(cprm, elf, sizeof(*elf)))
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002291 goto end_coredump;
2292
Al Viroecc8c772013-10-05 15:32:35 -04002293 if (!dump_emit(cprm, phdr4note, sizeof(*phdr4note)))
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002294 goto end_coredump;
2295
Linus Torvalds1da177e2005-04-16 15:20:36 -07002296 /* Write program headers for segments dump */
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002297 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
Roland McGrathf47aef52007-01-26 00:56:49 -08002298 vma = next_vma(vma, gate_vma)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002299 struct elf_phdr phdr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002300
2301 phdr.p_type = PT_LOAD;
2302 phdr.p_offset = offset;
2303 phdr.p_vaddr = vma->vm_start;
2304 phdr.p_paddr = 0;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002305 phdr.p_filesz = vma_filesz[i++];
Roland McGrath82df3972007-10-16 23:27:02 -07002306 phdr.p_memsz = vma->vm_end - vma->vm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002307 offset += phdr.p_filesz;
2308 phdr.p_flags = vma->vm_flags & VM_READ ? PF_R : 0;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002309 if (vma->vm_flags & VM_WRITE)
2310 phdr.p_flags |= PF_W;
2311 if (vma->vm_flags & VM_EXEC)
2312 phdr.p_flags |= PF_X;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002313 phdr.p_align = ELF_EXEC_PAGESIZE;
2314
Al Viroecc8c772013-10-05 15:32:35 -04002315 if (!dump_emit(cprm, &phdr, sizeof(phdr)))
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -08002316 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002317 }
2318
Al Viro506f21c2013-10-05 17:22:57 -04002319 if (!elf_core_write_extra_phdrs(cprm, offset))
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002320 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002321
2322 /* write out the notes section */
Al Viroecc8c772013-10-05 15:32:35 -04002323 if (!write_note_info(&info, cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002324 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002325
Al Virocdc3d562013-10-05 22:24:29 -04002326 if (elf_coredump_extra_notes_write(cprm))
Michael Ellermane5501492007-09-19 14:38:12 +10002327 goto end_coredump;
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +01002328
Andi Kleend025c9d2006-09-30 23:29:28 -07002329 /* Align to page */
Mateusz Guzik1607f092016-06-05 23:14:14 +02002330 if (!dump_skip(cprm, dataoff - cprm->pos))
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002331 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002332
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002333 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
Roland McGrathf47aef52007-01-26 00:56:49 -08002334 vma = next_vma(vma, gate_vma)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002335 unsigned long addr;
Roland McGrath82df3972007-10-16 23:27:02 -07002336 unsigned long end;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002337
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002338 end = vma->vm_start + vma_filesz[i++];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002339
Roland McGrath82df3972007-10-16 23:27:02 -07002340 for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002341 struct page *page;
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002342 int stop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002343
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002344 page = get_dump_page(addr);
2345 if (page) {
2346 void *kaddr = kmap(page);
Al Viro13046ec2013-10-05 18:08:47 -04002347 stop = !dump_emit(cprm, kaddr, PAGE_SIZE);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002348 kunmap(page);
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03002349 put_page(page);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002350 } else
Al Viro9b56d542013-10-08 09:26:08 -04002351 stop = !dump_skip(cprm, PAGE_SIZE);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002352 if (stop)
2353 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002354 }
2355 }
Dave Kleikamp4d22c752017-01-11 13:25:00 -06002356 dump_truncate(cprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002357
Al Viroaa3e7ea2013-10-05 17:50:15 -04002358 if (!elf_core_write_extra_data(cprm))
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002359 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002360
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002361 if (e_phnum == PN_XNUM) {
Al Viro13046ec2013-10-05 18:08:47 -04002362 if (!dump_emit(cprm, shdr4extnum, sizeof(*shdr4extnum)))
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002363 goto end_coredump;
2364 }
2365
Linus Torvalds1da177e2005-04-16 15:20:36 -07002366end_coredump:
2367 set_fs(fs);
2368
2369cleanup:
Roland McGrath3aba4812008-01-30 13:31:44 +01002370 free_note_info(&info);
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002371 kfree(shdr4extnum);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002372 kvfree(vma_filesz);
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002373 kfree(phdr4note);
WANG Cong5f719552008-05-06 12:45:35 +08002374 kfree(elf);
2375out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002376 return has_dumped;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002377}
2378
Christoph Hellwig698ba7b2009-12-15 16:47:37 -08002379#endif /* CONFIG_ELF_CORE */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002380
2381static int __init init_elf_binfmt(void)
2382{
Al Viro8fc3dc52012-03-17 03:05:16 -04002383 register_binfmt(&elf_format);
2384 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002385}
2386
2387static void __exit exit_elf_binfmt(void)
2388{
2389 /* Remove the COFF and ELF loaders. */
2390 unregister_binfmt(&elf_format);
2391}
2392
2393core_initcall(init_elf_binfmt);
2394module_exit(exit_elf_binfmt);
2395MODULE_LICENSE("GPL");