blob: ad4c6b1d5074aa9cab8de782d000433f3410a778 [file] [log] [blame]
Thomas Gleixner09c434b2019-05-19 13:08:20 +01001// SPDX-License-Identifier: GPL-2.0-only
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/*
3 * linux/fs/binfmt_elf.c
4 *
5 * These are the functions used to load ELF format executables as used
6 * on SVr4 machines. Information on the format may be found in the book
7 * "UNIX SYSTEM V RELEASE 4 Programmers Guide: Ansi C and Programming Support
8 * Tools".
9 *
10 * Copyright 1993, 1994: Eric Youngdale (ericy@cais.com).
11 */
12
13#include <linux/module.h>
14#include <linux/kernel.h>
15#include <linux/fs.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070016#include <linux/mm.h>
17#include <linux/mman.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070018#include <linux/errno.h>
19#include <linux/signal.h>
20#include <linux/binfmts.h>
21#include <linux/string.h>
22#include <linux/file.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070023#include <linux/slab.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070024#include <linux/personality.h>
25#include <linux/elfcore.h>
26#include <linux/init.h>
27#include <linux/highuid.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070028#include <linux/compiler.h>
29#include <linux/highmem.h>
30#include <linux/pagemap.h>
Denys Vlasenko2aa362c2012-10-04 17:15:36 -070031#include <linux/vmalloc.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070032#include <linux/security.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070033#include <linux/random.h>
Jesper Juhlf4e5cc22006-06-23 02:05:35 -070034#include <linux/elf.h>
Kees Cookd1fd8362015-04-14 15:48:07 -070035#include <linux/elf-randomize.h>
Alexey Dobriyan7e80d0d2007-05-08 00:28:59 -070036#include <linux/utsname.h>
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -080037#include <linux/coredump.h>
Frederic Weisbecker6fac4822012-11-13 14:20:55 +010038#include <linux/sched.h>
Ingo Molnarf7ccbae2017-02-08 18:51:30 +010039#include <linux/sched/coredump.h>
Ingo Molnar68db0cf2017-02-08 18:51:37 +010040#include <linux/sched/task_stack.h>
Ingo Molnar32ef5512017-02-05 11:48:36 +010041#include <linux/sched/cputime.h>
Ingo Molnar5b825c32017-02-02 17:54:15 +010042#include <linux/cred.h>
Ross Zwisler50378352015-10-05 16:33:36 -060043#include <linux/dax.h>
Linus Torvalds7c0f6ba2016-12-24 11:46:01 -080044#include <linux/uaccess.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070045#include <asm/param.h>
46#include <asm/page.h>
47
Denys Vlasenko2aa362c2012-10-04 17:15:36 -070048#ifndef user_long_t
49#define user_long_t long
50#endif
Denys Vlasenko49ae4d42012-10-04 17:15:35 -070051#ifndef user_siginfo_t
52#define user_siginfo_t siginfo_t
53#endif
54
Nicolas Pitre47552002017-08-16 16:05:13 -040055/* That's for binfmt_elf_fdpic to deal with */
56#ifndef elf_check_fdpic
57#define elf_check_fdpic(ex) false
58#endif
59
Al Viro71613c32012-10-20 22:00:48 -040060static int load_elf_binary(struct linux_binprm *bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -070061
Josh Triplett69369a72014-04-03 14:48:27 -070062#ifdef CONFIG_USELIB
63static int load_elf_library(struct file *);
64#else
65#define load_elf_library NULL
66#endif
67
Linus Torvalds1da177e2005-04-16 15:20:36 -070068/*
69 * If we don't support core dumping, then supply a NULL so we
70 * don't even try.
71 */
Christoph Hellwig698ba7b2009-12-15 16:47:37 -080072#ifdef CONFIG_ELF_CORE
Masami Hiramatsuf6151df2009-12-17 15:27:16 -080073static int elf_core_dump(struct coredump_params *cprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -070074#else
75#define elf_core_dump NULL
76#endif
77
78#if ELF_EXEC_PAGESIZE > PAGE_SIZE
Jesper Juhlf4e5cc22006-06-23 02:05:35 -070079#define ELF_MIN_ALIGN ELF_EXEC_PAGESIZE
Linus Torvalds1da177e2005-04-16 15:20:36 -070080#else
Jesper Juhlf4e5cc22006-06-23 02:05:35 -070081#define ELF_MIN_ALIGN PAGE_SIZE
Linus Torvalds1da177e2005-04-16 15:20:36 -070082#endif
83
84#ifndef ELF_CORE_EFLAGS
85#define ELF_CORE_EFLAGS 0
86#endif
87
88#define ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(ELF_MIN_ALIGN-1))
89#define ELF_PAGEOFFSET(_v) ((_v) & (ELF_MIN_ALIGN-1))
90#define ELF_PAGEALIGN(_v) (((_v) + ELF_MIN_ALIGN - 1) & ~(ELF_MIN_ALIGN - 1))
91
92static struct linux_binfmt elf_format = {
Mikael Petterssonf670d0e2011-01-12 17:00:02 -080093 .module = THIS_MODULE,
94 .load_binary = load_elf_binary,
95 .load_shlib = load_elf_library,
96 .core_dump = elf_core_dump,
97 .min_coredump = ELF_EXEC_PAGESIZE,
Linus Torvalds1da177e2005-04-16 15:20:36 -070098};
99
Andrew Mortond4e3cc32007-07-21 04:37:32 -0700100#define BAD_ADDR(x) ((unsigned long)(x) >= TASK_SIZE)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700101
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800102static int set_brk(unsigned long start, unsigned long end, int prot)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700103{
104 start = ELF_PAGEALIGN(start);
105 end = ELF_PAGEALIGN(end);
106 if (end > start) {
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800107 /*
108 * Map the last of the bss segment.
109 * If the header is requesting these pages to be
110 * executable, honour that (ppc32 needs this).
111 */
112 int error = vm_brk_flags(start, end - start,
113 prot & PROT_EXEC ? VM_EXEC : 0);
Linus Torvalds5d22fc22016-05-27 15:57:31 -0700114 if (error)
115 return error;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700116 }
117 current->mm->start_brk = current->mm->brk = end;
118 return 0;
119}
120
Linus Torvalds1da177e2005-04-16 15:20:36 -0700121/* We need to explicitly zero any fractional pages
122 after the data section (i.e. bss). This would
123 contain the junk from the file that should not
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700124 be in memory
125 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700126static int padzero(unsigned long elf_bss)
127{
128 unsigned long nbyte;
129
130 nbyte = ELF_PAGEOFFSET(elf_bss);
131 if (nbyte) {
132 nbyte = ELF_MIN_ALIGN - nbyte;
133 if (clear_user((void __user *) elf_bss, nbyte))
134 return -EFAULT;
135 }
136 return 0;
137}
138
Ohad Ben-Cohen09c6dd32008-02-03 18:05:15 +0200139/* Let's use some macros to make this stack manipulation a little clearer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700140#ifdef CONFIG_STACK_GROWSUP
141#define STACK_ADD(sp, items) ((elf_addr_t __user *)(sp) + (items))
142#define STACK_ROUND(sp, items) \
143 ((15 + (unsigned long) ((sp) + (items))) &~ 15UL)
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700144#define STACK_ALLOC(sp, len) ({ \
145 elf_addr_t __user *old_sp = (elf_addr_t __user *)sp; sp += len; \
146 old_sp; })
Linus Torvalds1da177e2005-04-16 15:20:36 -0700147#else
148#define STACK_ADD(sp, items) ((elf_addr_t __user *)(sp) - (items))
149#define STACK_ROUND(sp, items) \
150 (((unsigned long) (sp - items)) &~ 15UL)
151#define STACK_ALLOC(sp, len) ({ sp -= len ; sp; })
152#endif
153
Nathan Lynch483fad12008-07-22 04:48:46 +1000154#ifndef ELF_BASE_PLATFORM
155/*
156 * AT_BASE_PLATFORM indicates the "real" hardware/microarchitecture.
157 * If the arch defines ELF_BASE_PLATFORM (in asm/elf.h), the value
158 * will be copied to the user stack in the same manner as AT_PLATFORM.
159 */
160#define ELF_BASE_PLATFORM NULL
161#endif
162
Linus Torvalds1da177e2005-04-16 15:20:36 -0700163static int
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700164create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec,
Andi Kleend20894a2008-02-08 04:21:54 -0800165 unsigned long load_addr, unsigned long interp_load_addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700166{
167 unsigned long p = bprm->p;
168 int argc = bprm->argc;
169 int envc = bprm->envc;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700170 elf_addr_t __user *sp;
171 elf_addr_t __user *u_platform;
Nathan Lynch483fad12008-07-22 04:48:46 +1000172 elf_addr_t __user *u_base_platform;
Kees Cookf06295b2009-01-07 18:08:52 -0800173 elf_addr_t __user *u_rand_bytes;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700174 const char *k_platform = ELF_PLATFORM;
Nathan Lynch483fad12008-07-22 04:48:46 +1000175 const char *k_base_platform = ELF_BASE_PLATFORM;
Kees Cookf06295b2009-01-07 18:08:52 -0800176 unsigned char k_rand_bytes[16];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700177 int items;
178 elf_addr_t *elf_info;
179 int ei_index = 0;
David Howells86a264a2008-11-14 10:39:18 +1100180 const struct cred *cred = current_cred();
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700181 struct vm_area_struct *vma;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700182
183 /*
Franck Bui-Huud68c9d62007-10-16 23:30:24 -0700184 * In some cases (e.g. Hyper-Threading), we want to avoid L1
185 * evictions by the processes running on the same package. One
186 * thing we can do is to shuffle the initial stack for them.
187 */
188
189 p = arch_align_stack(p);
190
191 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700192 * If this architecture has a platform capability string, copy it
193 * to userspace. In some cases (Sparc), this info is impossible
194 * for userspace to get any other way, in others (i386) it is
195 * merely difficult.
196 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700197 u_platform = NULL;
198 if (k_platform) {
199 size_t len = strlen(k_platform) + 1;
200
Linus Torvalds1da177e2005-04-16 15:20:36 -0700201 u_platform = (elf_addr_t __user *)STACK_ALLOC(p, len);
202 if (__copy_to_user(u_platform, k_platform, len))
203 return -EFAULT;
204 }
205
Nathan Lynch483fad12008-07-22 04:48:46 +1000206 /*
207 * If this architecture has a "base" platform capability
208 * string, copy it to userspace.
209 */
210 u_base_platform = NULL;
211 if (k_base_platform) {
212 size_t len = strlen(k_base_platform) + 1;
213
214 u_base_platform = (elf_addr_t __user *)STACK_ALLOC(p, len);
215 if (__copy_to_user(u_base_platform, k_base_platform, len))
216 return -EFAULT;
217 }
218
Kees Cookf06295b2009-01-07 18:08:52 -0800219 /*
220 * Generate 16 random bytes for userspace PRNG seeding.
221 */
222 get_random_bytes(k_rand_bytes, sizeof(k_rand_bytes));
223 u_rand_bytes = (elf_addr_t __user *)
224 STACK_ALLOC(p, sizeof(k_rand_bytes));
225 if (__copy_to_user(u_rand_bytes, k_rand_bytes, sizeof(k_rand_bytes)))
226 return -EFAULT;
227
Linus Torvalds1da177e2005-04-16 15:20:36 -0700228 /* Create the ELF interpreter info */
Jesper Juhl785d5572006-06-23 02:05:35 -0700229 elf_info = (elf_addr_t *)current->mm->saved_auxv;
Olaf Hering4f9a58d2007-10-16 23:30:12 -0700230 /* update AT_VECTOR_SIZE_BASE if the number of NEW_AUX_ENT() changes */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700231#define NEW_AUX_ENT(id, val) \
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700232 do { \
Jesper Juhl785d5572006-06-23 02:05:35 -0700233 elf_info[ei_index++] = id; \
234 elf_info[ei_index++] = val; \
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700235 } while (0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700236
237#ifdef ARCH_DLINFO
238 /*
239 * ARCH_DLINFO must come first so PPC can do its special alignment of
240 * AUXV.
Olaf Hering4f9a58d2007-10-16 23:30:12 -0700241 * update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT() in
242 * ARCH_DLINFO changes
Linus Torvalds1da177e2005-04-16 15:20:36 -0700243 */
244 ARCH_DLINFO;
245#endif
246 NEW_AUX_ENT(AT_HWCAP, ELF_HWCAP);
247 NEW_AUX_ENT(AT_PAGESZ, ELF_EXEC_PAGESIZE);
248 NEW_AUX_ENT(AT_CLKTCK, CLOCKS_PER_SEC);
249 NEW_AUX_ENT(AT_PHDR, load_addr + exec->e_phoff);
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700250 NEW_AUX_ENT(AT_PHENT, sizeof(struct elf_phdr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700251 NEW_AUX_ENT(AT_PHNUM, exec->e_phnum);
252 NEW_AUX_ENT(AT_BASE, interp_load_addr);
253 NEW_AUX_ENT(AT_FLAGS, 0);
254 NEW_AUX_ENT(AT_ENTRY, exec->e_entry);
Eric W. Biedermanebc887b2012-02-07 18:36:10 -0800255 NEW_AUX_ENT(AT_UID, from_kuid_munged(cred->user_ns, cred->uid));
256 NEW_AUX_ENT(AT_EUID, from_kuid_munged(cred->user_ns, cred->euid));
257 NEW_AUX_ENT(AT_GID, from_kgid_munged(cred->user_ns, cred->gid));
258 NEW_AUX_ENT(AT_EGID, from_kgid_munged(cred->user_ns, cred->egid));
Kees Cookc425e182017-07-18 15:25:22 -0700259 NEW_AUX_ENT(AT_SECURE, bprm->secureexec);
Kees Cookf06295b2009-01-07 18:08:52 -0800260 NEW_AUX_ENT(AT_RANDOM, (elf_addr_t)(unsigned long)u_rand_bytes);
Michael Neuling21713642013-04-17 17:33:11 +0000261#ifdef ELF_HWCAP2
262 NEW_AUX_ENT(AT_HWCAP2, ELF_HWCAP2);
263#endif
John Reiser65191082008-07-21 14:21:32 -0700264 NEW_AUX_ENT(AT_EXECFN, bprm->exec);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700265 if (k_platform) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700266 NEW_AUX_ENT(AT_PLATFORM,
Jesper Juhl785d5572006-06-23 02:05:35 -0700267 (elf_addr_t)(unsigned long)u_platform);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700268 }
Nathan Lynch483fad12008-07-22 04:48:46 +1000269 if (k_base_platform) {
270 NEW_AUX_ENT(AT_BASE_PLATFORM,
271 (elf_addr_t)(unsigned long)u_base_platform);
272 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700273 if (bprm->interp_flags & BINPRM_FLAGS_EXECFD) {
Jesper Juhl785d5572006-06-23 02:05:35 -0700274 NEW_AUX_ENT(AT_EXECFD, bprm->interp_data);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700275 }
276#undef NEW_AUX_ENT
277 /* AT_NULL is zero; clear the rest too */
278 memset(&elf_info[ei_index], 0,
279 sizeof current->mm->saved_auxv - ei_index * sizeof elf_info[0]);
280
281 /* And advance past the AT_NULL entry. */
282 ei_index += 2;
283
284 sp = STACK_ADD(p, ei_index);
285
Andi Kleend20894a2008-02-08 04:21:54 -0800286 items = (argc + 1) + (envc + 1) + 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700287 bprm->p = STACK_ROUND(sp, items);
288
289 /* Point sp at the lowest address on the stack */
290#ifdef CONFIG_STACK_GROWSUP
291 sp = (elf_addr_t __user *)bprm->p - items - ei_index;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700292 bprm->exec = (unsigned long)sp; /* XXX: PARISC HACK */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700293#else
294 sp = (elf_addr_t __user *)bprm->p;
295#endif
296
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700297
298 /*
299 * Grow the stack manually; some architectures have a limit on how
300 * far ahead a user-space access may be in order to grow the stack.
301 */
302 vma = find_extend_vma(current->mm, bprm->p);
303 if (!vma)
304 return -EFAULT;
305
Linus Torvalds1da177e2005-04-16 15:20:36 -0700306 /* Now, let's put argc (and argv, envp if appropriate) on the stack */
307 if (__put_user(argc, sp++))
308 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700309
Kees Cook67c67772017-07-10 15:52:54 -0700310 /* Populate list of argv pointers back to argv strings. */
Greg Kroah-Hartmana84a5052005-05-11 00:10:44 -0700311 p = current->mm->arg_end = current->mm->arg_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700312 while (argc-- > 0) {
313 size_t len;
Kees Cook67c67772017-07-10 15:52:54 -0700314 if (__put_user((elf_addr_t)p, sp++))
Heiko Carstens841d5fb2006-12-06 20:36:35 -0800315 return -EFAULT;
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700316 len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);
317 if (!len || len > MAX_ARG_STRLEN)
WANG Cong23c49712008-05-08 21:52:33 +0800318 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700319 p += len;
320 }
Kees Cook67c67772017-07-10 15:52:54 -0700321 if (__put_user(0, sp++))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700322 return -EFAULT;
Kees Cook67c67772017-07-10 15:52:54 -0700323 current->mm->arg_end = p;
324
325 /* Populate list of envp pointers back to envp strings. */
326 current->mm->env_end = current->mm->env_start = p;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700327 while (envc-- > 0) {
328 size_t len;
Kees Cook67c67772017-07-10 15:52:54 -0700329 if (__put_user((elf_addr_t)p, sp++))
Heiko Carstens841d5fb2006-12-06 20:36:35 -0800330 return -EFAULT;
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700331 len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);
332 if (!len || len > MAX_ARG_STRLEN)
WANG Cong23c49712008-05-08 21:52:33 +0800333 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700334 p += len;
335 }
Kees Cook67c67772017-07-10 15:52:54 -0700336 if (__put_user(0, sp++))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700337 return -EFAULT;
338 current->mm->env_end = p;
339
340 /* Put the elf_info on the stack in the right place. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700341 if (copy_to_user(sp, elf_info, ei_index * sizeof(elf_addr_t)))
342 return -EFAULT;
343 return 0;
344}
345
James Hoganc07380b2011-05-09 10:58:40 +0100346#ifndef elf_map
347
Linus Torvalds1da177e2005-04-16 15:20:36 -0700348static unsigned long elf_map(struct file *filep, unsigned long addr,
Alexey Dobriyan49ac9812019-03-07 16:29:03 -0800349 const struct elf_phdr *eppnt, int prot, int type,
Jiri Kosinacc503c12008-01-30 13:31:07 +0100350 unsigned long total_size)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700351{
352 unsigned long map_addr;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100353 unsigned long size = eppnt->p_filesz + ELF_PAGEOFFSET(eppnt->p_vaddr);
354 unsigned long off = eppnt->p_offset - ELF_PAGEOFFSET(eppnt->p_vaddr);
355 addr = ELF_PAGESTART(addr);
356 size = ELF_PAGEALIGN(size);
Jan Kratochvil60bfba72007-07-15 23:40:06 -0700357
Andrew Mortond4e3cc32007-07-21 04:37:32 -0700358 /* mmap() will return -EINVAL if given a zero size, but a
359 * segment with zero filesize is perfectly valid */
Jiri Kosinacc503c12008-01-30 13:31:07 +0100360 if (!size)
361 return addr;
362
Jiri Kosinacc503c12008-01-30 13:31:07 +0100363 /*
364 * total_size is the size of the ELF (interpreter) image.
365 * The _first_ mmap needs to know the full size, otherwise
366 * randomization might put this image into an overlapping
367 * position with the ELF binary image. (since size < total_size)
368 * So we first map the 'big' image - and unmap the remainder at
369 * the end. (which unmap is needed for ELF images with holes.)
370 */
371 if (total_size) {
372 total_size = ELF_PAGEALIGN(total_size);
Al Viro5a5e4c22012-05-30 01:49:38 -0400373 map_addr = vm_mmap(filep, addr, total_size, prot, type, off);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100374 if (!BAD_ADDR(map_addr))
Al Viro5a5e4c22012-05-30 01:49:38 -0400375 vm_munmap(map_addr+size, total_size-size);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100376 } else
Al Viro5a5e4c22012-05-30 01:49:38 -0400377 map_addr = vm_mmap(filep, addr, size, prot, type, off);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100378
Tetsuo Handad23a61e2018-04-20 14:56:13 -0700379 if ((type & MAP_FIXED_NOREPLACE) &&
380 PTR_ERR((void *)map_addr) == -EEXIST)
381 pr_info("%d (%s): Uhuuh, elf segment at %px requested but the memory is mapped already\n",
382 task_pid_nr(current), current->comm, (void *)addr);
Michal Hocko4ed28632018-04-10 16:36:01 -0700383
Linus Torvalds1da177e2005-04-16 15:20:36 -0700384 return(map_addr);
385}
386
James Hoganc07380b2011-05-09 10:58:40 +0100387#endif /* !elf_map */
388
Alexey Dobriyan49ac9812019-03-07 16:29:03 -0800389static unsigned long total_mapping_size(const struct elf_phdr *cmds, int nr)
Jiri Kosinacc503c12008-01-30 13:31:07 +0100390{
391 int i, first_idx = -1, last_idx = -1;
392
393 for (i = 0; i < nr; i++) {
394 if (cmds[i].p_type == PT_LOAD) {
395 last_idx = i;
396 if (first_idx == -1)
397 first_idx = i;
398 }
399 }
400 if (first_idx == -1)
401 return 0;
402
403 return cmds[last_idx].p_vaddr + cmds[last_idx].p_memsz -
404 ELF_PAGESTART(cmds[first_idx].p_vaddr);
405}
406
Paul Burton6a8d3892014-09-11 08:30:14 +0100407/**
408 * load_elf_phdrs() - load ELF program headers
409 * @elf_ex: ELF header of the binary whose program headers should be loaded
410 * @elf_file: the opened ELF binary file
411 *
412 * Loads ELF program headers from the binary file elf_file, which has the ELF
413 * header pointed to by elf_ex, into a newly allocated array. The caller is
414 * responsible for freeing the allocated data. Returns an ERR_PTR upon failure.
415 */
Alexey Dobriyan49ac9812019-03-07 16:29:03 -0800416static struct elf_phdr *load_elf_phdrs(const struct elfhdr *elf_ex,
Paul Burton6a8d3892014-09-11 08:30:14 +0100417 struct file *elf_file)
418{
419 struct elf_phdr *elf_phdata = NULL;
Alexey Dobriyanfaf1c312019-03-07 16:28:56 -0800420 int retval, err = -1;
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +0200421 loff_t pos = elf_ex->e_phoff;
Alexey Dobriyanfaf1c312019-03-07 16:28:56 -0800422 unsigned int size;
Paul Burton6a8d3892014-09-11 08:30:14 +0100423
424 /*
425 * If the size of this structure has changed, then punt, since
426 * we will be doing the wrong thing.
427 */
428 if (elf_ex->e_phentsize != sizeof(struct elf_phdr))
429 goto out;
430
431 /* Sanity check the number of program headers... */
Paul Burton6a8d3892014-09-11 08:30:14 +0100432 /* ...and their total size. */
433 size = sizeof(struct elf_phdr) * elf_ex->e_phnum;
Alexey Dobriyanfaf1c312019-03-07 16:28:56 -0800434 if (size == 0 || size > 65536 || size > ELF_MIN_ALIGN)
Paul Burton6a8d3892014-09-11 08:30:14 +0100435 goto out;
436
437 elf_phdata = kmalloc(size, GFP_KERNEL);
438 if (!elf_phdata)
439 goto out;
440
441 /* Read in the program headers */
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +0200442 retval = kernel_read(elf_file, elf_phdata, size, &pos);
Paul Burton6a8d3892014-09-11 08:30:14 +0100443 if (retval != size) {
444 err = (retval < 0) ? retval : -EIO;
445 goto out;
446 }
447
448 /* Success! */
449 err = 0;
450out:
451 if (err) {
452 kfree(elf_phdata);
453 elf_phdata = NULL;
454 }
455 return elf_phdata;
456}
Jiri Kosinacc503c12008-01-30 13:31:07 +0100457
Paul Burton774c1052014-09-11 08:30:16 +0100458#ifndef CONFIG_ARCH_BINFMT_ELF_STATE
459
460/**
461 * struct arch_elf_state - arch-specific ELF loading state
462 *
463 * This structure is used to preserve architecture specific data during
464 * the loading of an ELF file, throughout the checking of architecture
465 * specific ELF headers & through to the point where the ELF load is
466 * known to be proceeding (ie. SET_PERSONALITY).
467 *
468 * This implementation is a dummy for architectures which require no
469 * specific state.
470 */
471struct arch_elf_state {
472};
473
474#define INIT_ARCH_ELF_STATE {}
475
476/**
477 * arch_elf_pt_proc() - check a PT_LOPROC..PT_HIPROC ELF program header
478 * @ehdr: The main ELF header
479 * @phdr: The program header to check
480 * @elf: The open ELF file
481 * @is_interp: True if the phdr is from the interpreter of the ELF being
482 * loaded, else false.
483 * @state: Architecture-specific state preserved throughout the process
484 * of loading the ELF.
485 *
486 * Inspects the program header phdr to validate its correctness and/or
487 * suitability for the system. Called once per ELF program header in the
488 * range PT_LOPROC to PT_HIPROC, for both the ELF being loaded and its
489 * interpreter.
490 *
491 * Return: Zero to proceed with the ELF load, non-zero to fail the ELF load
492 * with that return code.
493 */
494static inline int arch_elf_pt_proc(struct elfhdr *ehdr,
495 struct elf_phdr *phdr,
496 struct file *elf, bool is_interp,
497 struct arch_elf_state *state)
498{
499 /* Dummy implementation, always proceed */
500 return 0;
501}
502
503/**
Maciej W. Rozycki54d157142015-10-26 15:47:57 +0000504 * arch_check_elf() - check an ELF executable
Paul Burton774c1052014-09-11 08:30:16 +0100505 * @ehdr: The main ELF header
506 * @has_interp: True if the ELF has an interpreter, else false.
Maciej W. Rozyckieb4bc072015-11-13 00:47:48 +0000507 * @interp_ehdr: The interpreter's ELF header
Paul Burton774c1052014-09-11 08:30:16 +0100508 * @state: Architecture-specific state preserved throughout the process
509 * of loading the ELF.
510 *
511 * Provides a final opportunity for architecture code to reject the loading
512 * of the ELF & cause an exec syscall to return an error. This is called after
513 * all program headers to be checked by arch_elf_pt_proc have been.
514 *
515 * Return: Zero to proceed with the ELF load, non-zero to fail the ELF load
516 * with that return code.
517 */
518static inline int arch_check_elf(struct elfhdr *ehdr, bool has_interp,
Maciej W. Rozyckieb4bc072015-11-13 00:47:48 +0000519 struct elfhdr *interp_ehdr,
Paul Burton774c1052014-09-11 08:30:16 +0100520 struct arch_elf_state *state)
521{
522 /* Dummy implementation, always proceed */
523 return 0;
524}
525
526#endif /* !CONFIG_ARCH_BINFMT_ELF_STATE */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700527
Alexey Dobriyand8e7cb32019-05-14 15:43:51 -0700528static inline int make_prot(u32 p_flags)
529{
530 int prot = 0;
531
532 if (p_flags & PF_R)
533 prot |= PROT_READ;
534 if (p_flags & PF_W)
535 prot |= PROT_WRITE;
536 if (p_flags & PF_X)
537 prot |= PROT_EXEC;
538 return prot;
539}
540
Linus Torvalds1da177e2005-04-16 15:20:36 -0700541/* This is much more generalized than the library routine read function,
542 so we keep this separate. Technically the library read function
543 is only provided so that we can read a.out libraries that have
544 an ELF header */
545
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700546static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
Jiri Kosinacc503c12008-01-30 13:31:07 +0100547 struct file *interpreter, unsigned long *interp_map_addr,
Paul Burtona9d9ef12014-09-11 08:30:15 +0100548 unsigned long no_base, struct elf_phdr *interp_elf_phdata)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700549{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700550 struct elf_phdr *eppnt;
551 unsigned long load_addr = 0;
552 int load_addr_set = 0;
553 unsigned long last_bss = 0, elf_bss = 0;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800554 int bss_prot = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700555 unsigned long error = ~0UL;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100556 unsigned long total_size;
Paul Burton6a8d3892014-09-11 08:30:14 +0100557 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700558
559 /* First of all, some simple consistency checks */
560 if (interp_elf_ex->e_type != ET_EXEC &&
561 interp_elf_ex->e_type != ET_DYN)
562 goto out;
Nicolas Pitre47552002017-08-16 16:05:13 -0400563 if (!elf_check_arch(interp_elf_ex) ||
564 elf_check_fdpic(interp_elf_ex))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700565 goto out;
Al Viro72c2d532013-09-22 16:27:52 -0400566 if (!interpreter->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700567 goto out;
568
Paul Burtona9d9ef12014-09-11 08:30:15 +0100569 total_size = total_mapping_size(interp_elf_phdata,
570 interp_elf_ex->e_phnum);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100571 if (!total_size) {
572 error = -EINVAL;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100573 goto out;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100574 }
575
Paul Burtona9d9ef12014-09-11 08:30:15 +0100576 eppnt = interp_elf_phdata;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700577 for (i = 0; i < interp_elf_ex->e_phnum; i++, eppnt++) {
578 if (eppnt->p_type == PT_LOAD) {
579 int elf_type = MAP_PRIVATE | MAP_DENYWRITE;
Alexey Dobriyand8e7cb32019-05-14 15:43:51 -0700580 int elf_prot = make_prot(eppnt->p_flags);
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700581 unsigned long vaddr = 0;
582 unsigned long k, map_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700583
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700584 vaddr = eppnt->p_vaddr;
585 if (interp_elf_ex->e_type == ET_EXEC || load_addr_set)
Michal Hocko4ed28632018-04-10 16:36:01 -0700586 elf_type |= MAP_FIXED_NOREPLACE;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100587 else if (no_base && interp_elf_ex->e_type == ET_DYN)
588 load_addr = -vaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700589
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700590 map_addr = elf_map(interpreter, load_addr + vaddr,
Andrew Mortonbb1ad822008-01-30 13:31:07 +0100591 eppnt, elf_prot, elf_type, total_size);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100592 total_size = 0;
593 if (!*interp_map_addr)
594 *interp_map_addr = map_addr;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700595 error = map_addr;
596 if (BAD_ADDR(map_addr))
Paul Burtona9d9ef12014-09-11 08:30:15 +0100597 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700598
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700599 if (!load_addr_set &&
600 interp_elf_ex->e_type == ET_DYN) {
601 load_addr = map_addr - ELF_PAGESTART(vaddr);
602 load_addr_set = 1;
603 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700604
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700605 /*
606 * Check to see if the section's size will overflow the
607 * allowed task size. Note that p_filesz must always be
608 * <= p_memsize so it's only necessary to check p_memsz.
609 */
610 k = load_addr + eppnt->p_vaddr;
Chuck Ebbertce510592006-07-03 00:24:14 -0700611 if (BAD_ADDR(k) ||
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700612 eppnt->p_filesz > eppnt->p_memsz ||
613 eppnt->p_memsz > TASK_SIZE ||
614 TASK_SIZE - eppnt->p_memsz < k) {
615 error = -ENOMEM;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100616 goto out;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700617 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700618
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700619 /*
620 * Find the end of the file mapping for this phdr, and
621 * keep track of the largest address we see for this.
622 */
623 k = load_addr + eppnt->p_vaddr + eppnt->p_filesz;
624 if (k > elf_bss)
625 elf_bss = k;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700626
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700627 /*
628 * Do the same thing for the memory mapping - between
629 * elf_bss and last_bss is the bss section.
630 */
Kees Cook0036d1f2016-08-02 14:04:51 -0700631 k = load_addr + eppnt->p_vaddr + eppnt->p_memsz;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800632 if (k > last_bss) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700633 last_bss = k;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800634 bss_prot = elf_prot;
635 }
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700636 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700637 }
638
Kees Cook0036d1f2016-08-02 14:04:51 -0700639 /*
640 * Now fill out the bss section: first pad the last page from
641 * the file up to the page boundary, and zero it from elf_bss
642 * up to the end of the page.
643 */
644 if (padzero(elf_bss)) {
645 error = -EFAULT;
646 goto out;
647 }
648 /*
649 * Next, align both the file and mem bss up to the page size,
650 * since this is where elf_bss was just zeroed up to, and where
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800651 * last_bss will end after the vm_brk_flags() below.
Kees Cook0036d1f2016-08-02 14:04:51 -0700652 */
653 elf_bss = ELF_PAGEALIGN(elf_bss);
654 last_bss = ELF_PAGEALIGN(last_bss);
655 /* Finally, if there is still more bss to allocate, do it. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700656 if (last_bss > elf_bss) {
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800657 error = vm_brk_flags(elf_bss, last_bss - elf_bss,
658 bss_prot & PROT_EXEC ? VM_EXEC : 0);
Linus Torvalds5d22fc22016-05-27 15:57:31 -0700659 if (error)
Paul Burtona9d9ef12014-09-11 08:30:15 +0100660 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700661 }
662
Jiri Kosinacc503c12008-01-30 13:31:07 +0100663 error = load_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700664out:
665 return error;
666}
667
Linus Torvalds1da177e2005-04-16 15:20:36 -0700668/*
669 * These are the functions used to load ELF style executables and shared
670 * libraries. There is no binary dependent code anywhere else.
671 */
672
Al Viro71613c32012-10-20 22:00:48 -0400673static int load_elf_binary(struct linux_binprm *bprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700674{
675 struct file *interpreter = NULL; /* to shut gcc up */
676 unsigned long load_addr = 0, load_bias = 0;
677 int load_addr_set = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700678 unsigned long error;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100679 struct elf_phdr *elf_ppnt, *elf_phdata, *interp_elf_phdata = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700680 unsigned long elf_bss, elf_brk;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800681 int bss_prot = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700682 int retval, i;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100683 unsigned long elf_entry;
684 unsigned long interp_load_addr = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700685 unsigned long start_code, end_code, start_data, end_data;
David Daney1a530a62011-03-22 16:34:48 -0700686 unsigned long reloc_func_desc __maybe_unused = 0;
David Rientjes8de61e62006-12-06 20:40:16 -0800687 int executable_stack = EXSTACK_DEFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700688 struct {
689 struct elfhdr elf_ex;
690 struct elfhdr interp_elf_ex;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700691 } *loc;
Paul Burton774c1052014-09-11 08:30:16 +0100692 struct arch_elf_state arch_state = INIT_ARCH_ELF_STATE;
Alexey Dobriyan249b08e2019-05-14 15:43:54 -0700693 struct pt_regs *regs;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700694
695 loc = kmalloc(sizeof(*loc), GFP_KERNEL);
696 if (!loc) {
697 retval = -ENOMEM;
698 goto out_ret;
699 }
700
701 /* Get the exec-header */
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700702 loc->elf_ex = *((struct elfhdr *)bprm->buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700703
704 retval = -ENOEXEC;
705 /* First of all, some simple consistency checks */
706 if (memcmp(loc->elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
707 goto out;
708
709 if (loc->elf_ex.e_type != ET_EXEC && loc->elf_ex.e_type != ET_DYN)
710 goto out;
711 if (!elf_check_arch(&loc->elf_ex))
712 goto out;
Nicolas Pitre47552002017-08-16 16:05:13 -0400713 if (elf_check_fdpic(&loc->elf_ex))
714 goto out;
Al Viro72c2d532013-09-22 16:27:52 -0400715 if (!bprm->file->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700716 goto out;
717
Paul Burton6a8d3892014-09-11 08:30:14 +0100718 elf_phdata = load_elf_phdrs(&loc->elf_ex, bprm->file);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700719 if (!elf_phdata)
720 goto out;
721
Linus Torvalds1da177e2005-04-16 15:20:36 -0700722 elf_ppnt = elf_phdata;
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700723 for (i = 0; i < loc->elf_ex.e_phnum; i++, elf_ppnt++) {
724 char *elf_interpreter;
725 loff_t pos;
Alexey Dobriyan5cf4a362019-05-14 15:43:36 -0700726
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700727 if (elf_ppnt->p_type != PT_INTERP)
728 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700729
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700730 /*
731 * This is the program interpreter used for shared libraries -
732 * for now assume that this is an a.out format binary.
733 */
734 retval = -ENOEXEC;
735 if (elf_ppnt->p_filesz > PATH_MAX || elf_ppnt->p_filesz < 2)
736 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700737
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700738 retval = -ENOMEM;
739 elf_interpreter = kmalloc(elf_ppnt->p_filesz, GFP_KERNEL);
740 if (!elf_interpreter)
741 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700742
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700743 pos = elf_ppnt->p_offset;
744 retval = kernel_read(bprm->file, elf_interpreter,
745 elf_ppnt->p_filesz, &pos);
746 if (retval != elf_ppnt->p_filesz) {
747 if (retval >= 0)
748 retval = -EIO;
749 goto out_free_interp;
750 }
751 /* make sure path is NULL terminated */
752 retval = -ENOEXEC;
753 if (elf_interpreter[elf_ppnt->p_filesz - 1] != '\0')
754 goto out_free_interp;
Alexey Dobriyan1fb84492007-01-26 00:57:16 -0800755
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700756 interpreter = open_exec(elf_interpreter);
757 kfree(elf_interpreter);
758 retval = PTR_ERR(interpreter);
759 if (IS_ERR(interpreter))
760 goto out_free_ph;
Alexey Dobriyan1fb84492007-01-26 00:57:16 -0800761
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700762 /*
763 * If the binary is not readable then enforce mm->dumpable = 0
764 * regardless of the interpreter's permissions.
765 */
766 would_dump(bprm, interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700767
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700768 /* Get the exec headers */
769 pos = 0;
770 retval = kernel_read(interpreter, &loc->interp_elf_ex,
771 sizeof(loc->interp_elf_ex), &pos);
772 if (retval != sizeof(loc->interp_elf_ex)) {
773 if (retval >= 0)
774 retval = -EIO;
775 goto out_free_dentry;
776 }
777
778 break;
Alexey Dobriyancc338012019-05-14 15:43:39 -0700779
780out_free_interp:
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700781 kfree(elf_interpreter);
782 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700783 }
784
785 elf_ppnt = elf_phdata;
786 for (i = 0; i < loc->elf_ex.e_phnum; i++, elf_ppnt++)
Paul Burton774c1052014-09-11 08:30:16 +0100787 switch (elf_ppnt->p_type) {
788 case PT_GNU_STACK:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700789 if (elf_ppnt->p_flags & PF_X)
790 executable_stack = EXSTACK_ENABLE_X;
791 else
792 executable_stack = EXSTACK_DISABLE_X;
793 break;
Paul Burton774c1052014-09-11 08:30:16 +0100794
795 case PT_LOPROC ... PT_HIPROC:
796 retval = arch_elf_pt_proc(&loc->elf_ex, elf_ppnt,
797 bprm->file, false,
798 &arch_state);
799 if (retval)
800 goto out_free_dentry;
801 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700802 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700803
804 /* Some simple consistency checks for the interpreter */
Alexey Dobriyancc338012019-05-14 15:43:39 -0700805 if (interpreter) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700806 retval = -ELIBBAD;
Andi Kleend20894a2008-02-08 04:21:54 -0800807 /* Not an ELF interpreter */
808 if (memcmp(loc->interp_elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700809 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700810 /* Verify the interpreter has a valid arch */
Nicolas Pitre47552002017-08-16 16:05:13 -0400811 if (!elf_check_arch(&loc->interp_elf_ex) ||
812 elf_check_fdpic(&loc->interp_elf_ex))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700813 goto out_free_dentry;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100814
815 /* Load the interpreter program headers */
816 interp_elf_phdata = load_elf_phdrs(&loc->interp_elf_ex,
817 interpreter);
818 if (!interp_elf_phdata)
819 goto out_free_dentry;
Paul Burton774c1052014-09-11 08:30:16 +0100820
821 /* Pass PT_LOPROC..PT_HIPROC headers to arch code */
822 elf_ppnt = interp_elf_phdata;
823 for (i = 0; i < loc->interp_elf_ex.e_phnum; i++, elf_ppnt++)
824 switch (elf_ppnt->p_type) {
825 case PT_LOPROC ... PT_HIPROC:
826 retval = arch_elf_pt_proc(&loc->interp_elf_ex,
827 elf_ppnt, interpreter,
828 true, &arch_state);
829 if (retval)
830 goto out_free_dentry;
831 break;
832 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700833 }
834
Paul Burton774c1052014-09-11 08:30:16 +0100835 /*
836 * Allow arch code to reject the ELF at this point, whilst it's
837 * still possible to return an error to the code that invoked
838 * the exec syscall.
839 */
Maciej W. Rozyckieb4bc072015-11-13 00:47:48 +0000840 retval = arch_check_elf(&loc->elf_ex,
841 !!interpreter, &loc->interp_elf_ex,
842 &arch_state);
Paul Burton774c1052014-09-11 08:30:16 +0100843 if (retval)
844 goto out_free_dentry;
845
Linus Torvalds1da177e2005-04-16 15:20:36 -0700846 /* Flush all traces of the currently running executable */
847 retval = flush_old_exec(bprm);
848 if (retval)
849 goto out_free_dentry;
850
Linus Torvalds1da177e2005-04-16 15:20:36 -0700851 /* Do this immediately, since STACK_TOP as used in setup_arg_pages
852 may depend on the personality. */
Paul Burton774c1052014-09-11 08:30:16 +0100853 SET_PERSONALITY2(loc->elf_ex, &arch_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700854 if (elf_read_implies_exec(loc->elf_ex, executable_stack))
855 current->personality |= READ_IMPLIES_EXEC;
856
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700857 if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700858 current->flags |= PF_RANDOMIZE;
Linus Torvalds221af7f2010-01-28 22:14:42 -0800859
860 setup_new_exec(bprm);
Linus Torvalds9f834ec2016-08-22 16:41:46 -0700861 install_exec_creds(bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700862
863 /* Do this so that we can load the interpreter, if need be. We will
864 change some of these later */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700865 retval = setup_arg_pages(bprm, randomize_stack_top(STACK_TOP),
866 executable_stack);
Al Viro19d860a2014-05-04 20:11:36 -0400867 if (retval < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700868 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700869
Alexey Dobriyan852643162019-05-14 15:43:48 -0700870 elf_bss = 0;
871 elf_brk = 0;
872
873 start_code = ~0UL;
874 end_code = 0;
875 start_data = 0;
876 end_data = 0;
877
André Goddard Rosaaf901ca2009-11-14 13:09:05 -0200878 /* Now we do a little grungy work by mmapping the ELF image into
Jiri Kosinacc503c12008-01-30 13:31:07 +0100879 the correct location in memory. */
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700880 for(i = 0, elf_ppnt = elf_phdata;
881 i < loc->elf_ex.e_phnum; i++, elf_ppnt++) {
Alexey Dobriyand8e7cb32019-05-14 15:43:51 -0700882 int elf_prot, elf_flags, elf_fixed = MAP_FIXED_NOREPLACE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700883 unsigned long k, vaddr;
Michael Davidsona87938b2015-04-14 15:47:38 -0700884 unsigned long total_size = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700885
886 if (elf_ppnt->p_type != PT_LOAD)
887 continue;
888
889 if (unlikely (elf_brk > elf_bss)) {
890 unsigned long nbyte;
891
892 /* There was a PT_LOAD segment with p_memsz > p_filesz
893 before this one. Map anonymous pages, if needed,
894 and clear the area. */
Mikael Petterssonf670d0e2011-01-12 17:00:02 -0800895 retval = set_brk(elf_bss + load_bias,
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800896 elf_brk + load_bias,
897 bss_prot);
Al Viro19d860a2014-05-04 20:11:36 -0400898 if (retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700899 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700900 nbyte = ELF_PAGEOFFSET(elf_bss);
901 if (nbyte) {
902 nbyte = ELF_MIN_ALIGN - nbyte;
903 if (nbyte > elf_brk - elf_bss)
904 nbyte = elf_brk - elf_bss;
905 if (clear_user((void __user *)elf_bss +
906 load_bias, nbyte)) {
907 /*
908 * This bss-zeroing can fail if the ELF
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700909 * file specifies odd protections. So
Linus Torvalds1da177e2005-04-16 15:20:36 -0700910 * we don't check the return value
911 */
912 }
913 }
Michal Hockoad55eac2018-04-10 16:36:05 -0700914
915 /*
916 * Some binaries have overlapping elf segments and then
917 * we have to forcefully map over an existing mapping
918 * e.g. over this newly established brk mapping.
919 */
920 elf_fixed = MAP_FIXED;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700921 }
922
Alexey Dobriyand8e7cb32019-05-14 15:43:51 -0700923 elf_prot = make_prot(elf_ppnt->p_flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700924
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700925 elf_flags = MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700926
927 vaddr = elf_ppnt->p_vaddr;
Kees Cookeab09532017-07-10 15:52:37 -0700928 /*
929 * If we are loading ET_EXEC or we have already performed
930 * the ET_DYN load_addr calculations, proceed normally.
931 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700932 if (loc->elf_ex.e_type == ET_EXEC || load_addr_set) {
Michal Hockoad55eac2018-04-10 16:36:05 -0700933 elf_flags |= elf_fixed;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700934 } else if (loc->elf_ex.e_type == ET_DYN) {
Kees Cookeab09532017-07-10 15:52:37 -0700935 /*
936 * This logic is run once for the first LOAD Program
937 * Header for ET_DYN binaries to calculate the
938 * randomization (load_bias) for all the LOAD
939 * Program Headers, and to calculate the entire
940 * size of the ELF mapping (total_size). (Note that
941 * load_addr_set is set to true later once the
942 * initial mapping is performed.)
943 *
944 * There are effectively two types of ET_DYN
945 * binaries: programs (i.e. PIE: ET_DYN with INTERP)
946 * and loaders (ET_DYN without INTERP, since they
947 * _are_ the ELF interpreter). The loaders must
948 * be loaded away from programs since the program
949 * may otherwise collide with the loader (especially
950 * for ET_EXEC which does not have a randomized
951 * position). For example to handle invocations of
952 * "./ld.so someprog" to test out a new version of
953 * the loader, the subsequent program that the
954 * loader loads must avoid the loader itself, so
955 * they cannot share the same load range. Sufficient
956 * room for the brk must be allocated with the
957 * loader as well, since brk must be available with
958 * the loader.
959 *
960 * Therefore, programs are loaded offset from
961 * ELF_ET_DYN_BASE and loaders are loaded into the
962 * independently randomized mmap region (0 load_bias
963 * without MAP_FIXED).
964 */
Alexey Dobriyancc338012019-05-14 15:43:39 -0700965 if (interpreter) {
Kees Cookeab09532017-07-10 15:52:37 -0700966 load_bias = ELF_ET_DYN_BASE;
967 if (current->flags & PF_RANDOMIZE)
968 load_bias += arch_mmap_rnd();
Michal Hockoad55eac2018-04-10 16:36:05 -0700969 elf_flags |= elf_fixed;
Kees Cookeab09532017-07-10 15:52:37 -0700970 } else
971 load_bias = 0;
972
973 /*
974 * Since load_bias is used for all subsequent loading
975 * calculations, we must lower it by the first vaddr
976 * so that the remaining calculations based on the
977 * ELF vaddrs will be correctly offset. The result
978 * is then page aligned.
979 */
980 load_bias = ELF_PAGESTART(load_bias - vaddr);
981
Michael Davidsona87938b2015-04-14 15:47:38 -0700982 total_size = total_mapping_size(elf_phdata,
983 loc->elf_ex.e_phnum);
984 if (!total_size) {
Andrew Morton2b1d3ae2015-05-28 15:44:24 -0700985 retval = -EINVAL;
Michael Davidsona87938b2015-04-14 15:47:38 -0700986 goto out_free_dentry;
987 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700988 }
989
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700990 error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt,
Michael Davidsona87938b2015-04-14 15:47:38 -0700991 elf_prot, elf_flags, total_size);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700992 if (BAD_ADDR(error)) {
Alexey Kuznetsovb140f2512007-05-08 00:31:57 -0700993 retval = IS_ERR((void *)error) ?
994 PTR_ERR((void*)error) : -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700995 goto out_free_dentry;
996 }
997
998 if (!load_addr_set) {
999 load_addr_set = 1;
1000 load_addr = (elf_ppnt->p_vaddr - elf_ppnt->p_offset);
1001 if (loc->elf_ex.e_type == ET_DYN) {
1002 load_bias += error -
1003 ELF_PAGESTART(load_bias + vaddr);
1004 load_addr += load_bias;
1005 reloc_func_desc = load_bias;
1006 }
1007 }
1008 k = elf_ppnt->p_vaddr;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001009 if (k < start_code)
1010 start_code = k;
1011 if (start_data < k)
1012 start_data = k;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001013
1014 /*
1015 * Check to see if the section's size will overflow the
1016 * allowed task size. Note that p_filesz must always be
1017 * <= p_memsz so it is only necessary to check p_memsz.
1018 */
Chuck Ebbertce510592006-07-03 00:24:14 -07001019 if (BAD_ADDR(k) || elf_ppnt->p_filesz > elf_ppnt->p_memsz ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07001020 elf_ppnt->p_memsz > TASK_SIZE ||
1021 TASK_SIZE - elf_ppnt->p_memsz < k) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001022 /* set_brk can never work. Avoid overflows. */
Alexey Kuznetsovb140f2512007-05-08 00:31:57 -07001023 retval = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001024 goto out_free_dentry;
1025 }
1026
1027 k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz;
1028
1029 if (k > elf_bss)
1030 elf_bss = k;
1031 if ((elf_ppnt->p_flags & PF_X) && end_code < k)
1032 end_code = k;
1033 if (end_data < k)
1034 end_data = k;
1035 k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz;
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001036 if (k > elf_brk) {
1037 bss_prot = elf_prot;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001038 elf_brk = k;
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001039 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001040 }
1041
1042 loc->elf_ex.e_entry += load_bias;
1043 elf_bss += load_bias;
1044 elf_brk += load_bias;
1045 start_code += load_bias;
1046 end_code += load_bias;
1047 start_data += load_bias;
1048 end_data += load_bias;
1049
1050 /* Calling set_brk effectively mmaps the pages that we need
1051 * for the bss and break sections. We must do this before
1052 * mapping in the interpreter, to make sure it doesn't wind
1053 * up getting placed where the bss needs to go.
1054 */
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001055 retval = set_brk(elf_bss, elf_brk, bss_prot);
Al Viro19d860a2014-05-04 20:11:36 -04001056 if (retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001057 goto out_free_dentry;
akpm@osdl.org6de50512005-10-11 08:29:08 -07001058 if (likely(elf_bss != elf_brk) && unlikely(padzero(elf_bss))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001059 retval = -EFAULT; /* Nobody gets to see this, but.. */
1060 goto out_free_dentry;
1061 }
1062
Alexey Dobriyancc338012019-05-14 15:43:39 -07001063 if (interpreter) {
Alan Cox6eec4822012-10-04 17:13:42 -07001064 unsigned long interp_map_addr = 0;
Jiri Kosinacc503c12008-01-30 13:31:07 +01001065
Andi Kleend20894a2008-02-08 04:21:54 -08001066 elf_entry = load_elf_interp(&loc->interp_elf_ex,
1067 interpreter,
1068 &interp_map_addr,
Paul Burtona9d9ef12014-09-11 08:30:15 +01001069 load_bias, interp_elf_phdata);
Andi Kleend20894a2008-02-08 04:21:54 -08001070 if (!IS_ERR((void *)elf_entry)) {
1071 /*
1072 * load_elf_interp() returns relocation
1073 * adjustment
1074 */
1075 interp_load_addr = elf_entry;
1076 elf_entry += loc->interp_elf_ex.e_entry;
Jiri Kosinacc503c12008-01-30 13:31:07 +01001077 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001078 if (BAD_ADDR(elf_entry)) {
Chuck Ebbertce510592006-07-03 00:24:14 -07001079 retval = IS_ERR((void *)elf_entry) ?
1080 (int)elf_entry : -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001081 goto out_free_dentry;
1082 }
1083 reloc_func_desc = interp_load_addr;
1084
1085 allow_write_access(interpreter);
1086 fput(interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001087 } else {
1088 elf_entry = loc->elf_ex.e_entry;
Suresh Siddha5342fba2006-02-26 04:18:28 +01001089 if (BAD_ADDR(elf_entry)) {
Chuck Ebbertce510592006-07-03 00:24:14 -07001090 retval = -EINVAL;
Suresh Siddha5342fba2006-02-26 04:18:28 +01001091 goto out_free_dentry;
1092 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001093 }
1094
Paul Burton774c1052014-09-11 08:30:16 +01001095 kfree(interp_elf_phdata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001096 kfree(elf_phdata);
1097
Linus Torvalds1da177e2005-04-16 15:20:36 -07001098 set_binfmt(&elf_format);
1099
Benjamin Herrenschmidt547ee842005-04-16 15:24:35 -07001100#ifdef ARCH_HAS_SETUP_ADDITIONAL_PAGES
Alexey Dobriyancc338012019-05-14 15:43:39 -07001101 retval = arch_setup_additional_pages(bprm, !!interpreter);
Al Viro19d860a2014-05-04 20:11:36 -04001102 if (retval < 0)
Roland McGrath18c8baff2005-04-28 15:17:19 -07001103 goto out;
Benjamin Herrenschmidt547ee842005-04-16 15:24:35 -07001104#endif /* ARCH_HAS_SETUP_ADDITIONAL_PAGES */
1105
Ollie Wildb6a2fea2007-07-19 01:48:16 -07001106 retval = create_elf_tables(bprm, &loc->elf_ex,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001107 load_addr, interp_load_addr);
Al Viro19d860a2014-05-04 20:11:36 -04001108 if (retval < 0)
Ollie Wildb6a2fea2007-07-19 01:48:16 -07001109 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001110 current->mm->end_code = end_code;
1111 current->mm->start_code = start_code;
1112 current->mm->start_data = start_data;
1113 current->mm->end_data = end_data;
1114 current->mm->start_stack = bprm->p;
1115
Jiri Kosina4471a672011-04-14 15:22:09 -07001116 if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1)) {
Kees Cookbbdc6072019-05-14 15:43:57 -07001117 /*
1118 * For architectures with ELF randomization, when executing
1119 * a loader directly (i.e. no interpreter listed in ELF
1120 * headers), move the brk area out of the mmap region
1121 * (since it grows up, and may collide early with the stack
1122 * growing down), and into the unused ELF_ET_DYN_BASE region.
1123 */
Kees Cook7be3cb02019-09-26 10:15:25 -07001124 if (IS_ENABLED(CONFIG_ARCH_HAS_ELF_RANDOMIZE) &&
1125 loc->elf_ex.e_type == ET_DYN && !interpreter)
Kees Cookbbdc6072019-05-14 15:43:57 -07001126 current->mm->brk = current->mm->start_brk =
1127 ELF_ET_DYN_BASE;
1128
Jiri Kosinac1d171a2008-01-30 13:30:40 +01001129 current->mm->brk = current->mm->start_brk =
1130 arch_randomize_brk(current->mm);
Kees Cook204db6e2015-04-14 15:48:12 -07001131#ifdef compat_brk_randomized
Jiri Kosina4471a672011-04-14 15:22:09 -07001132 current->brk_randomized = 1;
1133#endif
1134 }
Jiri Kosinac1d171a2008-01-30 13:30:40 +01001135
Linus Torvalds1da177e2005-04-16 15:20:36 -07001136 if (current->personality & MMAP_PAGE_ZERO) {
1137 /* Why this, you ask??? Well SVr4 maps page 0 as read-only,
1138 and some applications "depend" upon this behavior.
1139 Since we do not have the power to recompile these, we
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001140 emulate the SVr4 behavior. Sigh. */
Linus Torvalds6be5ceb2012-04-20 17:13:58 -07001141 error = vm_mmap(NULL, 0, PAGE_SIZE, PROT_READ | PROT_EXEC,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001142 MAP_FIXED | MAP_PRIVATE, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001143 }
1144
Alexey Dobriyan249b08e2019-05-14 15:43:54 -07001145 regs = current_pt_regs();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001146#ifdef ELF_PLAT_INIT
1147 /*
1148 * The ABI may specify that certain registers be set up in special
1149 * ways (on i386 %edx is the address of a DT_FINI function, for
1150 * example. In addition, it may also specify (eg, PowerPC64 ELF)
1151 * that the e_entry field is the address of the function descriptor
1152 * for the startup routine, rather than the address of the startup
1153 * routine itself. This macro performs whatever initialization to
1154 * the regs structure is required as well as any relocations to the
1155 * function descriptor entries when executing dynamically links apps.
1156 */
1157 ELF_PLAT_INIT(regs, reloc_func_desc);
1158#endif
1159
Kees Cookb8383832018-04-10 16:34:57 -07001160 finalize_exec(bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001161 start_thread(regs, elf_entry, bprm->p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001162 retval = 0;
1163out:
1164 kfree(loc);
1165out_ret:
1166 return retval;
1167
1168 /* error cleanup */
1169out_free_dentry:
Paul Burtona9d9ef12014-09-11 08:30:15 +01001170 kfree(interp_elf_phdata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001171 allow_write_access(interpreter);
1172 if (interpreter)
1173 fput(interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001174out_free_ph:
1175 kfree(elf_phdata);
1176 goto out;
1177}
1178
Josh Triplett69369a72014-04-03 14:48:27 -07001179#ifdef CONFIG_USELIB
Linus Torvalds1da177e2005-04-16 15:20:36 -07001180/* This is really simpleminded and specialized - we are loading an
1181 a.out library that is given an ELF header. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001182static int load_elf_library(struct file *file)
1183{
1184 struct elf_phdr *elf_phdata;
1185 struct elf_phdr *eppnt;
1186 unsigned long elf_bss, bss, len;
1187 int retval, error, i, j;
1188 struct elfhdr elf_ex;
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +02001189 loff_t pos = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001190
1191 error = -ENOEXEC;
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +02001192 retval = kernel_read(file, &elf_ex, sizeof(elf_ex), &pos);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001193 if (retval != sizeof(elf_ex))
1194 goto out;
1195
1196 if (memcmp(elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
1197 goto out;
1198
1199 /* First of all, some simple consistency checks */
1200 if (elf_ex.e_type != ET_EXEC || elf_ex.e_phnum > 2 ||
Al Viro72c2d532013-09-22 16:27:52 -04001201 !elf_check_arch(&elf_ex) || !file->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001202 goto out;
Nicolas Pitre47552002017-08-16 16:05:13 -04001203 if (elf_check_fdpic(&elf_ex))
1204 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001205
1206 /* Now read in all of the header information */
1207
1208 j = sizeof(struct elf_phdr) * elf_ex.e_phnum;
1209 /* j < ELF_MIN_ALIGN because elf_ex.e_phnum <= 2 */
1210
1211 error = -ENOMEM;
1212 elf_phdata = kmalloc(j, GFP_KERNEL);
1213 if (!elf_phdata)
1214 goto out;
1215
1216 eppnt = elf_phdata;
1217 error = -ENOEXEC;
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +02001218 pos = elf_ex.e_phoff;
1219 retval = kernel_read(file, eppnt, j, &pos);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001220 if (retval != j)
1221 goto out_free_ph;
1222
1223 for (j = 0, i = 0; i<elf_ex.e_phnum; i++)
1224 if ((eppnt + i)->p_type == PT_LOAD)
1225 j++;
1226 if (j != 1)
1227 goto out_free_ph;
1228
1229 while (eppnt->p_type != PT_LOAD)
1230 eppnt++;
1231
1232 /* Now use mmap to map the library into memory. */
Linus Torvalds6be5ceb2012-04-20 17:13:58 -07001233 error = vm_mmap(file,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001234 ELF_PAGESTART(eppnt->p_vaddr),
1235 (eppnt->p_filesz +
1236 ELF_PAGEOFFSET(eppnt->p_vaddr)),
1237 PROT_READ | PROT_WRITE | PROT_EXEC,
Michal Hocko4ed28632018-04-10 16:36:01 -07001238 MAP_FIXED_NOREPLACE | MAP_PRIVATE | MAP_DENYWRITE,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001239 (eppnt->p_offset -
1240 ELF_PAGEOFFSET(eppnt->p_vaddr)));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001241 if (error != ELF_PAGESTART(eppnt->p_vaddr))
1242 goto out_free_ph;
1243
1244 elf_bss = eppnt->p_vaddr + eppnt->p_filesz;
1245 if (padzero(elf_bss)) {
1246 error = -EFAULT;
1247 goto out_free_ph;
1248 }
1249
Oscar Salvador24962af2018-07-13 16:59:13 -07001250 len = ELF_PAGEALIGN(eppnt->p_filesz + eppnt->p_vaddr);
1251 bss = ELF_PAGEALIGN(eppnt->p_memsz + eppnt->p_vaddr);
Michal Hockoecc2bc82016-05-23 16:25:39 -07001252 if (bss > len) {
1253 error = vm_brk(len, bss - len);
Linus Torvalds5d22fc22016-05-27 15:57:31 -07001254 if (error)
Michal Hockoecc2bc82016-05-23 16:25:39 -07001255 goto out_free_ph;
1256 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001257 error = 0;
1258
1259out_free_ph:
1260 kfree(elf_phdata);
1261out:
1262 return error;
1263}
Josh Triplett69369a72014-04-03 14:48:27 -07001264#endif /* #ifdef CONFIG_USELIB */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001265
Christoph Hellwig698ba7b2009-12-15 16:47:37 -08001266#ifdef CONFIG_ELF_CORE
Linus Torvalds1da177e2005-04-16 15:20:36 -07001267/*
1268 * ELF core dumper
1269 *
1270 * Modelled on fs/exec.c:aout_core_dump()
1271 * Jeremy Fitzhardinge <jeremy@sw.oz.au>
1272 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001273
1274/*
Jason Baron909af762012-03-23 15:02:51 -07001275 * The purpose of always_dump_vma() is to make sure that special kernel mappings
1276 * that are useful for post-mortem analysis are included in every core dump.
1277 * In that way we ensure that the core dump is fully interpretable later
1278 * without matching up the same kernel and hardware config to see what PC values
1279 * meant. These special mappings include - vDSO, vsyscall, and other
1280 * architecture specific mappings
1281 */
1282static bool always_dump_vma(struct vm_area_struct *vma)
1283{
1284 /* Any vsyscall mappings? */
1285 if (vma == get_gate_vma(vma->vm_mm))
1286 return true;
Andy Lutomirski78d683e2014-05-19 15:58:32 -07001287
1288 /*
1289 * Assume that all vmas with a .name op should always be dumped.
1290 * If this changes, a new vm_ops field can easily be added.
1291 */
1292 if (vma->vm_ops && vma->vm_ops->name && vma->vm_ops->name(vma))
1293 return true;
1294
Jason Baron909af762012-03-23 15:02:51 -07001295 /*
1296 * arch_vma_name() returns non-NULL for special architecture mappings,
1297 * such as vDSO sections.
1298 */
1299 if (arch_vma_name(vma))
1300 return true;
1301
1302 return false;
1303}
1304
1305/*
Roland McGrath82df3972007-10-16 23:27:02 -07001306 * Decide what to dump of a segment, part, all or none.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001307 */
Roland McGrath82df3972007-10-16 23:27:02 -07001308static unsigned long vma_dump_size(struct vm_area_struct *vma,
1309 unsigned long mm_flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001310{
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001311#define FILTER(type) (mm_flags & (1UL << MMF_DUMP_##type))
1312
Jason Baron909af762012-03-23 15:02:51 -07001313 /* always dump the vdso and vsyscall sections */
1314 if (always_dump_vma(vma))
Roland McGrath82df3972007-10-16 23:27:02 -07001315 goto whole;
Roland McGrathe5b97dd2007-01-26 00:56:48 -08001316
Konstantin Khlebnikov0103bd12012-10-08 16:28:59 -07001317 if (vma->vm_flags & VM_DONTDUMP)
Jason Baronaccb61f2012-03-23 15:02:51 -07001318 return 0;
1319
Ross Zwisler50378352015-10-05 16:33:36 -06001320 /* support for DAX */
1321 if (vma_is_dax(vma)) {
1322 if ((vma->vm_flags & VM_SHARED) && FILTER(DAX_SHARED))
1323 goto whole;
1324 if (!(vma->vm_flags & VM_SHARED) && FILTER(DAX_PRIVATE))
1325 goto whole;
1326 return 0;
1327 }
1328
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001329 /* Hugetlb memory check */
1330 if (vma->vm_flags & VM_HUGETLB) {
1331 if ((vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_SHARED))
1332 goto whole;
1333 if (!(vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_PRIVATE))
1334 goto whole;
Naoya Horiguchi23d9e482013-04-17 15:58:28 -07001335 return 0;
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001336 }
1337
Linus Torvalds1da177e2005-04-16 15:20:36 -07001338 /* Do not dump I/O mapped devices or special mappings */
Konstantin Khlebnikov314e51b2012-10-08 16:29:02 -07001339 if (vma->vm_flags & VM_IO)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001340 return 0;
1341
Kawai, Hidehiroa1b59e82007-07-19 01:48:29 -07001342 /* By default, dump shared memory if mapped from an anonymous file. */
1343 if (vma->vm_flags & VM_SHARED) {
Al Viro496ad9a2013-01-23 17:07:38 -05001344 if (file_inode(vma->vm_file)->i_nlink == 0 ?
Roland McGrath82df3972007-10-16 23:27:02 -07001345 FILTER(ANON_SHARED) : FILTER(MAPPED_SHARED))
1346 goto whole;
1347 return 0;
Kawai, Hidehiroa1b59e82007-07-19 01:48:29 -07001348 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001349
Roland McGrath82df3972007-10-16 23:27:02 -07001350 /* Dump segments that have been written to. */
1351 if (vma->anon_vma && FILTER(ANON_PRIVATE))
1352 goto whole;
1353 if (vma->vm_file == NULL)
1354 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001355
Roland McGrath82df3972007-10-16 23:27:02 -07001356 if (FILTER(MAPPED_PRIVATE))
1357 goto whole;
1358
1359 /*
1360 * If this looks like the beginning of a DSO or executable mapping,
1361 * check for an ELF header. If we find one, dump the first page to
1362 * aid in determining what was mapped here.
1363 */
Roland McGrath92dc07b2009-02-06 17:34:07 -08001364 if (FILTER(ELF_HEADERS) &&
1365 vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) {
Roland McGrath82df3972007-10-16 23:27:02 -07001366 u32 __user *header = (u32 __user *) vma->vm_start;
1367 u32 word;
Roland McGrath92dc07b2009-02-06 17:34:07 -08001368 mm_segment_t fs = get_fs();
Roland McGrath82df3972007-10-16 23:27:02 -07001369 /*
1370 * Doing it this way gets the constant folded by GCC.
1371 */
1372 union {
1373 u32 cmp;
1374 char elfmag[SELFMAG];
1375 } magic;
1376 BUILD_BUG_ON(SELFMAG != sizeof word);
1377 magic.elfmag[EI_MAG0] = ELFMAG0;
1378 magic.elfmag[EI_MAG1] = ELFMAG1;
1379 magic.elfmag[EI_MAG2] = ELFMAG2;
1380 magic.elfmag[EI_MAG3] = ELFMAG3;
Roland McGrath92dc07b2009-02-06 17:34:07 -08001381 /*
1382 * Switch to the user "segment" for get_user(),
1383 * then put back what elf_core_dump() had in place.
1384 */
1385 set_fs(USER_DS);
1386 if (unlikely(get_user(word, header)))
1387 word = 0;
1388 set_fs(fs);
1389 if (word == magic.cmp)
Roland McGrath82df3972007-10-16 23:27:02 -07001390 return PAGE_SIZE;
1391 }
1392
1393#undef FILTER
1394
1395 return 0;
1396
1397whole:
1398 return vma->vm_end - vma->vm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001399}
1400
Linus Torvalds1da177e2005-04-16 15:20:36 -07001401/* An ELF note in memory */
1402struct memelfnote
1403{
1404 const char *name;
1405 int type;
1406 unsigned int datasz;
1407 void *data;
1408};
1409
1410static int notesize(struct memelfnote *en)
1411{
1412 int sz;
1413
1414 sz = sizeof(struct elf_note);
1415 sz += roundup(strlen(en->name) + 1, 4);
1416 sz += roundup(en->datasz, 4);
1417
1418 return sz;
1419}
1420
Al Viroecc8c772013-10-05 15:32:35 -04001421static int writenote(struct memelfnote *men, struct coredump_params *cprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001422{
1423 struct elf_note en;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001424 en.n_namesz = strlen(men->name) + 1;
1425 en.n_descsz = men->datasz;
1426 en.n_type = men->type;
1427
Al Viroecc8c772013-10-05 15:32:35 -04001428 return dump_emit(cprm, &en, sizeof(en)) &&
Al Viro22a8cb82013-10-08 11:05:01 -04001429 dump_emit(cprm, men->name, en.n_namesz) && dump_align(cprm, 4) &&
1430 dump_emit(cprm, men->data, men->datasz) && dump_align(cprm, 4);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001431}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001432
Roland McGrath3aba4812008-01-30 13:31:44 +01001433static void fill_elf_header(struct elfhdr *elf, int segs,
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001434 u16 machine, u32 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001435{
Cyrill Gorcunov6970c8e2008-04-29 01:01:18 -07001436 memset(elf, 0, sizeof(*elf));
1437
Linus Torvalds1da177e2005-04-16 15:20:36 -07001438 memcpy(elf->e_ident, ELFMAG, SELFMAG);
1439 elf->e_ident[EI_CLASS] = ELF_CLASS;
1440 elf->e_ident[EI_DATA] = ELF_DATA;
1441 elf->e_ident[EI_VERSION] = EV_CURRENT;
1442 elf->e_ident[EI_OSABI] = ELF_OSABI;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001443
1444 elf->e_type = ET_CORE;
Roland McGrath3aba4812008-01-30 13:31:44 +01001445 elf->e_machine = machine;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001446 elf->e_version = EV_CURRENT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001447 elf->e_phoff = sizeof(struct elfhdr);
Roland McGrath3aba4812008-01-30 13:31:44 +01001448 elf->e_flags = flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001449 elf->e_ehsize = sizeof(struct elfhdr);
1450 elf->e_phentsize = sizeof(struct elf_phdr);
1451 elf->e_phnum = segs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001452}
1453
Andrew Morton8d6b5eee2006-09-25 23:32:04 -07001454static void fill_elf_note_phdr(struct elf_phdr *phdr, int sz, loff_t offset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001455{
1456 phdr->p_type = PT_NOTE;
1457 phdr->p_offset = offset;
1458 phdr->p_vaddr = 0;
1459 phdr->p_paddr = 0;
1460 phdr->p_filesz = sz;
1461 phdr->p_memsz = 0;
1462 phdr->p_flags = 0;
1463 phdr->p_align = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001464}
1465
1466static void fill_note(struct memelfnote *note, const char *name, int type,
1467 unsigned int sz, void *data)
1468{
1469 note->name = name;
1470 note->type = type;
1471 note->datasz = sz;
1472 note->data = data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001473}
1474
1475/*
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001476 * fill up all the fields in prstatus from the given task struct, except
1477 * registers which need to be filled up separately.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001478 */
1479static void fill_prstatus(struct elf_prstatus *prstatus,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001480 struct task_struct *p, long signr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001481{
1482 prstatus->pr_info.si_signo = prstatus->pr_cursig = signr;
1483 prstatus->pr_sigpend = p->pending.signal.sig[0];
1484 prstatus->pr_sighold = p->blocked.sig[0];
Oleg Nesterov3b34fc52009-06-17 16:27:38 -07001485 rcu_read_lock();
1486 prstatus->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1487 rcu_read_unlock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001488 prstatus->pr_pid = task_pid_vnr(p);
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001489 prstatus->pr_pgrp = task_pgrp_vnr(p);
1490 prstatus->pr_sid = task_session_vnr(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001491 if (thread_group_leader(p)) {
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001492 struct task_cputime cputime;
Frank Mayharf06febc2008-09-12 09:54:39 -07001493
Linus Torvalds1da177e2005-04-16 15:20:36 -07001494 /*
Frank Mayharf06febc2008-09-12 09:54:39 -07001495 * This is the record for the group leader. It shows the
1496 * group-wide total, not its individual thread total.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001497 */
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001498 thread_group_cputime(p, &cputime);
1499 prstatus->pr_utime = ns_to_timeval(cputime.utime);
1500 prstatus->pr_stime = ns_to_timeval(cputime.stime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001501 } else {
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001502 u64 utime, stime;
Frederic Weisbecker6fac4822012-11-13 14:20:55 +01001503
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001504 task_cputime(p, &utime, &stime);
1505 prstatus->pr_utime = ns_to_timeval(utime);
1506 prstatus->pr_stime = ns_to_timeval(stime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001507 }
Frederic Weisbecker5613fda2017-01-31 04:09:23 +01001508
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001509 prstatus->pr_cutime = ns_to_timeval(p->signal->cutime);
1510 prstatus->pr_cstime = ns_to_timeval(p->signal->cstime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001511}
1512
1513static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p,
1514 struct mm_struct *mm)
1515{
David Howellsc69e8d92008-11-14 10:39:19 +11001516 const struct cred *cred;
Greg Kroah-Hartmana84a5052005-05-11 00:10:44 -07001517 unsigned int i, len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001518
1519 /* first copy the parameters from user space */
1520 memset(psinfo, 0, sizeof(struct elf_prpsinfo));
1521
1522 len = mm->arg_end - mm->arg_start;
1523 if (len >= ELF_PRARGSZ)
1524 len = ELF_PRARGSZ-1;
1525 if (copy_from_user(&psinfo->pr_psargs,
1526 (const char __user *)mm->arg_start, len))
1527 return -EFAULT;
1528 for(i = 0; i < len; i++)
1529 if (psinfo->pr_psargs[i] == 0)
1530 psinfo->pr_psargs[i] = ' ';
1531 psinfo->pr_psargs[len] = 0;
1532
Oleg Nesterov3b34fc52009-06-17 16:27:38 -07001533 rcu_read_lock();
1534 psinfo->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1535 rcu_read_unlock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001536 psinfo->pr_pid = task_pid_vnr(p);
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001537 psinfo->pr_pgrp = task_pgrp_vnr(p);
1538 psinfo->pr_sid = task_session_vnr(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001539
1540 i = p->state ? ffz(~p->state) + 1 : 0;
1541 psinfo->pr_state = i;
Carsten Otte55148542006-03-25 03:08:22 -08001542 psinfo->pr_sname = (i > 5) ? '.' : "RSDTZW"[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001543 psinfo->pr_zomb = psinfo->pr_sname == 'Z';
1544 psinfo->pr_nice = task_nice(p);
1545 psinfo->pr_flag = p->flags;
David Howellsc69e8d92008-11-14 10:39:19 +11001546 rcu_read_lock();
1547 cred = __task_cred(p);
Eric W. Biedermanebc887b2012-02-07 18:36:10 -08001548 SET_UID(psinfo->pr_uid, from_kuid_munged(cred->user_ns, cred->uid));
1549 SET_GID(psinfo->pr_gid, from_kgid_munged(cred->user_ns, cred->gid));
David Howellsc69e8d92008-11-14 10:39:19 +11001550 rcu_read_unlock();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001551 strncpy(psinfo->pr_fname, p->comm, sizeof(psinfo->pr_fname));
1552
1553 return 0;
1554}
1555
Roland McGrath3aba4812008-01-30 13:31:44 +01001556static void fill_auxv_note(struct memelfnote *note, struct mm_struct *mm)
1557{
1558 elf_addr_t *auxv = (elf_addr_t *) mm->saved_auxv;
1559 int i = 0;
1560 do
1561 i += 2;
1562 while (auxv[i - 2] != AT_NULL);
1563 fill_note(note, "CORE", NT_AUXV, i * sizeof(elf_addr_t), auxv);
1564}
1565
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001566static void fill_siginfo_note(struct memelfnote *note, user_siginfo_t *csigdata,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02001567 const kernel_siginfo_t *siginfo)
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001568{
1569 mm_segment_t old_fs = get_fs();
1570 set_fs(KERNEL_DS);
1571 copy_siginfo_to_user((user_siginfo_t __user *) csigdata, siginfo);
1572 set_fs(old_fs);
1573 fill_note(note, "CORE", NT_SIGINFO, sizeof(*csigdata), csigdata);
1574}
1575
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001576#define MAX_FILE_NOTE_SIZE (4*1024*1024)
1577/*
1578 * Format of NT_FILE note:
1579 *
1580 * long count -- how many files are mapped
1581 * long page_size -- units for file_ofs
1582 * array of [COUNT] elements of
1583 * long start
1584 * long end
1585 * long file_ofs
1586 * followed by COUNT filenames in ASCII: "FILE1" NUL "FILE2" NUL...
1587 */
Dan Aloni72023652013-09-30 13:45:02 -07001588static int fill_files_note(struct memelfnote *note)
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001589{
1590 struct vm_area_struct *vma;
1591 unsigned count, size, names_ofs, remaining, n;
1592 user_long_t *data;
1593 user_long_t *start_end_ofs;
1594 char *name_base, *name_curpos;
1595
1596 /* *Estimated* file count and total data size needed */
1597 count = current->mm->map_count;
Alexey Dobriyan60c9d922018-02-06 15:39:13 -08001598 if (count > UINT_MAX / 64)
1599 return -EINVAL;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001600 size = count * 64;
1601
1602 names_ofs = (2 + 3 * count) * sizeof(data[0]);
1603 alloc:
1604 if (size >= MAX_FILE_NOTE_SIZE) /* paranoia check */
Dan Aloni72023652013-09-30 13:45:02 -07001605 return -EINVAL;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001606 size = round_up(size, PAGE_SIZE);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001607 data = kvmalloc(size, GFP_KERNEL);
1608 if (ZERO_OR_NULL_PTR(data))
Dan Aloni72023652013-09-30 13:45:02 -07001609 return -ENOMEM;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001610
1611 start_end_ofs = data + 2;
1612 name_base = name_curpos = ((char *)data) + names_ofs;
1613 remaining = size - names_ofs;
1614 count = 0;
1615 for (vma = current->mm->mmap; vma != NULL; vma = vma->vm_next) {
1616 struct file *file;
1617 const char *filename;
1618
1619 file = vma->vm_file;
1620 if (!file)
1621 continue;
Miklos Szeredi9bf39ab2015-06-19 10:29:13 +02001622 filename = file_path(file, name_curpos, remaining);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001623 if (IS_ERR(filename)) {
1624 if (PTR_ERR(filename) == -ENAMETOOLONG) {
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001625 kvfree(data);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001626 size = size * 5 / 4;
1627 goto alloc;
1628 }
1629 continue;
1630 }
1631
Miklos Szeredi9bf39ab2015-06-19 10:29:13 +02001632 /* file_path() fills at the end, move name down */
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001633 /* n = strlen(filename) + 1: */
1634 n = (name_curpos + remaining) - filename;
1635 remaining = filename - name_curpos;
1636 memmove(name_curpos, filename, n);
1637 name_curpos += n;
1638
1639 *start_end_ofs++ = vma->vm_start;
1640 *start_end_ofs++ = vma->vm_end;
1641 *start_end_ofs++ = vma->vm_pgoff;
1642 count++;
1643 }
1644
1645 /* Now we know exact count of files, can store it */
1646 data[0] = count;
1647 data[1] = PAGE_SIZE;
1648 /*
1649 * Count usually is less than current->mm->map_count,
1650 * we need to move filenames down.
1651 */
1652 n = current->mm->map_count - count;
1653 if (n != 0) {
1654 unsigned shift_bytes = n * 3 * sizeof(data[0]);
1655 memmove(name_base - shift_bytes, name_base,
1656 name_curpos - name_base);
1657 name_curpos -= shift_bytes;
1658 }
1659
1660 size = name_curpos - (char *)data;
1661 fill_note(note, "CORE", NT_FILE, size, data);
Dan Aloni72023652013-09-30 13:45:02 -07001662 return 0;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001663}
1664
Roland McGrath4206d3a2008-01-30 13:31:45 +01001665#ifdef CORE_DUMP_USE_REGSET
1666#include <linux/regset.h>
1667
1668struct elf_thread_core_info {
1669 struct elf_thread_core_info *next;
1670 struct task_struct *task;
1671 struct elf_prstatus prstatus;
1672 struct memelfnote notes[0];
1673};
1674
1675struct elf_note_info {
1676 struct elf_thread_core_info *thread;
1677 struct memelfnote psinfo;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001678 struct memelfnote signote;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001679 struct memelfnote auxv;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001680 struct memelfnote files;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001681 user_siginfo_t csigdata;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001682 size_t size;
1683 int thread_notes;
1684};
1685
Roland McGrathd31472b2008-03-04 14:28:30 -08001686/*
1687 * When a regset has a writeback hook, we call it on each thread before
1688 * dumping user memory. On register window machines, this makes sure the
1689 * user memory backing the register data is up to date before we read it.
1690 */
1691static void do_thread_regset_writeback(struct task_struct *task,
1692 const struct user_regset *regset)
1693{
1694 if (regset->writeback)
1695 regset->writeback(task, regset, 1);
1696}
1697
H. J. Lu0953f65d2012-02-14 13:34:52 -08001698#ifndef PRSTATUS_SIZE
Dmitry Safonov90954e72016-09-05 16:33:06 +03001699#define PRSTATUS_SIZE(S, R) sizeof(S)
H. J. Lu0953f65d2012-02-14 13:34:52 -08001700#endif
1701
1702#ifndef SET_PR_FPVALID
Dmitry Safonov90954e72016-09-05 16:33:06 +03001703#define SET_PR_FPVALID(S, V, R) ((S)->pr_fpvalid = (V))
H. J. Lu0953f65d2012-02-14 13:34:52 -08001704#endif
1705
Roland McGrath4206d3a2008-01-30 13:31:45 +01001706static int fill_thread_core_info(struct elf_thread_core_info *t,
1707 const struct user_regset_view *view,
1708 long signr, size_t *total)
1709{
1710 unsigned int i;
Dave Martin27e64b42017-10-31 15:50:53 +00001711 unsigned int regset0_size = regset_size(t->task, &view->regsets[0]);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001712
1713 /*
1714 * NT_PRSTATUS is the one special case, because the regset data
1715 * goes into the pr_reg field inside the note contents, rather
1716 * than being the whole note contents. We fill the reset in here.
1717 * We assume that regset 0 is NT_PRSTATUS.
1718 */
1719 fill_prstatus(&t->prstatus, t->task, signr);
Dave Martin27e64b42017-10-31 15:50:53 +00001720 (void) view->regsets[0].get(t->task, &view->regsets[0], 0, regset0_size,
Dmitry Safonov90954e72016-09-05 16:33:06 +03001721 &t->prstatus.pr_reg, NULL);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001722
1723 fill_note(&t->notes[0], "CORE", NT_PRSTATUS,
Dave Martin27e64b42017-10-31 15:50:53 +00001724 PRSTATUS_SIZE(t->prstatus, regset0_size), &t->prstatus);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001725 *total += notesize(&t->notes[0]);
1726
Roland McGrathd31472b2008-03-04 14:28:30 -08001727 do_thread_regset_writeback(t->task, &view->regsets[0]);
1728
Roland McGrath4206d3a2008-01-30 13:31:45 +01001729 /*
1730 * Each other regset might generate a note too. For each regset
1731 * that has no core_note_type or is inactive, we leave t->notes[i]
1732 * all zero and we'll know to skip writing it later.
1733 */
1734 for (i = 1; i < view->n; ++i) {
1735 const struct user_regset *regset = &view->regsets[i];
Roland McGrathd31472b2008-03-04 14:28:30 -08001736 do_thread_regset_writeback(t->task, regset);
H. Peter Anvinc8e25252012-03-02 10:43:48 -08001737 if (regset->core_note_type && regset->get &&
Maciej W. Rozycki2f819db2018-05-15 23:32:45 +01001738 (!regset->active || regset->active(t->task, regset) > 0)) {
Roland McGrath4206d3a2008-01-30 13:31:45 +01001739 int ret;
Dave Martin27e64b42017-10-31 15:50:53 +00001740 size_t size = regset_size(t->task, regset);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001741 void *data = kmalloc(size, GFP_KERNEL);
1742 if (unlikely(!data))
1743 return 0;
1744 ret = regset->get(t->task, regset,
1745 0, size, data, NULL);
1746 if (unlikely(ret))
1747 kfree(data);
1748 else {
1749 if (regset->core_note_type != NT_PRFPREG)
1750 fill_note(&t->notes[i], "LINUX",
1751 regset->core_note_type,
1752 size, data);
1753 else {
Dmitry Safonov90954e72016-09-05 16:33:06 +03001754 SET_PR_FPVALID(&t->prstatus,
Dave Martin27e64b42017-10-31 15:50:53 +00001755 1, regset0_size);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001756 fill_note(&t->notes[i], "CORE",
1757 NT_PRFPREG, size, data);
1758 }
1759 *total += notesize(&t->notes[i]);
1760 }
1761 }
1762 }
1763
1764 return 1;
1765}
1766
1767static int fill_note_info(struct elfhdr *elf, int phdrs,
1768 struct elf_note_info *info,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02001769 const kernel_siginfo_t *siginfo, struct pt_regs *regs)
Roland McGrath4206d3a2008-01-30 13:31:45 +01001770{
1771 struct task_struct *dump_task = current;
1772 const struct user_regset_view *view = task_user_regset_view(dump_task);
1773 struct elf_thread_core_info *t;
1774 struct elf_prpsinfo *psinfo;
Oleg Nesterov83914442008-07-25 01:47:45 -07001775 struct core_thread *ct;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001776 unsigned int i;
1777
1778 info->size = 0;
1779 info->thread = NULL;
1780
1781 psinfo = kmalloc(sizeof(*psinfo), GFP_KERNEL);
Alan Cox6899e922012-12-17 16:02:09 -08001782 if (psinfo == NULL) {
1783 info->psinfo.data = NULL; /* So we don't free this wrongly */
Roland McGrath4206d3a2008-01-30 13:31:45 +01001784 return 0;
Alan Cox6899e922012-12-17 16:02:09 -08001785 }
Roland McGrath4206d3a2008-01-30 13:31:45 +01001786
Amerigo Wange2dbe122009-07-01 01:06:26 -04001787 fill_note(&info->psinfo, "CORE", NT_PRPSINFO, sizeof(*psinfo), psinfo);
1788
Roland McGrath4206d3a2008-01-30 13:31:45 +01001789 /*
1790 * Figure out how many notes we're going to need for each thread.
1791 */
1792 info->thread_notes = 0;
1793 for (i = 0; i < view->n; ++i)
1794 if (view->regsets[i].core_note_type != 0)
1795 ++info->thread_notes;
1796
1797 /*
1798 * Sanity check. We rely on regset 0 being in NT_PRSTATUS,
1799 * since it is our one special case.
1800 */
1801 if (unlikely(info->thread_notes == 0) ||
1802 unlikely(view->regsets[0].core_note_type != NT_PRSTATUS)) {
1803 WARN_ON(1);
1804 return 0;
1805 }
1806
1807 /*
1808 * Initialize the ELF file header.
1809 */
1810 fill_elf_header(elf, phdrs,
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001811 view->e_machine, view->e_flags);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001812
1813 /*
1814 * Allocate a structure for each thread.
1815 */
Oleg Nesterov83914442008-07-25 01:47:45 -07001816 for (ct = &dump_task->mm->core_state->dumper; ct; ct = ct->next) {
1817 t = kzalloc(offsetof(struct elf_thread_core_info,
1818 notes[info->thread_notes]),
1819 GFP_KERNEL);
1820 if (unlikely(!t))
1821 return 0;
Oleg Nesterov24d52882008-07-25 01:47:40 -07001822
Oleg Nesterov83914442008-07-25 01:47:45 -07001823 t->task = ct->task;
1824 if (ct->task == dump_task || !info->thread) {
1825 t->next = info->thread;
1826 info->thread = t;
1827 } else {
1828 /*
1829 * Make sure to keep the original task at
1830 * the head of the list.
1831 */
1832 t->next = info->thread->next;
1833 info->thread->next = t;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001834 }
Oleg Nesterov83914442008-07-25 01:47:45 -07001835 }
Roland McGrath4206d3a2008-01-30 13:31:45 +01001836
1837 /*
1838 * Now fill in each thread's information.
1839 */
1840 for (t = info->thread; t != NULL; t = t->next)
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07001841 if (!fill_thread_core_info(t, view, siginfo->si_signo, &info->size))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001842 return 0;
1843
1844 /*
1845 * Fill in the two process-wide notes.
1846 */
1847 fill_psinfo(psinfo, dump_task->group_leader, dump_task->mm);
1848 info->size += notesize(&info->psinfo);
1849
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001850 fill_siginfo_note(&info->signote, &info->csigdata, siginfo);
1851 info->size += notesize(&info->signote);
1852
Roland McGrath4206d3a2008-01-30 13:31:45 +01001853 fill_auxv_note(&info->auxv, current->mm);
1854 info->size += notesize(&info->auxv);
1855
Dan Aloni72023652013-09-30 13:45:02 -07001856 if (fill_files_note(&info->files) == 0)
1857 info->size += notesize(&info->files);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001858
Roland McGrath4206d3a2008-01-30 13:31:45 +01001859 return 1;
1860}
1861
1862static size_t get_note_info_size(struct elf_note_info *info)
1863{
1864 return info->size;
1865}
1866
1867/*
1868 * Write all the notes for each thread. When writing the first thread, the
1869 * process-wide notes are interleaved after the first thread-specific note.
1870 */
1871static int write_note_info(struct elf_note_info *info,
Al Viroecc8c772013-10-05 15:32:35 -04001872 struct coredump_params *cprm)
Roland McGrath4206d3a2008-01-30 13:31:45 +01001873{
Fabian Frederickb219e252014-06-04 16:12:14 -07001874 bool first = true;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001875 struct elf_thread_core_info *t = info->thread;
1876
1877 do {
1878 int i;
1879
Al Viroecc8c772013-10-05 15:32:35 -04001880 if (!writenote(&t->notes[0], cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001881 return 0;
1882
Al Viroecc8c772013-10-05 15:32:35 -04001883 if (first && !writenote(&info->psinfo, cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001884 return 0;
Al Viroecc8c772013-10-05 15:32:35 -04001885 if (first && !writenote(&info->signote, cprm))
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001886 return 0;
Al Viroecc8c772013-10-05 15:32:35 -04001887 if (first && !writenote(&info->auxv, cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001888 return 0;
Dan Aloni72023652013-09-30 13:45:02 -07001889 if (first && info->files.data &&
Al Viroecc8c772013-10-05 15:32:35 -04001890 !writenote(&info->files, cprm))
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001891 return 0;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001892
1893 for (i = 1; i < info->thread_notes; ++i)
1894 if (t->notes[i].data &&
Al Viroecc8c772013-10-05 15:32:35 -04001895 !writenote(&t->notes[i], cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001896 return 0;
1897
Fabian Frederickb219e252014-06-04 16:12:14 -07001898 first = false;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001899 t = t->next;
1900 } while (t);
1901
1902 return 1;
1903}
1904
1905static void free_note_info(struct elf_note_info *info)
1906{
1907 struct elf_thread_core_info *threads = info->thread;
1908 while (threads) {
1909 unsigned int i;
1910 struct elf_thread_core_info *t = threads;
1911 threads = t->next;
1912 WARN_ON(t->notes[0].data && t->notes[0].data != &t->prstatus);
1913 for (i = 1; i < info->thread_notes; ++i)
1914 kfree(t->notes[i].data);
1915 kfree(t);
1916 }
1917 kfree(info->psinfo.data);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001918 kvfree(info->files.data);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001919}
1920
1921#else
1922
Linus Torvalds1da177e2005-04-16 15:20:36 -07001923/* Here is the structure in which status of each thread is captured. */
1924struct elf_thread_status
1925{
1926 struct list_head list;
1927 struct elf_prstatus prstatus; /* NT_PRSTATUS */
1928 elf_fpregset_t fpu; /* NT_PRFPREG */
1929 struct task_struct *thread;
1930#ifdef ELF_CORE_COPY_XFPREGS
Mark Nelson5b20cd82007-10-16 23:25:39 -07001931 elf_fpxregset_t xfpu; /* ELF_CORE_XFPREG_TYPE */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001932#endif
1933 struct memelfnote notes[3];
1934 int num_notes;
1935};
1936
1937/*
1938 * In order to add the specific thread information for the elf file format,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001939 * we need to keep a linked list of every threads pr_status and then create
1940 * a single section for them in the final core file.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001941 */
1942static int elf_dump_thread_status(long signr, struct elf_thread_status *t)
1943{
1944 int sz = 0;
1945 struct task_struct *p = t->thread;
1946 t->num_notes = 0;
1947
1948 fill_prstatus(&t->prstatus, p, signr);
1949 elf_core_copy_task_regs(p, &t->prstatus.pr_reg);
1950
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001951 fill_note(&t->notes[0], "CORE", NT_PRSTATUS, sizeof(t->prstatus),
1952 &(t->prstatus));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001953 t->num_notes++;
1954 sz += notesize(&t->notes[0]);
1955
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001956 if ((t->prstatus.pr_fpvalid = elf_core_copy_task_fpregs(p, NULL,
1957 &t->fpu))) {
1958 fill_note(&t->notes[1], "CORE", NT_PRFPREG, sizeof(t->fpu),
1959 &(t->fpu));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001960 t->num_notes++;
1961 sz += notesize(&t->notes[1]);
1962 }
1963
1964#ifdef ELF_CORE_COPY_XFPREGS
1965 if (elf_core_copy_task_xfpregs(p, &t->xfpu)) {
Mark Nelson5b20cd82007-10-16 23:25:39 -07001966 fill_note(&t->notes[2], "LINUX", ELF_CORE_XFPREG_TYPE,
1967 sizeof(t->xfpu), &t->xfpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001968 t->num_notes++;
1969 sz += notesize(&t->notes[2]);
1970 }
1971#endif
1972 return sz;
1973}
1974
Roland McGrath3aba4812008-01-30 13:31:44 +01001975struct elf_note_info {
1976 struct memelfnote *notes;
Dan Aloni72023652013-09-30 13:45:02 -07001977 struct memelfnote *notes_files;
Roland McGrath3aba4812008-01-30 13:31:44 +01001978 struct elf_prstatus *prstatus; /* NT_PRSTATUS */
1979 struct elf_prpsinfo *psinfo; /* NT_PRPSINFO */
1980 struct list_head thread_list;
1981 elf_fpregset_t *fpu;
1982#ifdef ELF_CORE_COPY_XFPREGS
1983 elf_fpxregset_t *xfpu;
1984#endif
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001985 user_siginfo_t csigdata;
Roland McGrath3aba4812008-01-30 13:31:44 +01001986 int thread_status_size;
1987 int numnote;
1988};
1989
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001990static int elf_note_info_init(struct elf_note_info *info)
Roland McGrath3aba4812008-01-30 13:31:44 +01001991{
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001992 memset(info, 0, sizeof(*info));
Roland McGrath3aba4812008-01-30 13:31:44 +01001993 INIT_LIST_HEAD(&info->thread_list);
1994
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001995 /* Allocate space for ELF notes */
Kees Cook6da2ec52018-06-12 13:55:00 -07001996 info->notes = kmalloc_array(8, sizeof(struct memelfnote), GFP_KERNEL);
Roland McGrath3aba4812008-01-30 13:31:44 +01001997 if (!info->notes)
1998 return 0;
1999 info->psinfo = kmalloc(sizeof(*info->psinfo), GFP_KERNEL);
2000 if (!info->psinfo)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002001 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002002 info->prstatus = kmalloc(sizeof(*info->prstatus), GFP_KERNEL);
2003 if (!info->prstatus)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002004 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002005 info->fpu = kmalloc(sizeof(*info->fpu), GFP_KERNEL);
2006 if (!info->fpu)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002007 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002008#ifdef ELF_CORE_COPY_XFPREGS
2009 info->xfpu = kmalloc(sizeof(*info->xfpu), GFP_KERNEL);
2010 if (!info->xfpu)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002011 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002012#endif
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002013 return 1;
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002014}
Roland McGrath3aba4812008-01-30 13:31:44 +01002015
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002016static int fill_note_info(struct elfhdr *elf, int phdrs,
2017 struct elf_note_info *info,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02002018 const kernel_siginfo_t *siginfo, struct pt_regs *regs)
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002019{
Al Viroafabada2013-10-14 07:39:56 -04002020 struct core_thread *ct;
2021 struct elf_thread_status *ets;
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002022
2023 if (!elf_note_info_init(info))
2024 return 0;
2025
Al Viroafabada2013-10-14 07:39:56 -04002026 for (ct = current->mm->core_state->dumper.next;
2027 ct; ct = ct->next) {
2028 ets = kzalloc(sizeof(*ets), GFP_KERNEL);
2029 if (!ets)
2030 return 0;
Oleg Nesterov24d52882008-07-25 01:47:40 -07002031
Al Viroafabada2013-10-14 07:39:56 -04002032 ets->thread = ct->task;
2033 list_add(&ets->list, &info->thread_list);
2034 }
Oleg Nesterov83914442008-07-25 01:47:45 -07002035
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002036 list_for_each_entry(ets, &info->thread_list, list) {
Al Viroafabada2013-10-14 07:39:56 -04002037 int sz;
Oleg Nesterov83914442008-07-25 01:47:45 -07002038
Al Viroafabada2013-10-14 07:39:56 -04002039 sz = elf_dump_thread_status(siginfo->si_signo, ets);
2040 info->thread_status_size += sz;
Roland McGrath3aba4812008-01-30 13:31:44 +01002041 }
2042 /* now collect the dump for the current */
2043 memset(info->prstatus, 0, sizeof(*info->prstatus));
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07002044 fill_prstatus(info->prstatus, current, siginfo->si_signo);
Roland McGrath3aba4812008-01-30 13:31:44 +01002045 elf_core_copy_regs(&info->prstatus->pr_reg, regs);
2046
2047 /* Set up header */
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08002048 fill_elf_header(elf, phdrs, ELF_ARCH, ELF_CORE_EFLAGS);
Roland McGrath3aba4812008-01-30 13:31:44 +01002049
2050 /*
2051 * Set up the notes in similar form to SVR4 core dumps made
2052 * with info from their /proc.
2053 */
2054
2055 fill_note(info->notes + 0, "CORE", NT_PRSTATUS,
2056 sizeof(*info->prstatus), info->prstatus);
2057 fill_psinfo(info->psinfo, current->group_leader, current->mm);
2058 fill_note(info->notes + 1, "CORE", NT_PRPSINFO,
2059 sizeof(*info->psinfo), info->psinfo);
2060
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07002061 fill_siginfo_note(info->notes + 2, &info->csigdata, siginfo);
2062 fill_auxv_note(info->notes + 3, current->mm);
Dan Aloni72023652013-09-30 13:45:02 -07002063 info->numnote = 4;
Roland McGrath3aba4812008-01-30 13:31:44 +01002064
Dan Aloni72023652013-09-30 13:45:02 -07002065 if (fill_files_note(info->notes + info->numnote) == 0) {
2066 info->notes_files = info->notes + info->numnote;
2067 info->numnote++;
2068 }
Roland McGrath3aba4812008-01-30 13:31:44 +01002069
2070 /* Try to dump the FPU. */
2071 info->prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, regs,
2072 info->fpu);
2073 if (info->prstatus->pr_fpvalid)
2074 fill_note(info->notes + info->numnote++,
2075 "CORE", NT_PRFPREG, sizeof(*info->fpu), info->fpu);
2076#ifdef ELF_CORE_COPY_XFPREGS
2077 if (elf_core_copy_task_xfpregs(current, info->xfpu))
2078 fill_note(info->notes + info->numnote++,
2079 "LINUX", ELF_CORE_XFPREG_TYPE,
2080 sizeof(*info->xfpu), info->xfpu);
2081#endif
2082
2083 return 1;
Roland McGrath3aba4812008-01-30 13:31:44 +01002084}
2085
2086static size_t get_note_info_size(struct elf_note_info *info)
2087{
2088 int sz = 0;
2089 int i;
2090
2091 for (i = 0; i < info->numnote; i++)
2092 sz += notesize(info->notes + i);
2093
2094 sz += info->thread_status_size;
2095
2096 return sz;
2097}
2098
2099static int write_note_info(struct elf_note_info *info,
Al Viroecc8c772013-10-05 15:32:35 -04002100 struct coredump_params *cprm)
Roland McGrath3aba4812008-01-30 13:31:44 +01002101{
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002102 struct elf_thread_status *ets;
Roland McGrath3aba4812008-01-30 13:31:44 +01002103 int i;
Roland McGrath3aba4812008-01-30 13:31:44 +01002104
2105 for (i = 0; i < info->numnote; i++)
Al Viroecc8c772013-10-05 15:32:35 -04002106 if (!writenote(info->notes + i, cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002107 return 0;
2108
2109 /* write out the thread status notes section */
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002110 list_for_each_entry(ets, &info->thread_list, list) {
2111 for (i = 0; i < ets->num_notes; i++)
2112 if (!writenote(&ets->notes[i], cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002113 return 0;
2114 }
2115
2116 return 1;
2117}
2118
2119static void free_note_info(struct elf_note_info *info)
2120{
2121 while (!list_empty(&info->thread_list)) {
2122 struct list_head *tmp = info->thread_list.next;
2123 list_del(tmp);
2124 kfree(list_entry(tmp, struct elf_thread_status, list));
2125 }
2126
Dan Aloni72023652013-09-30 13:45:02 -07002127 /* Free data possibly allocated by fill_files_note(): */
2128 if (info->notes_files)
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002129 kvfree(info->notes_files->data);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07002130
Roland McGrath3aba4812008-01-30 13:31:44 +01002131 kfree(info->prstatus);
2132 kfree(info->psinfo);
2133 kfree(info->notes);
2134 kfree(info->fpu);
2135#ifdef ELF_CORE_COPY_XFPREGS
2136 kfree(info->xfpu);
2137#endif
2138}
2139
Roland McGrath4206d3a2008-01-30 13:31:45 +01002140#endif
2141
Roland McGrathf47aef52007-01-26 00:56:49 -08002142static struct vm_area_struct *first_vma(struct task_struct *tsk,
2143 struct vm_area_struct *gate_vma)
2144{
2145 struct vm_area_struct *ret = tsk->mm->mmap;
2146
2147 if (ret)
2148 return ret;
2149 return gate_vma;
2150}
2151/*
2152 * Helper function for iterating across a vma list. It ensures that the caller
2153 * will visit `gate_vma' prior to terminating the search.
2154 */
2155static struct vm_area_struct *next_vma(struct vm_area_struct *this_vma,
2156 struct vm_area_struct *gate_vma)
2157{
2158 struct vm_area_struct *ret;
2159
2160 ret = this_vma->vm_next;
2161 if (ret)
2162 return ret;
2163 if (this_vma == gate_vma)
2164 return NULL;
2165 return gate_vma;
2166}
2167
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002168static void fill_extnum_info(struct elfhdr *elf, struct elf_shdr *shdr4extnum,
2169 elf_addr_t e_shoff, int segs)
2170{
2171 elf->e_shoff = e_shoff;
2172 elf->e_shentsize = sizeof(*shdr4extnum);
2173 elf->e_shnum = 1;
2174 elf->e_shstrndx = SHN_UNDEF;
2175
2176 memset(shdr4extnum, 0, sizeof(*shdr4extnum));
2177
2178 shdr4extnum->sh_type = SHT_NULL;
2179 shdr4extnum->sh_size = elf->e_shnum;
2180 shdr4extnum->sh_link = elf->e_shstrndx;
2181 shdr4extnum->sh_info = segs;
2182}
2183
Linus Torvalds1da177e2005-04-16 15:20:36 -07002184/*
2185 * Actual dumper
2186 *
2187 * This is a two-pass process; first we find the offsets of the bits,
2188 * and then they are actually written out. If we run out of core limit
2189 * we just truncate.
2190 */
Masami Hiramatsuf6151df2009-12-17 15:27:16 -08002191static int elf_core_dump(struct coredump_params *cprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002192{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002193 int has_dumped = 0;
2194 mm_segment_t fs;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002195 int segs, i;
2196 size_t vma_data_size = 0;
Roland McGrathf47aef52007-01-26 00:56:49 -08002197 struct vm_area_struct *vma, *gate_vma;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002198 struct elfhdr *elf = NULL;
Al Virocdc3d562013-10-05 22:24:29 -04002199 loff_t offset = 0, dataoff;
Dan Aloni72023652013-09-30 13:45:02 -07002200 struct elf_note_info info = { };
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002201 struct elf_phdr *phdr4note = NULL;
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002202 struct elf_shdr *shdr4extnum = NULL;
2203 Elf_Half e_phnum;
2204 elf_addr_t e_shoff;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002205 elf_addr_t *vma_filesz = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002206
2207 /*
2208 * We no longer stop all VM operations.
2209 *
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002210 * This is because those proceses that could possibly change map_count
2211 * or the mmap / vma pages are now blocked in do_exit on current
2212 * finishing this core dump.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002213 *
2214 * Only ptrace can touch these memory addresses, but it doesn't change
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002215 * the map_count or the pages allocated. So no possibility of crashing
Linus Torvalds1da177e2005-04-16 15:20:36 -07002216 * exists while dumping the mm->vm_next areas to the core file.
2217 */
2218
2219 /* alloc memory for large data structures: too large to be on stack */
2220 elf = kmalloc(sizeof(*elf), GFP_KERNEL);
2221 if (!elf)
WANG Cong5f719552008-05-06 12:45:35 +08002222 goto out;
KAMEZAWA Hiroyuki341c87b2009-06-30 11:41:23 -07002223 /*
2224 * The number of segs are recored into ELF header as 16bit value.
2225 * Please check DEFAULT_MAX_MAP_COUNT definition when you modify here.
2226 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002227 segs = current->mm->map_count;
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002228 segs += elf_core_extra_phdrs();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002229
Stephen Wilson31db58b2011-03-13 15:49:15 -04002230 gate_vma = get_gate_vma(current->mm);
Roland McGrathf47aef52007-01-26 00:56:49 -08002231 if (gate_vma != NULL)
2232 segs++;
2233
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002234 /* for notes section */
2235 segs++;
2236
2237 /* If segs > PN_XNUM(0xffff), then e_phnum overflows. To avoid
2238 * this, kernel supports extended numbering. Have a look at
2239 * include/linux/elf.h for further information. */
2240 e_phnum = segs > PN_XNUM ? PN_XNUM : segs;
2241
Roland McGrath3aba4812008-01-30 13:31:44 +01002242 /*
2243 * Collect all the non-memory information about the process for the
2244 * notes. This also sets up the file header.
2245 */
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07002246 if (!fill_note_info(elf, e_phnum, &info, cprm->siginfo, cprm->regs))
Roland McGrath3aba4812008-01-30 13:31:44 +01002247 goto cleanup;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002248
2249 has_dumped = 1;
Oleg Nesterov079148b2013-04-30 15:28:16 -07002250
Linus Torvalds1da177e2005-04-16 15:20:36 -07002251 fs = get_fs();
2252 set_fs(KERNEL_DS);
2253
Linus Torvalds1da177e2005-04-16 15:20:36 -07002254 offset += sizeof(*elf); /* Elf header */
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002255 offset += segs * sizeof(struct elf_phdr); /* Program headers */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002256
2257 /* Write notes phdr entry */
2258 {
Roland McGrath3aba4812008-01-30 13:31:44 +01002259 size_t sz = get_note_info_size(&info);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002260
Michael Ellermane5501492007-09-19 14:38:12 +10002261 sz += elf_coredump_extra_notes_size();
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +01002262
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002263 phdr4note = kmalloc(sizeof(*phdr4note), GFP_KERNEL);
2264 if (!phdr4note)
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -08002265 goto end_coredump;
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002266
2267 fill_elf_note_phdr(phdr4note, sz, offset);
2268 offset += sz;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002269 }
2270
Linus Torvalds1da177e2005-04-16 15:20:36 -07002271 dataoff = offset = roundup(offset, ELF_EXEC_PAGESIZE);
2272
Jason Baron30f74aa2016-12-12 16:46:40 -08002273 if (segs - 1 > ULONG_MAX / sizeof(*vma_filesz))
2274 goto end_coredump;
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002275 vma_filesz = kvmalloc(array_size(sizeof(*vma_filesz), (segs - 1)),
2276 GFP_KERNEL);
2277 if (ZERO_OR_NULL_PTR(vma_filesz))
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002278 goto end_coredump;
2279
2280 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
2281 vma = next_vma(vma, gate_vma)) {
2282 unsigned long dump_size;
2283
2284 dump_size = vma_dump_size(vma, cprm->mm_flags);
2285 vma_filesz[i++] = dump_size;
2286 vma_data_size += dump_size;
2287 }
2288
2289 offset += vma_data_size;
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002290 offset += elf_core_extra_data_size();
2291 e_shoff = offset;
2292
2293 if (e_phnum == PN_XNUM) {
2294 shdr4extnum = kmalloc(sizeof(*shdr4extnum), GFP_KERNEL);
2295 if (!shdr4extnum)
2296 goto end_coredump;
2297 fill_extnum_info(elf, shdr4extnum, e_shoff, segs);
2298 }
2299
2300 offset = dataoff;
2301
Al Viroecc8c772013-10-05 15:32:35 -04002302 if (!dump_emit(cprm, elf, sizeof(*elf)))
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002303 goto end_coredump;
2304
Al Viroecc8c772013-10-05 15:32:35 -04002305 if (!dump_emit(cprm, phdr4note, sizeof(*phdr4note)))
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002306 goto end_coredump;
2307
Linus Torvalds1da177e2005-04-16 15:20:36 -07002308 /* Write program headers for segments dump */
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002309 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
Roland McGrathf47aef52007-01-26 00:56:49 -08002310 vma = next_vma(vma, gate_vma)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002311 struct elf_phdr phdr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002312
2313 phdr.p_type = PT_LOAD;
2314 phdr.p_offset = offset;
2315 phdr.p_vaddr = vma->vm_start;
2316 phdr.p_paddr = 0;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002317 phdr.p_filesz = vma_filesz[i++];
Roland McGrath82df3972007-10-16 23:27:02 -07002318 phdr.p_memsz = vma->vm_end - vma->vm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002319 offset += phdr.p_filesz;
2320 phdr.p_flags = vma->vm_flags & VM_READ ? PF_R : 0;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002321 if (vma->vm_flags & VM_WRITE)
2322 phdr.p_flags |= PF_W;
2323 if (vma->vm_flags & VM_EXEC)
2324 phdr.p_flags |= PF_X;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002325 phdr.p_align = ELF_EXEC_PAGESIZE;
2326
Al Viroecc8c772013-10-05 15:32:35 -04002327 if (!dump_emit(cprm, &phdr, sizeof(phdr)))
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -08002328 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002329 }
2330
Al Viro506f21c2013-10-05 17:22:57 -04002331 if (!elf_core_write_extra_phdrs(cprm, offset))
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002332 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002333
2334 /* write out the notes section */
Al Viroecc8c772013-10-05 15:32:35 -04002335 if (!write_note_info(&info, cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002336 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002337
Al Virocdc3d562013-10-05 22:24:29 -04002338 if (elf_coredump_extra_notes_write(cprm))
Michael Ellermane5501492007-09-19 14:38:12 +10002339 goto end_coredump;
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +01002340
Andi Kleend025c9d2006-09-30 23:29:28 -07002341 /* Align to page */
Mateusz Guzik1607f092016-06-05 23:14:14 +02002342 if (!dump_skip(cprm, dataoff - cprm->pos))
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002343 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002344
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002345 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
Roland McGrathf47aef52007-01-26 00:56:49 -08002346 vma = next_vma(vma, gate_vma)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002347 unsigned long addr;
Roland McGrath82df3972007-10-16 23:27:02 -07002348 unsigned long end;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002349
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002350 end = vma->vm_start + vma_filesz[i++];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002351
Roland McGrath82df3972007-10-16 23:27:02 -07002352 for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002353 struct page *page;
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002354 int stop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002355
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002356 page = get_dump_page(addr);
2357 if (page) {
2358 void *kaddr = kmap(page);
Al Viro13046ec2013-10-05 18:08:47 -04002359 stop = !dump_emit(cprm, kaddr, PAGE_SIZE);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002360 kunmap(page);
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03002361 put_page(page);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002362 } else
Al Viro9b56d542013-10-08 09:26:08 -04002363 stop = !dump_skip(cprm, PAGE_SIZE);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002364 if (stop)
2365 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002366 }
2367 }
Dave Kleikamp4d22c752017-01-11 13:25:00 -06002368 dump_truncate(cprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002369
Al Viroaa3e7ea2013-10-05 17:50:15 -04002370 if (!elf_core_write_extra_data(cprm))
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002371 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002372
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002373 if (e_phnum == PN_XNUM) {
Al Viro13046ec2013-10-05 18:08:47 -04002374 if (!dump_emit(cprm, shdr4extnum, sizeof(*shdr4extnum)))
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002375 goto end_coredump;
2376 }
2377
Linus Torvalds1da177e2005-04-16 15:20:36 -07002378end_coredump:
2379 set_fs(fs);
2380
2381cleanup:
Roland McGrath3aba4812008-01-30 13:31:44 +01002382 free_note_info(&info);
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002383 kfree(shdr4extnum);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002384 kvfree(vma_filesz);
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002385 kfree(phdr4note);
WANG Cong5f719552008-05-06 12:45:35 +08002386 kfree(elf);
2387out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002388 return has_dumped;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002389}
2390
Christoph Hellwig698ba7b2009-12-15 16:47:37 -08002391#endif /* CONFIG_ELF_CORE */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002392
2393static int __init init_elf_binfmt(void)
2394{
Al Viro8fc3dc52012-03-17 03:05:16 -04002395 register_binfmt(&elf_format);
2396 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002397}
2398
2399static void __exit exit_elf_binfmt(void)
2400{
2401 /* Remove the COFF and ELF loaders. */
2402 unregister_binfmt(&elf_format);
2403}
2404
2405core_initcall(init_elf_binfmt);
2406module_exit(exit_elf_binfmt);
2407MODULE_LICENSE("GPL");