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