blob: cec3b4146440033cb65136f384db3b18197ebfc0 [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,
Jiri Kosinacc503c12008-01-30 13:31:07 +0100547 struct file *interpreter, unsigned long *interp_map_addr,
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;
593 if (!*interp_map_addr)
594 *interp_map_addr = map_addr;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700595 error = map_addr;
596 if (BAD_ADDR(map_addr))
Paul Burtona9d9ef12014-09-11 08:30:15 +0100597 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700598
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700599 if (!load_addr_set &&
600 interp_elf_ex->e_type == ET_DYN) {
601 load_addr = map_addr - ELF_PAGESTART(vaddr);
602 load_addr_set = 1;
603 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700604
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700605 /*
606 * Check to see if the section's size will overflow the
607 * allowed task size. Note that p_filesz must always be
608 * <= p_memsize so it's only necessary to check p_memsz.
609 */
610 k = load_addr + eppnt->p_vaddr;
Chuck Ebbertce510592006-07-03 00:24:14 -0700611 if (BAD_ADDR(k) ||
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700612 eppnt->p_filesz > eppnt->p_memsz ||
613 eppnt->p_memsz > TASK_SIZE ||
614 TASK_SIZE - eppnt->p_memsz < k) {
615 error = -ENOMEM;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100616 goto out;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700617 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700618
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700619 /*
620 * Find the end of the file mapping for this phdr, and
621 * keep track of the largest address we see for this.
622 */
623 k = load_addr + eppnt->p_vaddr + eppnt->p_filesz;
624 if (k > elf_bss)
625 elf_bss = k;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700626
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700627 /*
628 * Do the same thing for the memory mapping - between
629 * elf_bss and last_bss is the bss section.
630 */
Kees Cook0036d1f2016-08-02 14:04:51 -0700631 k = load_addr + eppnt->p_vaddr + eppnt->p_memsz;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800632 if (k > last_bss) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700633 last_bss = k;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800634 bss_prot = elf_prot;
635 }
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700636 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700637 }
638
Kees Cook0036d1f2016-08-02 14:04:51 -0700639 /*
640 * Now fill out the bss section: first pad the last page from
641 * the file up to the page boundary, and zero it from elf_bss
642 * up to the end of the page.
643 */
644 if (padzero(elf_bss)) {
645 error = -EFAULT;
646 goto out;
647 }
648 /*
649 * Next, align both the file and mem bss up to the page size,
650 * since this is where elf_bss was just zeroed up to, and where
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800651 * last_bss will end after the vm_brk_flags() below.
Kees Cook0036d1f2016-08-02 14:04:51 -0700652 */
653 elf_bss = ELF_PAGEALIGN(elf_bss);
654 last_bss = ELF_PAGEALIGN(last_bss);
655 /* Finally, if there is still more bss to allocate, do it. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700656 if (last_bss > elf_bss) {
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800657 error = vm_brk_flags(elf_bss, last_bss - elf_bss,
658 bss_prot & PROT_EXEC ? VM_EXEC : 0);
Linus Torvalds5d22fc22016-05-27 15:57:31 -0700659 if (error)
Paul Burtona9d9ef12014-09-11 08:30:15 +0100660 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700661 }
662
Jiri Kosinacc503c12008-01-30 13:31:07 +0100663 error = load_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700664out:
665 return error;
666}
667
Linus Torvalds1da177e2005-04-16 15:20:36 -0700668/*
669 * These are the functions used to load ELF style executables and shared
670 * libraries. There is no binary dependent code anywhere else.
671 */
672
Al Viro71613c32012-10-20 22:00:48 -0400673static int load_elf_binary(struct linux_binprm *bprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700674{
675 struct file *interpreter = NULL; /* to shut gcc up */
676 unsigned long load_addr = 0, load_bias = 0;
677 int load_addr_set = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700678 unsigned long error;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100679 struct elf_phdr *elf_ppnt, *elf_phdata, *interp_elf_phdata = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700680 unsigned long elf_bss, elf_brk;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800681 int bss_prot = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700682 int retval, i;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100683 unsigned long elf_entry;
684 unsigned long interp_load_addr = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700685 unsigned long start_code, end_code, start_data, end_data;
David Daney1a530a62011-03-22 16:34:48 -0700686 unsigned long reloc_func_desc __maybe_unused = 0;
David Rientjes8de61e62006-12-06 20:40:16 -0800687 int executable_stack = EXSTACK_DEFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700688 struct {
689 struct elfhdr elf_ex;
690 struct elfhdr interp_elf_ex;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700691 } *loc;
Paul Burton774c1052014-09-11 08:30:16 +0100692 struct arch_elf_state arch_state = INIT_ARCH_ELF_STATE;
Alexey Dobriyan249b08e2019-05-14 15:43:54 -0700693 struct pt_regs *regs;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700694
695 loc = kmalloc(sizeof(*loc), GFP_KERNEL);
696 if (!loc) {
697 retval = -ENOMEM;
698 goto out_ret;
699 }
700
701 /* Get the exec-header */
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700702 loc->elf_ex = *((struct elfhdr *)bprm->buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700703
704 retval = -ENOEXEC;
705 /* First of all, some simple consistency checks */
706 if (memcmp(loc->elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
707 goto out;
708
709 if (loc->elf_ex.e_type != ET_EXEC && loc->elf_ex.e_type != ET_DYN)
710 goto out;
711 if (!elf_check_arch(&loc->elf_ex))
712 goto out;
Nicolas Pitre47552002017-08-16 16:05:13 -0400713 if (elf_check_fdpic(&loc->elf_ex))
714 goto out;
Al Viro72c2d532013-09-22 16:27:52 -0400715 if (!bprm->file->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700716 goto out;
717
Paul Burton6a8d3892014-09-11 08:30:14 +0100718 elf_phdata = load_elf_phdrs(&loc->elf_ex, bprm->file);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700719 if (!elf_phdata)
720 goto out;
721
Linus Torvalds1da177e2005-04-16 15:20:36 -0700722 elf_ppnt = elf_phdata;
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700723 for (i = 0; i < loc->elf_ex.e_phnum; i++, elf_ppnt++) {
724 char *elf_interpreter;
725 loff_t pos;
Alexey Dobriyan5cf4a362019-05-14 15:43:36 -0700726
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700727 if (elf_ppnt->p_type != PT_INTERP)
728 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700729
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700730 /*
731 * This is the program interpreter used for shared libraries -
732 * for now assume that this is an a.out format binary.
733 */
734 retval = -ENOEXEC;
735 if (elf_ppnt->p_filesz > PATH_MAX || elf_ppnt->p_filesz < 2)
736 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700737
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700738 retval = -ENOMEM;
739 elf_interpreter = kmalloc(elf_ppnt->p_filesz, GFP_KERNEL);
740 if (!elf_interpreter)
741 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700742
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700743 pos = elf_ppnt->p_offset;
744 retval = kernel_read(bprm->file, elf_interpreter,
745 elf_ppnt->p_filesz, &pos);
746 if (retval != elf_ppnt->p_filesz) {
747 if (retval >= 0)
748 retval = -EIO;
749 goto out_free_interp;
750 }
751 /* make sure path is NULL terminated */
752 retval = -ENOEXEC;
753 if (elf_interpreter[elf_ppnt->p_filesz - 1] != '\0')
754 goto out_free_interp;
Alexey Dobriyan1fb84492007-01-26 00:57:16 -0800755
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700756 interpreter = open_exec(elf_interpreter);
757 kfree(elf_interpreter);
758 retval = PTR_ERR(interpreter);
759 if (IS_ERR(interpreter))
760 goto out_free_ph;
Alexey Dobriyan1fb84492007-01-26 00:57:16 -0800761
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700762 /*
763 * If the binary is not readable then enforce mm->dumpable = 0
764 * regardless of the interpreter's permissions.
765 */
766 would_dump(bprm, interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700767
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700768 /* Get the exec headers */
769 pos = 0;
770 retval = kernel_read(interpreter, &loc->interp_elf_ex,
771 sizeof(loc->interp_elf_ex), &pos);
772 if (retval != sizeof(loc->interp_elf_ex)) {
773 if (retval >= 0)
774 retval = -EIO;
775 goto out_free_dentry;
776 }
777
778 break;
Alexey Dobriyancc338012019-05-14 15:43:39 -0700779
780out_free_interp:
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700781 kfree(elf_interpreter);
782 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700783 }
784
785 elf_ppnt = elf_phdata;
786 for (i = 0; i < loc->elf_ex.e_phnum; i++, elf_ppnt++)
Paul Burton774c1052014-09-11 08:30:16 +0100787 switch (elf_ppnt->p_type) {
788 case PT_GNU_STACK:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700789 if (elf_ppnt->p_flags & PF_X)
790 executable_stack = EXSTACK_ENABLE_X;
791 else
792 executable_stack = EXSTACK_DISABLE_X;
793 break;
Paul Burton774c1052014-09-11 08:30:16 +0100794
795 case PT_LOPROC ... PT_HIPROC:
796 retval = arch_elf_pt_proc(&loc->elf_ex, elf_ppnt,
797 bprm->file, false,
798 &arch_state);
799 if (retval)
800 goto out_free_dentry;
801 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700802 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700803
804 /* Some simple consistency checks for the interpreter */
Alexey Dobriyancc338012019-05-14 15:43:39 -0700805 if (interpreter) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700806 retval = -ELIBBAD;
Andi Kleend20894a2008-02-08 04:21:54 -0800807 /* Not an ELF interpreter */
808 if (memcmp(loc->interp_elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700809 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700810 /* Verify the interpreter has a valid arch */
Nicolas Pitre47552002017-08-16 16:05:13 -0400811 if (!elf_check_arch(&loc->interp_elf_ex) ||
812 elf_check_fdpic(&loc->interp_elf_ex))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700813 goto out_free_dentry;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100814
815 /* Load the interpreter program headers */
816 interp_elf_phdata = load_elf_phdrs(&loc->interp_elf_ex,
817 interpreter);
818 if (!interp_elf_phdata)
819 goto out_free_dentry;
Paul Burton774c1052014-09-11 08:30:16 +0100820
821 /* Pass PT_LOPROC..PT_HIPROC headers to arch code */
822 elf_ppnt = interp_elf_phdata;
823 for (i = 0; i < loc->interp_elf_ex.e_phnum; i++, elf_ppnt++)
824 switch (elf_ppnt->p_type) {
825 case PT_LOPROC ... PT_HIPROC:
826 retval = arch_elf_pt_proc(&loc->interp_elf_ex,
827 elf_ppnt, interpreter,
828 true, &arch_state);
829 if (retval)
830 goto out_free_dentry;
831 break;
832 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700833 }
834
Paul Burton774c1052014-09-11 08:30:16 +0100835 /*
836 * Allow arch code to reject the ELF at this point, whilst it's
837 * still possible to return an error to the code that invoked
838 * the exec syscall.
839 */
Maciej W. Rozyckieb4bc072015-11-13 00:47:48 +0000840 retval = arch_check_elf(&loc->elf_ex,
841 !!interpreter, &loc->interp_elf_ex,
842 &arch_state);
Paul Burton774c1052014-09-11 08:30:16 +0100843 if (retval)
844 goto out_free_dentry;
845
Linus Torvalds1da177e2005-04-16 15:20:36 -0700846 /* Flush all traces of the currently running executable */
847 retval = flush_old_exec(bprm);
848 if (retval)
849 goto out_free_dentry;
850
Linus Torvalds1da177e2005-04-16 15:20:36 -0700851 /* Do this immediately, since STACK_TOP as used in setup_arg_pages
852 may depend on the personality. */
Paul Burton774c1052014-09-11 08:30:16 +0100853 SET_PERSONALITY2(loc->elf_ex, &arch_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700854 if (elf_read_implies_exec(loc->elf_ex, executable_stack))
855 current->personality |= READ_IMPLIES_EXEC;
856
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700857 if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700858 current->flags |= PF_RANDOMIZE;
Linus Torvalds221af7f2010-01-28 22:14:42 -0800859
860 setup_new_exec(bprm);
Linus Torvalds9f834ec2016-08-22 16:41:46 -0700861 install_exec_creds(bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700862
863 /* Do this so that we can load the interpreter, if need be. We will
864 change some of these later */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700865 retval = setup_arg_pages(bprm, randomize_stack_top(STACK_TOP),
866 executable_stack);
Al Viro19d860a2014-05-04 20:11:36 -0400867 if (retval < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700868 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700869
Alexey Dobriyan852643162019-05-14 15:43:48 -0700870 elf_bss = 0;
871 elf_brk = 0;
872
873 start_code = ~0UL;
874 end_code = 0;
875 start_data = 0;
876 end_data = 0;
877
André Goddard Rosaaf901ca2009-11-14 13:09:05 -0200878 /* Now we do a little grungy work by mmapping the ELF image into
Jiri Kosinacc503c12008-01-30 13:31:07 +0100879 the correct location in memory. */
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700880 for(i = 0, elf_ppnt = elf_phdata;
881 i < loc->elf_ex.e_phnum; i++, elf_ppnt++) {
Alexey Dobriyand8e7cb32019-05-14 15:43:51 -0700882 int elf_prot, elf_flags, elf_fixed = MAP_FIXED_NOREPLACE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700883 unsigned long k, vaddr;
Michael Davidsona87938b2015-04-14 15:47:38 -0700884 unsigned long total_size = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700885
886 if (elf_ppnt->p_type != PT_LOAD)
887 continue;
888
889 if (unlikely (elf_brk > elf_bss)) {
890 unsigned long nbyte;
891
892 /* There was a PT_LOAD segment with p_memsz > p_filesz
893 before this one. Map anonymous pages, if needed,
894 and clear the area. */
Mikael Petterssonf670d0e2011-01-12 17:00:02 -0800895 retval = set_brk(elf_bss + load_bias,
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800896 elf_brk + load_bias,
897 bss_prot);
Al Viro19d860a2014-05-04 20:11:36 -0400898 if (retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700899 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700900 nbyte = ELF_PAGEOFFSET(elf_bss);
901 if (nbyte) {
902 nbyte = ELF_MIN_ALIGN - nbyte;
903 if (nbyte > elf_brk - elf_bss)
904 nbyte = elf_brk - elf_bss;
905 if (clear_user((void __user *)elf_bss +
906 load_bias, nbyte)) {
907 /*
908 * This bss-zeroing can fail if the ELF
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700909 * file specifies odd protections. So
Linus Torvalds1da177e2005-04-16 15:20:36 -0700910 * we don't check the return value
911 */
912 }
913 }
Michal Hockoad55eac2018-04-10 16:36:05 -0700914
915 /*
916 * Some binaries have overlapping elf segments and then
917 * we have to forcefully map over an existing mapping
918 * e.g. over this newly established brk mapping.
919 */
920 elf_fixed = MAP_FIXED;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700921 }
922
Alexey Dobriyand8e7cb32019-05-14 15:43:51 -0700923 elf_prot = make_prot(elf_ppnt->p_flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700924
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700925 elf_flags = MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700926
927 vaddr = elf_ppnt->p_vaddr;
Kees Cookeab09532017-07-10 15:52:37 -0700928 /*
929 * If we are loading ET_EXEC or we have already performed
930 * the ET_DYN load_addr calculations, proceed normally.
931 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700932 if (loc->elf_ex.e_type == ET_EXEC || load_addr_set) {
Michal Hockoad55eac2018-04-10 16:36:05 -0700933 elf_flags |= elf_fixed;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700934 } else if (loc->elf_ex.e_type == ET_DYN) {
Kees Cookeab09532017-07-10 15:52:37 -0700935 /*
936 * This logic is run once for the first LOAD Program
937 * Header for ET_DYN binaries to calculate the
938 * randomization (load_bias) for all the LOAD
939 * Program Headers, and to calculate the entire
940 * size of the ELF mapping (total_size). (Note that
941 * load_addr_set is set to true later once the
942 * initial mapping is performed.)
943 *
944 * There are effectively two types of ET_DYN
945 * binaries: programs (i.e. PIE: ET_DYN with INTERP)
946 * and loaders (ET_DYN without INTERP, since they
947 * _are_ the ELF interpreter). The loaders must
948 * be loaded away from programs since the program
949 * may otherwise collide with the loader (especially
950 * for ET_EXEC which does not have a randomized
951 * position). For example to handle invocations of
952 * "./ld.so someprog" to test out a new version of
953 * the loader, the subsequent program that the
954 * loader loads must avoid the loader itself, so
955 * they cannot share the same load range. Sufficient
956 * room for the brk must be allocated with the
957 * loader as well, since brk must be available with
958 * the loader.
959 *
960 * Therefore, programs are loaded offset from
961 * ELF_ET_DYN_BASE and loaders are loaded into the
962 * independently randomized mmap region (0 load_bias
963 * without MAP_FIXED).
964 */
Alexey Dobriyancc338012019-05-14 15:43:39 -0700965 if (interpreter) {
Kees Cookeab09532017-07-10 15:52:37 -0700966 load_bias = ELF_ET_DYN_BASE;
967 if (current->flags & PF_RANDOMIZE)
968 load_bias += arch_mmap_rnd();
Michal Hockoad55eac2018-04-10 16:36:05 -0700969 elf_flags |= elf_fixed;
Kees Cookeab09532017-07-10 15:52:37 -0700970 } else
971 load_bias = 0;
972
973 /*
974 * Since load_bias is used for all subsequent loading
975 * calculations, we must lower it by the first vaddr
976 * so that the remaining calculations based on the
977 * ELF vaddrs will be correctly offset. The result
978 * is then page aligned.
979 */
980 load_bias = ELF_PAGESTART(load_bias - vaddr);
981
Michael Davidsona87938b2015-04-14 15:47:38 -0700982 total_size = total_mapping_size(elf_phdata,
983 loc->elf_ex.e_phnum);
984 if (!total_size) {
Andrew Morton2b1d3ae2015-05-28 15:44:24 -0700985 retval = -EINVAL;
Michael Davidsona87938b2015-04-14 15:47:38 -0700986 goto out_free_dentry;
987 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700988 }
989
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700990 error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt,
Michael Davidsona87938b2015-04-14 15:47:38 -0700991 elf_prot, elf_flags, total_size);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700992 if (BAD_ADDR(error)) {
Alexey Kuznetsovb140f2512007-05-08 00:31:57 -0700993 retval = IS_ERR((void *)error) ?
994 PTR_ERR((void*)error) : -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700995 goto out_free_dentry;
996 }
997
998 if (!load_addr_set) {
999 load_addr_set = 1;
1000 load_addr = (elf_ppnt->p_vaddr - elf_ppnt->p_offset);
1001 if (loc->elf_ex.e_type == ET_DYN) {
1002 load_bias += error -
1003 ELF_PAGESTART(load_bias + vaddr);
1004 load_addr += load_bias;
1005 reloc_func_desc = load_bias;
1006 }
1007 }
1008 k = elf_ppnt->p_vaddr;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001009 if (k < start_code)
1010 start_code = k;
1011 if (start_data < k)
1012 start_data = k;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001013
1014 /*
1015 * Check to see if the section's size will overflow the
1016 * allowed task size. Note that p_filesz must always be
1017 * <= p_memsz so it is only necessary to check p_memsz.
1018 */
Chuck Ebbertce510592006-07-03 00:24:14 -07001019 if (BAD_ADDR(k) || elf_ppnt->p_filesz > elf_ppnt->p_memsz ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07001020 elf_ppnt->p_memsz > TASK_SIZE ||
1021 TASK_SIZE - elf_ppnt->p_memsz < k) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001022 /* set_brk can never work. Avoid overflows. */
Alexey Kuznetsovb140f2512007-05-08 00:31:57 -07001023 retval = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001024 goto out_free_dentry;
1025 }
1026
1027 k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz;
1028
1029 if (k > elf_bss)
1030 elf_bss = k;
1031 if ((elf_ppnt->p_flags & PF_X) && end_code < k)
1032 end_code = k;
1033 if (end_data < k)
1034 end_data = k;
1035 k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz;
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001036 if (k > elf_brk) {
1037 bss_prot = elf_prot;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001038 elf_brk = k;
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001039 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001040 }
1041
1042 loc->elf_ex.e_entry += load_bias;
1043 elf_bss += load_bias;
1044 elf_brk += load_bias;
1045 start_code += load_bias;
1046 end_code += load_bias;
1047 start_data += load_bias;
1048 end_data += load_bias;
1049
1050 /* Calling set_brk effectively mmaps the pages that we need
1051 * for the bss and break sections. We must do this before
1052 * mapping in the interpreter, to make sure it doesn't wind
1053 * up getting placed where the bss needs to go.
1054 */
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001055 retval = set_brk(elf_bss, elf_brk, bss_prot);
Al Viro19d860a2014-05-04 20:11:36 -04001056 if (retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001057 goto out_free_dentry;
akpm@osdl.org6de50512005-10-11 08:29:08 -07001058 if (likely(elf_bss != elf_brk) && unlikely(padzero(elf_bss))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001059 retval = -EFAULT; /* Nobody gets to see this, but.. */
1060 goto out_free_dentry;
1061 }
1062
Alexey Dobriyancc338012019-05-14 15:43:39 -07001063 if (interpreter) {
Alan Cox6eec4822012-10-04 17:13:42 -07001064 unsigned long interp_map_addr = 0;
Jiri Kosinacc503c12008-01-30 13:31:07 +01001065
Andi Kleend20894a2008-02-08 04:21:54 -08001066 elf_entry = load_elf_interp(&loc->interp_elf_ex,
1067 interpreter,
1068 &interp_map_addr,
Paul Burtona9d9ef12014-09-11 08:30:15 +01001069 load_bias, interp_elf_phdata);
Andi Kleend20894a2008-02-08 04:21:54 -08001070 if (!IS_ERR((void *)elf_entry)) {
1071 /*
1072 * load_elf_interp() returns relocation
1073 * adjustment
1074 */
1075 interp_load_addr = elf_entry;
1076 elf_entry += loc->interp_elf_ex.e_entry;
Jiri Kosinacc503c12008-01-30 13:31:07 +01001077 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001078 if (BAD_ADDR(elf_entry)) {
Chuck Ebbertce510592006-07-03 00:24:14 -07001079 retval = IS_ERR((void *)elf_entry) ?
1080 (int)elf_entry : -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001081 goto out_free_dentry;
1082 }
1083 reloc_func_desc = interp_load_addr;
1084
1085 allow_write_access(interpreter);
1086 fput(interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001087 } else {
1088 elf_entry = loc->elf_ex.e_entry;
Suresh Siddha5342fba2006-02-26 04:18:28 +01001089 if (BAD_ADDR(elf_entry)) {
Chuck Ebbertce510592006-07-03 00:24:14 -07001090 retval = -EINVAL;
Suresh Siddha5342fba2006-02-26 04:18:28 +01001091 goto out_free_dentry;
1092 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001093 }
1094
Paul Burton774c1052014-09-11 08:30:16 +01001095 kfree(interp_elf_phdata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001096 kfree(elf_phdata);
1097
Linus Torvalds1da177e2005-04-16 15:20:36 -07001098 set_binfmt(&elf_format);
1099
Benjamin Herrenschmidt547ee842005-04-16 15:24:35 -07001100#ifdef ARCH_HAS_SETUP_ADDITIONAL_PAGES
Alexey Dobriyancc338012019-05-14 15:43:39 -07001101 retval = arch_setup_additional_pages(bprm, !!interpreter);
Al Viro19d860a2014-05-04 20:11:36 -04001102 if (retval < 0)
Roland McGrath18c8baff2005-04-28 15:17:19 -07001103 goto out;
Benjamin Herrenschmidt547ee842005-04-16 15:24:35 -07001104#endif /* ARCH_HAS_SETUP_ADDITIONAL_PAGES */
1105
Ollie Wildb6a2fea2007-07-19 01:48:16 -07001106 retval = create_elf_tables(bprm, &loc->elf_ex,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001107 load_addr, interp_load_addr);
Al Viro19d860a2014-05-04 20:11:36 -04001108 if (retval < 0)
Ollie Wildb6a2fea2007-07-19 01:48:16 -07001109 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001110 current->mm->end_code = end_code;
1111 current->mm->start_code = start_code;
1112 current->mm->start_data = start_data;
1113 current->mm->end_data = end_data;
1114 current->mm->start_stack = bprm->p;
1115
Jiri Kosina4471a672011-04-14 15:22:09 -07001116 if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1)) {
Kees Cookbbdc6072019-05-14 15:43:57 -07001117 /*
1118 * For architectures with ELF randomization, when executing
1119 * a loader directly (i.e. no interpreter listed in ELF
1120 * headers), move the brk area out of the mmap region
1121 * (since it grows up, and may collide early with the stack
1122 * growing down), and into the unused ELF_ET_DYN_BASE region.
1123 */
1124 if (IS_ENABLED(CONFIG_ARCH_HAS_ELF_RANDOMIZE) && !interpreter)
1125 current->mm->brk = current->mm->start_brk =
1126 ELF_ET_DYN_BASE;
1127
Jiri Kosinac1d171a2008-01-30 13:30:40 +01001128 current->mm->brk = current->mm->start_brk =
1129 arch_randomize_brk(current->mm);
Kees Cook204db6e2015-04-14 15:48:12 -07001130#ifdef compat_brk_randomized
Jiri Kosina4471a672011-04-14 15:22:09 -07001131 current->brk_randomized = 1;
1132#endif
1133 }
Jiri Kosinac1d171a2008-01-30 13:30:40 +01001134
Linus Torvalds1da177e2005-04-16 15:20:36 -07001135 if (current->personality & MMAP_PAGE_ZERO) {
1136 /* Why this, you ask??? Well SVr4 maps page 0 as read-only,
1137 and some applications "depend" upon this behavior.
1138 Since we do not have the power to recompile these, we
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001139 emulate the SVr4 behavior. Sigh. */
Linus Torvalds6be5ceb2012-04-20 17:13:58 -07001140 error = vm_mmap(NULL, 0, PAGE_SIZE, PROT_READ | PROT_EXEC,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001141 MAP_FIXED | MAP_PRIVATE, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001142 }
1143
Alexey Dobriyan249b08e2019-05-14 15:43:54 -07001144 regs = current_pt_regs();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001145#ifdef ELF_PLAT_INIT
1146 /*
1147 * The ABI may specify that certain registers be set up in special
1148 * ways (on i386 %edx is the address of a DT_FINI function, for
1149 * example. In addition, it may also specify (eg, PowerPC64 ELF)
1150 * that the e_entry field is the address of the function descriptor
1151 * for the startup routine, rather than the address of the startup
1152 * routine itself. This macro performs whatever initialization to
1153 * the regs structure is required as well as any relocations to the
1154 * function descriptor entries when executing dynamically links apps.
1155 */
1156 ELF_PLAT_INIT(regs, reloc_func_desc);
1157#endif
1158
Kees Cookb8383832018-04-10 16:34:57 -07001159 finalize_exec(bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001160 start_thread(regs, elf_entry, bprm->p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001161 retval = 0;
1162out:
1163 kfree(loc);
1164out_ret:
1165 return retval;
1166
1167 /* error cleanup */
1168out_free_dentry:
Paul Burtona9d9ef12014-09-11 08:30:15 +01001169 kfree(interp_elf_phdata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001170 allow_write_access(interpreter);
1171 if (interpreter)
1172 fput(interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001173out_free_ph:
1174 kfree(elf_phdata);
1175 goto out;
1176}
1177
Josh Triplett69369a72014-04-03 14:48:27 -07001178#ifdef CONFIG_USELIB
Linus Torvalds1da177e2005-04-16 15:20:36 -07001179/* This is really simpleminded and specialized - we are loading an
1180 a.out library that is given an ELF header. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001181static int load_elf_library(struct file *file)
1182{
1183 struct elf_phdr *elf_phdata;
1184 struct elf_phdr *eppnt;
1185 unsigned long elf_bss, bss, len;
1186 int retval, error, i, j;
1187 struct elfhdr elf_ex;
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +02001188 loff_t pos = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001189
1190 error = -ENOEXEC;
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +02001191 retval = kernel_read(file, &elf_ex, sizeof(elf_ex), &pos);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001192 if (retval != sizeof(elf_ex))
1193 goto out;
1194
1195 if (memcmp(elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
1196 goto out;
1197
1198 /* First of all, some simple consistency checks */
1199 if (elf_ex.e_type != ET_EXEC || elf_ex.e_phnum > 2 ||
Al Viro72c2d532013-09-22 16:27:52 -04001200 !elf_check_arch(&elf_ex) || !file->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001201 goto out;
Nicolas Pitre47552002017-08-16 16:05:13 -04001202 if (elf_check_fdpic(&elf_ex))
1203 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001204
1205 /* Now read in all of the header information */
1206
1207 j = sizeof(struct elf_phdr) * elf_ex.e_phnum;
1208 /* j < ELF_MIN_ALIGN because elf_ex.e_phnum <= 2 */
1209
1210 error = -ENOMEM;
1211 elf_phdata = kmalloc(j, GFP_KERNEL);
1212 if (!elf_phdata)
1213 goto out;
1214
1215 eppnt = elf_phdata;
1216 error = -ENOEXEC;
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +02001217 pos = elf_ex.e_phoff;
1218 retval = kernel_read(file, eppnt, j, &pos);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001219 if (retval != j)
1220 goto out_free_ph;
1221
1222 for (j = 0, i = 0; i<elf_ex.e_phnum; i++)
1223 if ((eppnt + i)->p_type == PT_LOAD)
1224 j++;
1225 if (j != 1)
1226 goto out_free_ph;
1227
1228 while (eppnt->p_type != PT_LOAD)
1229 eppnt++;
1230
1231 /* Now use mmap to map the library into memory. */
Linus Torvalds6be5ceb2012-04-20 17:13:58 -07001232 error = vm_mmap(file,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001233 ELF_PAGESTART(eppnt->p_vaddr),
1234 (eppnt->p_filesz +
1235 ELF_PAGEOFFSET(eppnt->p_vaddr)),
1236 PROT_READ | PROT_WRITE | PROT_EXEC,
Michal Hocko4ed28632018-04-10 16:36:01 -07001237 MAP_FIXED_NOREPLACE | MAP_PRIVATE | MAP_DENYWRITE,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001238 (eppnt->p_offset -
1239 ELF_PAGEOFFSET(eppnt->p_vaddr)));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001240 if (error != ELF_PAGESTART(eppnt->p_vaddr))
1241 goto out_free_ph;
1242
1243 elf_bss = eppnt->p_vaddr + eppnt->p_filesz;
1244 if (padzero(elf_bss)) {
1245 error = -EFAULT;
1246 goto out_free_ph;
1247 }
1248
Oscar Salvador24962af2018-07-13 16:59:13 -07001249 len = ELF_PAGEALIGN(eppnt->p_filesz + eppnt->p_vaddr);
1250 bss = ELF_PAGEALIGN(eppnt->p_memsz + eppnt->p_vaddr);
Michal Hockoecc2bc82016-05-23 16:25:39 -07001251 if (bss > len) {
1252 error = vm_brk(len, bss - len);
Linus Torvalds5d22fc22016-05-27 15:57:31 -07001253 if (error)
Michal Hockoecc2bc82016-05-23 16:25:39 -07001254 goto out_free_ph;
1255 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001256 error = 0;
1257
1258out_free_ph:
1259 kfree(elf_phdata);
1260out:
1261 return error;
1262}
Josh Triplett69369a72014-04-03 14:48:27 -07001263#endif /* #ifdef CONFIG_USELIB */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001264
Christoph Hellwig698ba7b2009-12-15 16:47:37 -08001265#ifdef CONFIG_ELF_CORE
Linus Torvalds1da177e2005-04-16 15:20:36 -07001266/*
1267 * ELF core dumper
1268 *
1269 * Modelled on fs/exec.c:aout_core_dump()
1270 * Jeremy Fitzhardinge <jeremy@sw.oz.au>
1271 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001272
1273/*
Jason Baron909af762012-03-23 15:02:51 -07001274 * The purpose of always_dump_vma() is to make sure that special kernel mappings
1275 * that are useful for post-mortem analysis are included in every core dump.
1276 * In that way we ensure that the core dump is fully interpretable later
1277 * without matching up the same kernel and hardware config to see what PC values
1278 * meant. These special mappings include - vDSO, vsyscall, and other
1279 * architecture specific mappings
1280 */
1281static bool always_dump_vma(struct vm_area_struct *vma)
1282{
1283 /* Any vsyscall mappings? */
1284 if (vma == get_gate_vma(vma->vm_mm))
1285 return true;
Andy Lutomirski78d683e2014-05-19 15:58:32 -07001286
1287 /*
1288 * Assume that all vmas with a .name op should always be dumped.
1289 * If this changes, a new vm_ops field can easily be added.
1290 */
1291 if (vma->vm_ops && vma->vm_ops->name && vma->vm_ops->name(vma))
1292 return true;
1293
Jason Baron909af762012-03-23 15:02:51 -07001294 /*
1295 * arch_vma_name() returns non-NULL for special architecture mappings,
1296 * such as vDSO sections.
1297 */
1298 if (arch_vma_name(vma))
1299 return true;
1300
1301 return false;
1302}
1303
1304/*
Roland McGrath82df3972007-10-16 23:27:02 -07001305 * Decide what to dump of a segment, part, all or none.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001306 */
Roland McGrath82df3972007-10-16 23:27:02 -07001307static unsigned long vma_dump_size(struct vm_area_struct *vma,
1308 unsigned long mm_flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001309{
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001310#define FILTER(type) (mm_flags & (1UL << MMF_DUMP_##type))
1311
Jason Baron909af762012-03-23 15:02:51 -07001312 /* always dump the vdso and vsyscall sections */
1313 if (always_dump_vma(vma))
Roland McGrath82df3972007-10-16 23:27:02 -07001314 goto whole;
Roland McGrathe5b97dd2007-01-26 00:56:48 -08001315
Konstantin Khlebnikov0103bd12012-10-08 16:28:59 -07001316 if (vma->vm_flags & VM_DONTDUMP)
Jason Baronaccb61f2012-03-23 15:02:51 -07001317 return 0;
1318
Ross Zwisler50378352015-10-05 16:33:36 -06001319 /* support for DAX */
1320 if (vma_is_dax(vma)) {
1321 if ((vma->vm_flags & VM_SHARED) && FILTER(DAX_SHARED))
1322 goto whole;
1323 if (!(vma->vm_flags & VM_SHARED) && FILTER(DAX_PRIVATE))
1324 goto whole;
1325 return 0;
1326 }
1327
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001328 /* Hugetlb memory check */
1329 if (vma->vm_flags & VM_HUGETLB) {
1330 if ((vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_SHARED))
1331 goto whole;
1332 if (!(vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_PRIVATE))
1333 goto whole;
Naoya Horiguchi23d9e482013-04-17 15:58:28 -07001334 return 0;
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001335 }
1336
Linus Torvalds1da177e2005-04-16 15:20:36 -07001337 /* Do not dump I/O mapped devices or special mappings */
Konstantin Khlebnikov314e51b2012-10-08 16:29:02 -07001338 if (vma->vm_flags & VM_IO)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001339 return 0;
1340
Kawai, Hidehiroa1b59e82007-07-19 01:48:29 -07001341 /* By default, dump shared memory if mapped from an anonymous file. */
1342 if (vma->vm_flags & VM_SHARED) {
Al Viro496ad9a2013-01-23 17:07:38 -05001343 if (file_inode(vma->vm_file)->i_nlink == 0 ?
Roland McGrath82df3972007-10-16 23:27:02 -07001344 FILTER(ANON_SHARED) : FILTER(MAPPED_SHARED))
1345 goto whole;
1346 return 0;
Kawai, Hidehiroa1b59e82007-07-19 01:48:29 -07001347 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001348
Roland McGrath82df3972007-10-16 23:27:02 -07001349 /* Dump segments that have been written to. */
1350 if (vma->anon_vma && FILTER(ANON_PRIVATE))
1351 goto whole;
1352 if (vma->vm_file == NULL)
1353 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001354
Roland McGrath82df3972007-10-16 23:27:02 -07001355 if (FILTER(MAPPED_PRIVATE))
1356 goto whole;
1357
1358 /*
1359 * If this looks like the beginning of a DSO or executable mapping,
1360 * check for an ELF header. If we find one, dump the first page to
1361 * aid in determining what was mapped here.
1362 */
Roland McGrath92dc07b2009-02-06 17:34:07 -08001363 if (FILTER(ELF_HEADERS) &&
1364 vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) {
Roland McGrath82df3972007-10-16 23:27:02 -07001365 u32 __user *header = (u32 __user *) vma->vm_start;
1366 u32 word;
Roland McGrath92dc07b2009-02-06 17:34:07 -08001367 mm_segment_t fs = get_fs();
Roland McGrath82df3972007-10-16 23:27:02 -07001368 /*
1369 * Doing it this way gets the constant folded by GCC.
1370 */
1371 union {
1372 u32 cmp;
1373 char elfmag[SELFMAG];
1374 } magic;
1375 BUILD_BUG_ON(SELFMAG != sizeof word);
1376 magic.elfmag[EI_MAG0] = ELFMAG0;
1377 magic.elfmag[EI_MAG1] = ELFMAG1;
1378 magic.elfmag[EI_MAG2] = ELFMAG2;
1379 magic.elfmag[EI_MAG3] = ELFMAG3;
Roland McGrath92dc07b2009-02-06 17:34:07 -08001380 /*
1381 * Switch to the user "segment" for get_user(),
1382 * then put back what elf_core_dump() had in place.
1383 */
1384 set_fs(USER_DS);
1385 if (unlikely(get_user(word, header)))
1386 word = 0;
1387 set_fs(fs);
1388 if (word == magic.cmp)
Roland McGrath82df3972007-10-16 23:27:02 -07001389 return PAGE_SIZE;
1390 }
1391
1392#undef FILTER
1393
1394 return 0;
1395
1396whole:
1397 return vma->vm_end - vma->vm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001398}
1399
Linus Torvalds1da177e2005-04-16 15:20:36 -07001400/* An ELF note in memory */
1401struct memelfnote
1402{
1403 const char *name;
1404 int type;
1405 unsigned int datasz;
1406 void *data;
1407};
1408
1409static int notesize(struct memelfnote *en)
1410{
1411 int sz;
1412
1413 sz = sizeof(struct elf_note);
1414 sz += roundup(strlen(en->name) + 1, 4);
1415 sz += roundup(en->datasz, 4);
1416
1417 return sz;
1418}
1419
Al Viroecc8c772013-10-05 15:32:35 -04001420static int writenote(struct memelfnote *men, struct coredump_params *cprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001421{
1422 struct elf_note en;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001423 en.n_namesz = strlen(men->name) + 1;
1424 en.n_descsz = men->datasz;
1425 en.n_type = men->type;
1426
Al Viroecc8c772013-10-05 15:32:35 -04001427 return dump_emit(cprm, &en, sizeof(en)) &&
Al Viro22a8cb82013-10-08 11:05:01 -04001428 dump_emit(cprm, men->name, en.n_namesz) && dump_align(cprm, 4) &&
1429 dump_emit(cprm, men->data, men->datasz) && dump_align(cprm, 4);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001430}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001431
Roland McGrath3aba4812008-01-30 13:31:44 +01001432static void fill_elf_header(struct elfhdr *elf, int segs,
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001433 u16 machine, u32 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001434{
Cyrill Gorcunov6970c8e2008-04-29 01:01:18 -07001435 memset(elf, 0, sizeof(*elf));
1436
Linus Torvalds1da177e2005-04-16 15:20:36 -07001437 memcpy(elf->e_ident, ELFMAG, SELFMAG);
1438 elf->e_ident[EI_CLASS] = ELF_CLASS;
1439 elf->e_ident[EI_DATA] = ELF_DATA;
1440 elf->e_ident[EI_VERSION] = EV_CURRENT;
1441 elf->e_ident[EI_OSABI] = ELF_OSABI;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001442
1443 elf->e_type = ET_CORE;
Roland McGrath3aba4812008-01-30 13:31:44 +01001444 elf->e_machine = machine;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001445 elf->e_version = EV_CURRENT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001446 elf->e_phoff = sizeof(struct elfhdr);
Roland McGrath3aba4812008-01-30 13:31:44 +01001447 elf->e_flags = flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001448 elf->e_ehsize = sizeof(struct elfhdr);
1449 elf->e_phentsize = sizeof(struct elf_phdr);
1450 elf->e_phnum = segs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001451}
1452
Andrew Morton8d6b5eee2006-09-25 23:32:04 -07001453static void fill_elf_note_phdr(struct elf_phdr *phdr, int sz, loff_t offset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001454{
1455 phdr->p_type = PT_NOTE;
1456 phdr->p_offset = offset;
1457 phdr->p_vaddr = 0;
1458 phdr->p_paddr = 0;
1459 phdr->p_filesz = sz;
1460 phdr->p_memsz = 0;
1461 phdr->p_flags = 0;
1462 phdr->p_align = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001463}
1464
1465static void fill_note(struct memelfnote *note, const char *name, int type,
1466 unsigned int sz, void *data)
1467{
1468 note->name = name;
1469 note->type = type;
1470 note->datasz = sz;
1471 note->data = data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001472}
1473
1474/*
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001475 * fill up all the fields in prstatus from the given task struct, except
1476 * registers which need to be filled up separately.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001477 */
1478static void fill_prstatus(struct elf_prstatus *prstatus,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001479 struct task_struct *p, long signr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001480{
1481 prstatus->pr_info.si_signo = prstatus->pr_cursig = signr;
1482 prstatus->pr_sigpend = p->pending.signal.sig[0];
1483 prstatus->pr_sighold = p->blocked.sig[0];
Oleg Nesterov3b34fc52009-06-17 16:27:38 -07001484 rcu_read_lock();
1485 prstatus->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1486 rcu_read_unlock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001487 prstatus->pr_pid = task_pid_vnr(p);
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001488 prstatus->pr_pgrp = task_pgrp_vnr(p);
1489 prstatus->pr_sid = task_session_vnr(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001490 if (thread_group_leader(p)) {
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001491 struct task_cputime cputime;
Frank Mayharf06febc2008-09-12 09:54:39 -07001492
Linus Torvalds1da177e2005-04-16 15:20:36 -07001493 /*
Frank Mayharf06febc2008-09-12 09:54:39 -07001494 * This is the record for the group leader. It shows the
1495 * group-wide total, not its individual thread total.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001496 */
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001497 thread_group_cputime(p, &cputime);
1498 prstatus->pr_utime = ns_to_timeval(cputime.utime);
1499 prstatus->pr_stime = ns_to_timeval(cputime.stime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001500 } else {
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001501 u64 utime, stime;
Frederic Weisbecker6fac4822012-11-13 14:20:55 +01001502
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001503 task_cputime(p, &utime, &stime);
1504 prstatus->pr_utime = ns_to_timeval(utime);
1505 prstatus->pr_stime = ns_to_timeval(stime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001506 }
Frederic Weisbecker5613fda2017-01-31 04:09:23 +01001507
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001508 prstatus->pr_cutime = ns_to_timeval(p->signal->cutime);
1509 prstatus->pr_cstime = ns_to_timeval(p->signal->cstime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001510}
1511
1512static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p,
1513 struct mm_struct *mm)
1514{
David Howellsc69e8d92008-11-14 10:39:19 +11001515 const struct cred *cred;
Greg Kroah-Hartmana84a5052005-05-11 00:10:44 -07001516 unsigned int i, len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001517
1518 /* first copy the parameters from user space */
1519 memset(psinfo, 0, sizeof(struct elf_prpsinfo));
1520
1521 len = mm->arg_end - mm->arg_start;
1522 if (len >= ELF_PRARGSZ)
1523 len = ELF_PRARGSZ-1;
1524 if (copy_from_user(&psinfo->pr_psargs,
1525 (const char __user *)mm->arg_start, len))
1526 return -EFAULT;
1527 for(i = 0; i < len; i++)
1528 if (psinfo->pr_psargs[i] == 0)
1529 psinfo->pr_psargs[i] = ' ';
1530 psinfo->pr_psargs[len] = 0;
1531
Oleg Nesterov3b34fc52009-06-17 16:27:38 -07001532 rcu_read_lock();
1533 psinfo->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1534 rcu_read_unlock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001535 psinfo->pr_pid = task_pid_vnr(p);
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001536 psinfo->pr_pgrp = task_pgrp_vnr(p);
1537 psinfo->pr_sid = task_session_vnr(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001538
1539 i = p->state ? ffz(~p->state) + 1 : 0;
1540 psinfo->pr_state = i;
Carsten Otte55148542006-03-25 03:08:22 -08001541 psinfo->pr_sname = (i > 5) ? '.' : "RSDTZW"[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001542 psinfo->pr_zomb = psinfo->pr_sname == 'Z';
1543 psinfo->pr_nice = task_nice(p);
1544 psinfo->pr_flag = p->flags;
David Howellsc69e8d92008-11-14 10:39:19 +11001545 rcu_read_lock();
1546 cred = __task_cred(p);
Eric W. Biedermanebc887b2012-02-07 18:36:10 -08001547 SET_UID(psinfo->pr_uid, from_kuid_munged(cred->user_ns, cred->uid));
1548 SET_GID(psinfo->pr_gid, from_kgid_munged(cred->user_ns, cred->gid));
David Howellsc69e8d92008-11-14 10:39:19 +11001549 rcu_read_unlock();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001550 strncpy(psinfo->pr_fname, p->comm, sizeof(psinfo->pr_fname));
1551
1552 return 0;
1553}
1554
Roland McGrath3aba4812008-01-30 13:31:44 +01001555static void fill_auxv_note(struct memelfnote *note, struct mm_struct *mm)
1556{
1557 elf_addr_t *auxv = (elf_addr_t *) mm->saved_auxv;
1558 int i = 0;
1559 do
1560 i += 2;
1561 while (auxv[i - 2] != AT_NULL);
1562 fill_note(note, "CORE", NT_AUXV, i * sizeof(elf_addr_t), auxv);
1563}
1564
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001565static void fill_siginfo_note(struct memelfnote *note, user_siginfo_t *csigdata,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02001566 const kernel_siginfo_t *siginfo)
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001567{
1568 mm_segment_t old_fs = get_fs();
1569 set_fs(KERNEL_DS);
1570 copy_siginfo_to_user((user_siginfo_t __user *) csigdata, siginfo);
1571 set_fs(old_fs);
1572 fill_note(note, "CORE", NT_SIGINFO, sizeof(*csigdata), csigdata);
1573}
1574
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001575#define MAX_FILE_NOTE_SIZE (4*1024*1024)
1576/*
1577 * Format of NT_FILE note:
1578 *
1579 * long count -- how many files are mapped
1580 * long page_size -- units for file_ofs
1581 * array of [COUNT] elements of
1582 * long start
1583 * long end
1584 * long file_ofs
1585 * followed by COUNT filenames in ASCII: "FILE1" NUL "FILE2" NUL...
1586 */
Dan Aloni72023652013-09-30 13:45:02 -07001587static int fill_files_note(struct memelfnote *note)
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001588{
1589 struct vm_area_struct *vma;
1590 unsigned count, size, names_ofs, remaining, n;
1591 user_long_t *data;
1592 user_long_t *start_end_ofs;
1593 char *name_base, *name_curpos;
1594
1595 /* *Estimated* file count and total data size needed */
1596 count = current->mm->map_count;
Alexey Dobriyan60c9d922018-02-06 15:39:13 -08001597 if (count > UINT_MAX / 64)
1598 return -EINVAL;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001599 size = count * 64;
1600
1601 names_ofs = (2 + 3 * count) * sizeof(data[0]);
1602 alloc:
1603 if (size >= MAX_FILE_NOTE_SIZE) /* paranoia check */
Dan Aloni72023652013-09-30 13:45:02 -07001604 return -EINVAL;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001605 size = round_up(size, PAGE_SIZE);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001606 data = kvmalloc(size, GFP_KERNEL);
1607 if (ZERO_OR_NULL_PTR(data))
Dan Aloni72023652013-09-30 13:45:02 -07001608 return -ENOMEM;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001609
1610 start_end_ofs = data + 2;
1611 name_base = name_curpos = ((char *)data) + names_ofs;
1612 remaining = size - names_ofs;
1613 count = 0;
1614 for (vma = current->mm->mmap; vma != NULL; vma = vma->vm_next) {
1615 struct file *file;
1616 const char *filename;
1617
1618 file = vma->vm_file;
1619 if (!file)
1620 continue;
Miklos Szeredi9bf39ab2015-06-19 10:29:13 +02001621 filename = file_path(file, name_curpos, remaining);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001622 if (IS_ERR(filename)) {
1623 if (PTR_ERR(filename) == -ENAMETOOLONG) {
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001624 kvfree(data);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001625 size = size * 5 / 4;
1626 goto alloc;
1627 }
1628 continue;
1629 }
1630
Miklos Szeredi9bf39ab2015-06-19 10:29:13 +02001631 /* file_path() fills at the end, move name down */
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001632 /* n = strlen(filename) + 1: */
1633 n = (name_curpos + remaining) - filename;
1634 remaining = filename - name_curpos;
1635 memmove(name_curpos, filename, n);
1636 name_curpos += n;
1637
1638 *start_end_ofs++ = vma->vm_start;
1639 *start_end_ofs++ = vma->vm_end;
1640 *start_end_ofs++ = vma->vm_pgoff;
1641 count++;
1642 }
1643
1644 /* Now we know exact count of files, can store it */
1645 data[0] = count;
1646 data[1] = PAGE_SIZE;
1647 /*
1648 * Count usually is less than current->mm->map_count,
1649 * we need to move filenames down.
1650 */
1651 n = current->mm->map_count - count;
1652 if (n != 0) {
1653 unsigned shift_bytes = n * 3 * sizeof(data[0]);
1654 memmove(name_base - shift_bytes, name_base,
1655 name_curpos - name_base);
1656 name_curpos -= shift_bytes;
1657 }
1658
1659 size = name_curpos - (char *)data;
1660 fill_note(note, "CORE", NT_FILE, size, data);
Dan Aloni72023652013-09-30 13:45:02 -07001661 return 0;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001662}
1663
Roland McGrath4206d3a2008-01-30 13:31:45 +01001664#ifdef CORE_DUMP_USE_REGSET
1665#include <linux/regset.h>
1666
1667struct elf_thread_core_info {
1668 struct elf_thread_core_info *next;
1669 struct task_struct *task;
1670 struct elf_prstatus prstatus;
1671 struct memelfnote notes[0];
1672};
1673
1674struct elf_note_info {
1675 struct elf_thread_core_info *thread;
1676 struct memelfnote psinfo;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001677 struct memelfnote signote;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001678 struct memelfnote auxv;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001679 struct memelfnote files;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001680 user_siginfo_t csigdata;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001681 size_t size;
1682 int thread_notes;
1683};
1684
Roland McGrathd31472b2008-03-04 14:28:30 -08001685/*
1686 * When a regset has a writeback hook, we call it on each thread before
1687 * dumping user memory. On register window machines, this makes sure the
1688 * user memory backing the register data is up to date before we read it.
1689 */
1690static void do_thread_regset_writeback(struct task_struct *task,
1691 const struct user_regset *regset)
1692{
1693 if (regset->writeback)
1694 regset->writeback(task, regset, 1);
1695}
1696
H. J. Lu0953f65d2012-02-14 13:34:52 -08001697#ifndef PRSTATUS_SIZE
Dmitry Safonov90954e72016-09-05 16:33:06 +03001698#define PRSTATUS_SIZE(S, R) sizeof(S)
H. J. Lu0953f65d2012-02-14 13:34:52 -08001699#endif
1700
1701#ifndef SET_PR_FPVALID
Dmitry Safonov90954e72016-09-05 16:33:06 +03001702#define SET_PR_FPVALID(S, V, R) ((S)->pr_fpvalid = (V))
H. J. Lu0953f65d2012-02-14 13:34:52 -08001703#endif
1704
Roland McGrath4206d3a2008-01-30 13:31:45 +01001705static int fill_thread_core_info(struct elf_thread_core_info *t,
1706 const struct user_regset_view *view,
1707 long signr, size_t *total)
1708{
1709 unsigned int i;
Dave Martin27e64b42017-10-31 15:50:53 +00001710 unsigned int regset0_size = regset_size(t->task, &view->regsets[0]);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001711
1712 /*
1713 * NT_PRSTATUS is the one special case, because the regset data
1714 * goes into the pr_reg field inside the note contents, rather
1715 * than being the whole note contents. We fill the reset in here.
1716 * We assume that regset 0 is NT_PRSTATUS.
1717 */
1718 fill_prstatus(&t->prstatus, t->task, signr);
Dave Martin27e64b42017-10-31 15:50:53 +00001719 (void) view->regsets[0].get(t->task, &view->regsets[0], 0, regset0_size,
Dmitry Safonov90954e72016-09-05 16:33:06 +03001720 &t->prstatus.pr_reg, NULL);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001721
1722 fill_note(&t->notes[0], "CORE", NT_PRSTATUS,
Dave Martin27e64b42017-10-31 15:50:53 +00001723 PRSTATUS_SIZE(t->prstatus, regset0_size), &t->prstatus);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001724 *total += notesize(&t->notes[0]);
1725
Roland McGrathd31472b2008-03-04 14:28:30 -08001726 do_thread_regset_writeback(t->task, &view->regsets[0]);
1727
Roland McGrath4206d3a2008-01-30 13:31:45 +01001728 /*
1729 * Each other regset might generate a note too. For each regset
1730 * that has no core_note_type or is inactive, we leave t->notes[i]
1731 * all zero and we'll know to skip writing it later.
1732 */
1733 for (i = 1; i < view->n; ++i) {
1734 const struct user_regset *regset = &view->regsets[i];
Roland McGrathd31472b2008-03-04 14:28:30 -08001735 do_thread_regset_writeback(t->task, regset);
H. Peter Anvinc8e25252012-03-02 10:43:48 -08001736 if (regset->core_note_type && regset->get &&
Maciej W. Rozycki2f819db2018-05-15 23:32:45 +01001737 (!regset->active || regset->active(t->task, regset) > 0)) {
Roland McGrath4206d3a2008-01-30 13:31:45 +01001738 int ret;
Dave Martin27e64b42017-10-31 15:50:53 +00001739 size_t size = regset_size(t->task, regset);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001740 void *data = kmalloc(size, GFP_KERNEL);
1741 if (unlikely(!data))
1742 return 0;
1743 ret = regset->get(t->task, regset,
1744 0, size, data, NULL);
1745 if (unlikely(ret))
1746 kfree(data);
1747 else {
1748 if (regset->core_note_type != NT_PRFPREG)
1749 fill_note(&t->notes[i], "LINUX",
1750 regset->core_note_type,
1751 size, data);
1752 else {
Dmitry Safonov90954e72016-09-05 16:33:06 +03001753 SET_PR_FPVALID(&t->prstatus,
Dave Martin27e64b42017-10-31 15:50:53 +00001754 1, regset0_size);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001755 fill_note(&t->notes[i], "CORE",
1756 NT_PRFPREG, size, data);
1757 }
1758 *total += notesize(&t->notes[i]);
1759 }
1760 }
1761 }
1762
1763 return 1;
1764}
1765
1766static int fill_note_info(struct elfhdr *elf, int phdrs,
1767 struct elf_note_info *info,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02001768 const kernel_siginfo_t *siginfo, struct pt_regs *regs)
Roland McGrath4206d3a2008-01-30 13:31:45 +01001769{
1770 struct task_struct *dump_task = current;
1771 const struct user_regset_view *view = task_user_regset_view(dump_task);
1772 struct elf_thread_core_info *t;
1773 struct elf_prpsinfo *psinfo;
Oleg Nesterov83914442008-07-25 01:47:45 -07001774 struct core_thread *ct;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001775 unsigned int i;
1776
1777 info->size = 0;
1778 info->thread = NULL;
1779
1780 psinfo = kmalloc(sizeof(*psinfo), GFP_KERNEL);
Alan Cox6899e922012-12-17 16:02:09 -08001781 if (psinfo == NULL) {
1782 info->psinfo.data = NULL; /* So we don't free this wrongly */
Roland McGrath4206d3a2008-01-30 13:31:45 +01001783 return 0;
Alan Cox6899e922012-12-17 16:02:09 -08001784 }
Roland McGrath4206d3a2008-01-30 13:31:45 +01001785
Amerigo Wange2dbe122009-07-01 01:06:26 -04001786 fill_note(&info->psinfo, "CORE", NT_PRPSINFO, sizeof(*psinfo), psinfo);
1787
Roland McGrath4206d3a2008-01-30 13:31:45 +01001788 /*
1789 * Figure out how many notes we're going to need for each thread.
1790 */
1791 info->thread_notes = 0;
1792 for (i = 0; i < view->n; ++i)
1793 if (view->regsets[i].core_note_type != 0)
1794 ++info->thread_notes;
1795
1796 /*
1797 * Sanity check. We rely on regset 0 being in NT_PRSTATUS,
1798 * since it is our one special case.
1799 */
1800 if (unlikely(info->thread_notes == 0) ||
1801 unlikely(view->regsets[0].core_note_type != NT_PRSTATUS)) {
1802 WARN_ON(1);
1803 return 0;
1804 }
1805
1806 /*
1807 * Initialize the ELF file header.
1808 */
1809 fill_elf_header(elf, phdrs,
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001810 view->e_machine, view->e_flags);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001811
1812 /*
1813 * Allocate a structure for each thread.
1814 */
Oleg Nesterov83914442008-07-25 01:47:45 -07001815 for (ct = &dump_task->mm->core_state->dumper; ct; ct = ct->next) {
1816 t = kzalloc(offsetof(struct elf_thread_core_info,
1817 notes[info->thread_notes]),
1818 GFP_KERNEL);
1819 if (unlikely(!t))
1820 return 0;
Oleg Nesterov24d52882008-07-25 01:47:40 -07001821
Oleg Nesterov83914442008-07-25 01:47:45 -07001822 t->task = ct->task;
1823 if (ct->task == dump_task || !info->thread) {
1824 t->next = info->thread;
1825 info->thread = t;
1826 } else {
1827 /*
1828 * Make sure to keep the original task at
1829 * the head of the list.
1830 */
1831 t->next = info->thread->next;
1832 info->thread->next = t;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001833 }
Oleg Nesterov83914442008-07-25 01:47:45 -07001834 }
Roland McGrath4206d3a2008-01-30 13:31:45 +01001835
1836 /*
1837 * Now fill in each thread's information.
1838 */
1839 for (t = info->thread; t != NULL; t = t->next)
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07001840 if (!fill_thread_core_info(t, view, siginfo->si_signo, &info->size))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001841 return 0;
1842
1843 /*
1844 * Fill in the two process-wide notes.
1845 */
1846 fill_psinfo(psinfo, dump_task->group_leader, dump_task->mm);
1847 info->size += notesize(&info->psinfo);
1848
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001849 fill_siginfo_note(&info->signote, &info->csigdata, siginfo);
1850 info->size += notesize(&info->signote);
1851
Roland McGrath4206d3a2008-01-30 13:31:45 +01001852 fill_auxv_note(&info->auxv, current->mm);
1853 info->size += notesize(&info->auxv);
1854
Dan Aloni72023652013-09-30 13:45:02 -07001855 if (fill_files_note(&info->files) == 0)
1856 info->size += notesize(&info->files);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001857
Roland McGrath4206d3a2008-01-30 13:31:45 +01001858 return 1;
1859}
1860
1861static size_t get_note_info_size(struct elf_note_info *info)
1862{
1863 return info->size;
1864}
1865
1866/*
1867 * Write all the notes for each thread. When writing the first thread, the
1868 * process-wide notes are interleaved after the first thread-specific note.
1869 */
1870static int write_note_info(struct elf_note_info *info,
Al Viroecc8c772013-10-05 15:32:35 -04001871 struct coredump_params *cprm)
Roland McGrath4206d3a2008-01-30 13:31:45 +01001872{
Fabian Frederickb219e252014-06-04 16:12:14 -07001873 bool first = true;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001874 struct elf_thread_core_info *t = info->thread;
1875
1876 do {
1877 int i;
1878
Al Viroecc8c772013-10-05 15:32:35 -04001879 if (!writenote(&t->notes[0], cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001880 return 0;
1881
Al Viroecc8c772013-10-05 15:32:35 -04001882 if (first && !writenote(&info->psinfo, cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001883 return 0;
Al Viroecc8c772013-10-05 15:32:35 -04001884 if (first && !writenote(&info->signote, cprm))
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001885 return 0;
Al Viroecc8c772013-10-05 15:32:35 -04001886 if (first && !writenote(&info->auxv, cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001887 return 0;
Dan Aloni72023652013-09-30 13:45:02 -07001888 if (first && info->files.data &&
Al Viroecc8c772013-10-05 15:32:35 -04001889 !writenote(&info->files, cprm))
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001890 return 0;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001891
1892 for (i = 1; i < info->thread_notes; ++i)
1893 if (t->notes[i].data &&
Al Viroecc8c772013-10-05 15:32:35 -04001894 !writenote(&t->notes[i], cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001895 return 0;
1896
Fabian Frederickb219e252014-06-04 16:12:14 -07001897 first = false;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001898 t = t->next;
1899 } while (t);
1900
1901 return 1;
1902}
1903
1904static void free_note_info(struct elf_note_info *info)
1905{
1906 struct elf_thread_core_info *threads = info->thread;
1907 while (threads) {
1908 unsigned int i;
1909 struct elf_thread_core_info *t = threads;
1910 threads = t->next;
1911 WARN_ON(t->notes[0].data && t->notes[0].data != &t->prstatus);
1912 for (i = 1; i < info->thread_notes; ++i)
1913 kfree(t->notes[i].data);
1914 kfree(t);
1915 }
1916 kfree(info->psinfo.data);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001917 kvfree(info->files.data);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001918}
1919
1920#else
1921
Linus Torvalds1da177e2005-04-16 15:20:36 -07001922/* Here is the structure in which status of each thread is captured. */
1923struct elf_thread_status
1924{
1925 struct list_head list;
1926 struct elf_prstatus prstatus; /* NT_PRSTATUS */
1927 elf_fpregset_t fpu; /* NT_PRFPREG */
1928 struct task_struct *thread;
1929#ifdef ELF_CORE_COPY_XFPREGS
Mark Nelson5b20cd82007-10-16 23:25:39 -07001930 elf_fpxregset_t xfpu; /* ELF_CORE_XFPREG_TYPE */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001931#endif
1932 struct memelfnote notes[3];
1933 int num_notes;
1934};
1935
1936/*
1937 * In order to add the specific thread information for the elf file format,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001938 * we need to keep a linked list of every threads pr_status and then create
1939 * a single section for them in the final core file.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001940 */
1941static int elf_dump_thread_status(long signr, struct elf_thread_status *t)
1942{
1943 int sz = 0;
1944 struct task_struct *p = t->thread;
1945 t->num_notes = 0;
1946
1947 fill_prstatus(&t->prstatus, p, signr);
1948 elf_core_copy_task_regs(p, &t->prstatus.pr_reg);
1949
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001950 fill_note(&t->notes[0], "CORE", NT_PRSTATUS, sizeof(t->prstatus),
1951 &(t->prstatus));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001952 t->num_notes++;
1953 sz += notesize(&t->notes[0]);
1954
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001955 if ((t->prstatus.pr_fpvalid = elf_core_copy_task_fpregs(p, NULL,
1956 &t->fpu))) {
1957 fill_note(&t->notes[1], "CORE", NT_PRFPREG, sizeof(t->fpu),
1958 &(t->fpu));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001959 t->num_notes++;
1960 sz += notesize(&t->notes[1]);
1961 }
1962
1963#ifdef ELF_CORE_COPY_XFPREGS
1964 if (elf_core_copy_task_xfpregs(p, &t->xfpu)) {
Mark Nelson5b20cd82007-10-16 23:25:39 -07001965 fill_note(&t->notes[2], "LINUX", ELF_CORE_XFPREG_TYPE,
1966 sizeof(t->xfpu), &t->xfpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001967 t->num_notes++;
1968 sz += notesize(&t->notes[2]);
1969 }
1970#endif
1971 return sz;
1972}
1973
Roland McGrath3aba4812008-01-30 13:31:44 +01001974struct elf_note_info {
1975 struct memelfnote *notes;
Dan Aloni72023652013-09-30 13:45:02 -07001976 struct memelfnote *notes_files;
Roland McGrath3aba4812008-01-30 13:31:44 +01001977 struct elf_prstatus *prstatus; /* NT_PRSTATUS */
1978 struct elf_prpsinfo *psinfo; /* NT_PRPSINFO */
1979 struct list_head thread_list;
1980 elf_fpregset_t *fpu;
1981#ifdef ELF_CORE_COPY_XFPREGS
1982 elf_fpxregset_t *xfpu;
1983#endif
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001984 user_siginfo_t csigdata;
Roland McGrath3aba4812008-01-30 13:31:44 +01001985 int thread_status_size;
1986 int numnote;
1987};
1988
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001989static int elf_note_info_init(struct elf_note_info *info)
Roland McGrath3aba4812008-01-30 13:31:44 +01001990{
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001991 memset(info, 0, sizeof(*info));
Roland McGrath3aba4812008-01-30 13:31:44 +01001992 INIT_LIST_HEAD(&info->thread_list);
1993
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001994 /* Allocate space for ELF notes */
Kees Cook6da2ec52018-06-12 13:55:00 -07001995 info->notes = kmalloc_array(8, sizeof(struct memelfnote), GFP_KERNEL);
Roland McGrath3aba4812008-01-30 13:31:44 +01001996 if (!info->notes)
1997 return 0;
1998 info->psinfo = kmalloc(sizeof(*info->psinfo), GFP_KERNEL);
1999 if (!info->psinfo)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002000 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002001 info->prstatus = kmalloc(sizeof(*info->prstatus), GFP_KERNEL);
2002 if (!info->prstatus)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002003 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002004 info->fpu = kmalloc(sizeof(*info->fpu), GFP_KERNEL);
2005 if (!info->fpu)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002006 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002007#ifdef ELF_CORE_COPY_XFPREGS
2008 info->xfpu = kmalloc(sizeof(*info->xfpu), GFP_KERNEL);
2009 if (!info->xfpu)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002010 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002011#endif
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002012 return 1;
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002013}
Roland McGrath3aba4812008-01-30 13:31:44 +01002014
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002015static int fill_note_info(struct elfhdr *elf, int phdrs,
2016 struct elf_note_info *info,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02002017 const kernel_siginfo_t *siginfo, struct pt_regs *regs)
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002018{
Al Viroafabada2013-10-14 07:39:56 -04002019 struct core_thread *ct;
2020 struct elf_thread_status *ets;
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002021
2022 if (!elf_note_info_init(info))
2023 return 0;
2024
Al Viroafabada2013-10-14 07:39:56 -04002025 for (ct = current->mm->core_state->dumper.next;
2026 ct; ct = ct->next) {
2027 ets = kzalloc(sizeof(*ets), GFP_KERNEL);
2028 if (!ets)
2029 return 0;
Oleg Nesterov24d52882008-07-25 01:47:40 -07002030
Al Viroafabada2013-10-14 07:39:56 -04002031 ets->thread = ct->task;
2032 list_add(&ets->list, &info->thread_list);
2033 }
Oleg Nesterov83914442008-07-25 01:47:45 -07002034
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002035 list_for_each_entry(ets, &info->thread_list, list) {
Al Viroafabada2013-10-14 07:39:56 -04002036 int sz;
Oleg Nesterov83914442008-07-25 01:47:45 -07002037
Al Viroafabada2013-10-14 07:39:56 -04002038 sz = elf_dump_thread_status(siginfo->si_signo, ets);
2039 info->thread_status_size += sz;
Roland McGrath3aba4812008-01-30 13:31:44 +01002040 }
2041 /* now collect the dump for the current */
2042 memset(info->prstatus, 0, sizeof(*info->prstatus));
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07002043 fill_prstatus(info->prstatus, current, siginfo->si_signo);
Roland McGrath3aba4812008-01-30 13:31:44 +01002044 elf_core_copy_regs(&info->prstatus->pr_reg, regs);
2045
2046 /* Set up header */
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08002047 fill_elf_header(elf, phdrs, ELF_ARCH, ELF_CORE_EFLAGS);
Roland McGrath3aba4812008-01-30 13:31:44 +01002048
2049 /*
2050 * Set up the notes in similar form to SVR4 core dumps made
2051 * with info from their /proc.
2052 */
2053
2054 fill_note(info->notes + 0, "CORE", NT_PRSTATUS,
2055 sizeof(*info->prstatus), info->prstatus);
2056 fill_psinfo(info->psinfo, current->group_leader, current->mm);
2057 fill_note(info->notes + 1, "CORE", NT_PRPSINFO,
2058 sizeof(*info->psinfo), info->psinfo);
2059
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07002060 fill_siginfo_note(info->notes + 2, &info->csigdata, siginfo);
2061 fill_auxv_note(info->notes + 3, current->mm);
Dan Aloni72023652013-09-30 13:45:02 -07002062 info->numnote = 4;
Roland McGrath3aba4812008-01-30 13:31:44 +01002063
Dan Aloni72023652013-09-30 13:45:02 -07002064 if (fill_files_note(info->notes + info->numnote) == 0) {
2065 info->notes_files = info->notes + info->numnote;
2066 info->numnote++;
2067 }
Roland McGrath3aba4812008-01-30 13:31:44 +01002068
2069 /* Try to dump the FPU. */
2070 info->prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, regs,
2071 info->fpu);
2072 if (info->prstatus->pr_fpvalid)
2073 fill_note(info->notes + info->numnote++,
2074 "CORE", NT_PRFPREG, sizeof(*info->fpu), info->fpu);
2075#ifdef ELF_CORE_COPY_XFPREGS
2076 if (elf_core_copy_task_xfpregs(current, info->xfpu))
2077 fill_note(info->notes + info->numnote++,
2078 "LINUX", ELF_CORE_XFPREG_TYPE,
2079 sizeof(*info->xfpu), info->xfpu);
2080#endif
2081
2082 return 1;
Roland McGrath3aba4812008-01-30 13:31:44 +01002083}
2084
2085static size_t get_note_info_size(struct elf_note_info *info)
2086{
2087 int sz = 0;
2088 int i;
2089
2090 for (i = 0; i < info->numnote; i++)
2091 sz += notesize(info->notes + i);
2092
2093 sz += info->thread_status_size;
2094
2095 return sz;
2096}
2097
2098static int write_note_info(struct elf_note_info *info,
Al Viroecc8c772013-10-05 15:32:35 -04002099 struct coredump_params *cprm)
Roland McGrath3aba4812008-01-30 13:31:44 +01002100{
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002101 struct elf_thread_status *ets;
Roland McGrath3aba4812008-01-30 13:31:44 +01002102 int i;
Roland McGrath3aba4812008-01-30 13:31:44 +01002103
2104 for (i = 0; i < info->numnote; i++)
Al Viroecc8c772013-10-05 15:32:35 -04002105 if (!writenote(info->notes + i, cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002106 return 0;
2107
2108 /* write out the thread status notes section */
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002109 list_for_each_entry(ets, &info->thread_list, list) {
2110 for (i = 0; i < ets->num_notes; i++)
2111 if (!writenote(&ets->notes[i], cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002112 return 0;
2113 }
2114
2115 return 1;
2116}
2117
2118static void free_note_info(struct elf_note_info *info)
2119{
2120 while (!list_empty(&info->thread_list)) {
2121 struct list_head *tmp = info->thread_list.next;
2122 list_del(tmp);
2123 kfree(list_entry(tmp, struct elf_thread_status, list));
2124 }
2125
Dan Aloni72023652013-09-30 13:45:02 -07002126 /* Free data possibly allocated by fill_files_note(): */
2127 if (info->notes_files)
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002128 kvfree(info->notes_files->data);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07002129
Roland McGrath3aba4812008-01-30 13:31:44 +01002130 kfree(info->prstatus);
2131 kfree(info->psinfo);
2132 kfree(info->notes);
2133 kfree(info->fpu);
2134#ifdef ELF_CORE_COPY_XFPREGS
2135 kfree(info->xfpu);
2136#endif
2137}
2138
Roland McGrath4206d3a2008-01-30 13:31:45 +01002139#endif
2140
Roland McGrathf47aef52007-01-26 00:56:49 -08002141static struct vm_area_struct *first_vma(struct task_struct *tsk,
2142 struct vm_area_struct *gate_vma)
2143{
2144 struct vm_area_struct *ret = tsk->mm->mmap;
2145
2146 if (ret)
2147 return ret;
2148 return gate_vma;
2149}
2150/*
2151 * Helper function for iterating across a vma list. It ensures that the caller
2152 * will visit `gate_vma' prior to terminating the search.
2153 */
2154static struct vm_area_struct *next_vma(struct vm_area_struct *this_vma,
2155 struct vm_area_struct *gate_vma)
2156{
2157 struct vm_area_struct *ret;
2158
2159 ret = this_vma->vm_next;
2160 if (ret)
2161 return ret;
2162 if (this_vma == gate_vma)
2163 return NULL;
2164 return gate_vma;
2165}
2166
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002167static void fill_extnum_info(struct elfhdr *elf, struct elf_shdr *shdr4extnum,
2168 elf_addr_t e_shoff, int segs)
2169{
2170 elf->e_shoff = e_shoff;
2171 elf->e_shentsize = sizeof(*shdr4extnum);
2172 elf->e_shnum = 1;
2173 elf->e_shstrndx = SHN_UNDEF;
2174
2175 memset(shdr4extnum, 0, sizeof(*shdr4extnum));
2176
2177 shdr4extnum->sh_type = SHT_NULL;
2178 shdr4extnum->sh_size = elf->e_shnum;
2179 shdr4extnum->sh_link = elf->e_shstrndx;
2180 shdr4extnum->sh_info = segs;
2181}
2182
Linus Torvalds1da177e2005-04-16 15:20:36 -07002183/*
2184 * Actual dumper
2185 *
2186 * This is a two-pass process; first we find the offsets of the bits,
2187 * and then they are actually written out. If we run out of core limit
2188 * we just truncate.
2189 */
Masami Hiramatsuf6151df2009-12-17 15:27:16 -08002190static int elf_core_dump(struct coredump_params *cprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002191{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002192 int has_dumped = 0;
2193 mm_segment_t fs;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002194 int segs, i;
2195 size_t vma_data_size = 0;
Roland McGrathf47aef52007-01-26 00:56:49 -08002196 struct vm_area_struct *vma, *gate_vma;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002197 struct elfhdr *elf = NULL;
Al Virocdc3d562013-10-05 22:24:29 -04002198 loff_t offset = 0, dataoff;
Dan Aloni72023652013-09-30 13:45:02 -07002199 struct elf_note_info info = { };
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002200 struct elf_phdr *phdr4note = NULL;
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002201 struct elf_shdr *shdr4extnum = NULL;
2202 Elf_Half e_phnum;
2203 elf_addr_t e_shoff;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002204 elf_addr_t *vma_filesz = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002205
2206 /*
2207 * We no longer stop all VM operations.
2208 *
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002209 * This is because those proceses that could possibly change map_count
2210 * or the mmap / vma pages are now blocked in do_exit on current
2211 * finishing this core dump.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002212 *
2213 * Only ptrace can touch these memory addresses, but it doesn't change
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002214 * the map_count or the pages allocated. So no possibility of crashing
Linus Torvalds1da177e2005-04-16 15:20:36 -07002215 * exists while dumping the mm->vm_next areas to the core file.
2216 */
2217
2218 /* alloc memory for large data structures: too large to be on stack */
2219 elf = kmalloc(sizeof(*elf), GFP_KERNEL);
2220 if (!elf)
WANG Cong5f719552008-05-06 12:45:35 +08002221 goto out;
KAMEZAWA Hiroyuki341c87b2009-06-30 11:41:23 -07002222 /*
2223 * The number of segs are recored into ELF header as 16bit value.
2224 * Please check DEFAULT_MAX_MAP_COUNT definition when you modify here.
2225 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002226 segs = current->mm->map_count;
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002227 segs += elf_core_extra_phdrs();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002228
Stephen Wilson31db58b2011-03-13 15:49:15 -04002229 gate_vma = get_gate_vma(current->mm);
Roland McGrathf47aef52007-01-26 00:56:49 -08002230 if (gate_vma != NULL)
2231 segs++;
2232
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002233 /* for notes section */
2234 segs++;
2235
2236 /* If segs > PN_XNUM(0xffff), then e_phnum overflows. To avoid
2237 * this, kernel supports extended numbering. Have a look at
2238 * include/linux/elf.h for further information. */
2239 e_phnum = segs > PN_XNUM ? PN_XNUM : segs;
2240
Roland McGrath3aba4812008-01-30 13:31:44 +01002241 /*
2242 * Collect all the non-memory information about the process for the
2243 * notes. This also sets up the file header.
2244 */
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07002245 if (!fill_note_info(elf, e_phnum, &info, cprm->siginfo, cprm->regs))
Roland McGrath3aba4812008-01-30 13:31:44 +01002246 goto cleanup;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002247
2248 has_dumped = 1;
Oleg Nesterov079148b2013-04-30 15:28:16 -07002249
Linus Torvalds1da177e2005-04-16 15:20:36 -07002250 fs = get_fs();
2251 set_fs(KERNEL_DS);
2252
Linus Torvalds1da177e2005-04-16 15:20:36 -07002253 offset += sizeof(*elf); /* Elf header */
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002254 offset += segs * sizeof(struct elf_phdr); /* Program headers */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002255
2256 /* Write notes phdr entry */
2257 {
Roland McGrath3aba4812008-01-30 13:31:44 +01002258 size_t sz = get_note_info_size(&info);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002259
Michael Ellermane5501492007-09-19 14:38:12 +10002260 sz += elf_coredump_extra_notes_size();
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +01002261
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002262 phdr4note = kmalloc(sizeof(*phdr4note), GFP_KERNEL);
2263 if (!phdr4note)
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -08002264 goto end_coredump;
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002265
2266 fill_elf_note_phdr(phdr4note, sz, offset);
2267 offset += sz;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002268 }
2269
Linus Torvalds1da177e2005-04-16 15:20:36 -07002270 dataoff = offset = roundup(offset, ELF_EXEC_PAGESIZE);
2271
Jason Baron30f74aa2016-12-12 16:46:40 -08002272 if (segs - 1 > ULONG_MAX / sizeof(*vma_filesz))
2273 goto end_coredump;
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002274 vma_filesz = kvmalloc(array_size(sizeof(*vma_filesz), (segs - 1)),
2275 GFP_KERNEL);
2276 if (ZERO_OR_NULL_PTR(vma_filesz))
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002277 goto end_coredump;
2278
2279 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
2280 vma = next_vma(vma, gate_vma)) {
2281 unsigned long dump_size;
2282
2283 dump_size = vma_dump_size(vma, cprm->mm_flags);
2284 vma_filesz[i++] = dump_size;
2285 vma_data_size += dump_size;
2286 }
2287
2288 offset += vma_data_size;
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002289 offset += elf_core_extra_data_size();
2290 e_shoff = offset;
2291
2292 if (e_phnum == PN_XNUM) {
2293 shdr4extnum = kmalloc(sizeof(*shdr4extnum), GFP_KERNEL);
2294 if (!shdr4extnum)
2295 goto end_coredump;
2296 fill_extnum_info(elf, shdr4extnum, e_shoff, segs);
2297 }
2298
2299 offset = dataoff;
2300
Al Viroecc8c772013-10-05 15:32:35 -04002301 if (!dump_emit(cprm, elf, sizeof(*elf)))
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002302 goto end_coredump;
2303
Al Viroecc8c772013-10-05 15:32:35 -04002304 if (!dump_emit(cprm, phdr4note, sizeof(*phdr4note)))
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002305 goto end_coredump;
2306
Linus Torvalds1da177e2005-04-16 15:20:36 -07002307 /* Write program headers for segments dump */
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002308 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
Roland McGrathf47aef52007-01-26 00:56:49 -08002309 vma = next_vma(vma, gate_vma)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002310 struct elf_phdr phdr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002311
2312 phdr.p_type = PT_LOAD;
2313 phdr.p_offset = offset;
2314 phdr.p_vaddr = vma->vm_start;
2315 phdr.p_paddr = 0;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002316 phdr.p_filesz = vma_filesz[i++];
Roland McGrath82df3972007-10-16 23:27:02 -07002317 phdr.p_memsz = vma->vm_end - vma->vm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002318 offset += phdr.p_filesz;
2319 phdr.p_flags = vma->vm_flags & VM_READ ? PF_R : 0;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002320 if (vma->vm_flags & VM_WRITE)
2321 phdr.p_flags |= PF_W;
2322 if (vma->vm_flags & VM_EXEC)
2323 phdr.p_flags |= PF_X;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002324 phdr.p_align = ELF_EXEC_PAGESIZE;
2325
Al Viroecc8c772013-10-05 15:32:35 -04002326 if (!dump_emit(cprm, &phdr, sizeof(phdr)))
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -08002327 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002328 }
2329
Al Viro506f21c2013-10-05 17:22:57 -04002330 if (!elf_core_write_extra_phdrs(cprm, offset))
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002331 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002332
2333 /* write out the notes section */
Al Viroecc8c772013-10-05 15:32:35 -04002334 if (!write_note_info(&info, cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002335 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002336
Al Virocdc3d562013-10-05 22:24:29 -04002337 if (elf_coredump_extra_notes_write(cprm))
Michael Ellermane5501492007-09-19 14:38:12 +10002338 goto end_coredump;
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +01002339
Andi Kleend025c9d2006-09-30 23:29:28 -07002340 /* Align to page */
Mateusz Guzik1607f092016-06-05 23:14:14 +02002341 if (!dump_skip(cprm, dataoff - cprm->pos))
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002342 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002343
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002344 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
Roland McGrathf47aef52007-01-26 00:56:49 -08002345 vma = next_vma(vma, gate_vma)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002346 unsigned long addr;
Roland McGrath82df3972007-10-16 23:27:02 -07002347 unsigned long end;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002348
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002349 end = vma->vm_start + vma_filesz[i++];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002350
Roland McGrath82df3972007-10-16 23:27:02 -07002351 for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002352 struct page *page;
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002353 int stop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002354
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002355 page = get_dump_page(addr);
2356 if (page) {
2357 void *kaddr = kmap(page);
Al Viro13046ec2013-10-05 18:08:47 -04002358 stop = !dump_emit(cprm, kaddr, PAGE_SIZE);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002359 kunmap(page);
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03002360 put_page(page);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002361 } else
Al Viro9b56d542013-10-08 09:26:08 -04002362 stop = !dump_skip(cprm, PAGE_SIZE);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002363 if (stop)
2364 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002365 }
2366 }
Dave Kleikamp4d22c752017-01-11 13:25:00 -06002367 dump_truncate(cprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002368
Al Viroaa3e7ea2013-10-05 17:50:15 -04002369 if (!elf_core_write_extra_data(cprm))
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002370 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002371
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002372 if (e_phnum == PN_XNUM) {
Al Viro13046ec2013-10-05 18:08:47 -04002373 if (!dump_emit(cprm, shdr4extnum, sizeof(*shdr4extnum)))
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002374 goto end_coredump;
2375 }
2376
Linus Torvalds1da177e2005-04-16 15:20:36 -07002377end_coredump:
2378 set_fs(fs);
2379
2380cleanup:
Roland McGrath3aba4812008-01-30 13:31:44 +01002381 free_note_info(&info);
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002382 kfree(shdr4extnum);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002383 kvfree(vma_filesz);
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002384 kfree(phdr4note);
WANG Cong5f719552008-05-06 12:45:35 +08002385 kfree(elf);
2386out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002387 return has_dumped;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002388}
2389
Christoph Hellwig698ba7b2009-12-15 16:47:37 -08002390#endif /* CONFIG_ELF_CORE */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002391
2392static int __init init_elf_binfmt(void)
2393{
Al Viro8fc3dc52012-03-17 03:05:16 -04002394 register_binfmt(&elf_format);
2395 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002396}
2397
2398static void __exit exit_elf_binfmt(void)
2399{
2400 /* Remove the COFF and ELF loaders. */
2401 unregister_binfmt(&elf_format);
2402}
2403
2404core_initcall(init_elf_binfmt);
2405module_exit(exit_elf_binfmt);
2406MODULE_LICENSE("GPL");