blob: d4e11b2e04f68aa34869594a4c7d07d2a1c5b83c [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
Andi Kleen913bd902006-03-25 16:29:09 +0100673#ifndef STACK_RND_MASK
James Bottomleyd1cabd632007-03-16 13:38:35 -0800674#define STACK_RND_MASK (0x7ff >> (PAGE_SHIFT - 12)) /* 8MB of VA */
Andi Kleen913bd902006-03-25 16:29:09 +0100675#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676
677static unsigned long randomize_stack_top(unsigned long stack_top)
678{
Hector Marco-Gisbert4e7c22d2015-02-14 09:33:50 -0800679 unsigned long random_variable = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700680
Oleg Nesterov01578e32017-08-15 17:40:11 +0200681 if (current->flags & PF_RANDOMIZE) {
Daniel Cashman5ef11c32016-02-26 15:19:37 -0800682 random_variable = get_random_long();
Hector Marco-Gisbert4e7c22d2015-02-14 09:33:50 -0800683 random_variable &= STACK_RND_MASK;
Andi Kleen913bd902006-03-25 16:29:09 +0100684 random_variable <<= PAGE_SHIFT;
685 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700686#ifdef CONFIG_STACK_GROWSUP
Andi Kleen913bd902006-03-25 16:29:09 +0100687 return PAGE_ALIGN(stack_top) + random_variable;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700688#else
Andi Kleen913bd902006-03-25 16:29:09 +0100689 return PAGE_ALIGN(stack_top) - random_variable;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700690#endif
691}
692
Al Viro71613c32012-10-20 22:00:48 -0400693static int load_elf_binary(struct linux_binprm *bprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700694{
695 struct file *interpreter = NULL; /* to shut gcc up */
696 unsigned long load_addr = 0, load_bias = 0;
697 int load_addr_set = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700698 unsigned long error;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100699 struct elf_phdr *elf_ppnt, *elf_phdata, *interp_elf_phdata = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700700 unsigned long elf_bss, elf_brk;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800701 int bss_prot = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700702 int retval, i;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100703 unsigned long elf_entry;
704 unsigned long interp_load_addr = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700705 unsigned long start_code, end_code, start_data, end_data;
David Daney1a530a62011-03-22 16:34:48 -0700706 unsigned long reloc_func_desc __maybe_unused = 0;
David Rientjes8de61e62006-12-06 20:40:16 -0800707 int executable_stack = EXSTACK_DEFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700708 struct {
709 struct elfhdr elf_ex;
710 struct elfhdr interp_elf_ex;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700711 } *loc;
Paul Burton774c1052014-09-11 08:30:16 +0100712 struct arch_elf_state arch_state = INIT_ARCH_ELF_STATE;
Alexey Dobriyan249b08e2019-05-14 15:43:54 -0700713 struct pt_regs *regs;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700714
715 loc = kmalloc(sizeof(*loc), GFP_KERNEL);
716 if (!loc) {
717 retval = -ENOMEM;
718 goto out_ret;
719 }
720
721 /* Get the exec-header */
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700722 loc->elf_ex = *((struct elfhdr *)bprm->buf);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700723
724 retval = -ENOEXEC;
725 /* First of all, some simple consistency checks */
726 if (memcmp(loc->elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
727 goto out;
728
729 if (loc->elf_ex.e_type != ET_EXEC && loc->elf_ex.e_type != ET_DYN)
730 goto out;
731 if (!elf_check_arch(&loc->elf_ex))
732 goto out;
Nicolas Pitre47552002017-08-16 16:05:13 -0400733 if (elf_check_fdpic(&loc->elf_ex))
734 goto out;
Al Viro72c2d532013-09-22 16:27:52 -0400735 if (!bprm->file->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700736 goto out;
737
Paul Burton6a8d3892014-09-11 08:30:14 +0100738 elf_phdata = load_elf_phdrs(&loc->elf_ex, bprm->file);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700739 if (!elf_phdata)
740 goto out;
741
Linus Torvalds1da177e2005-04-16 15:20:36 -0700742 elf_ppnt = elf_phdata;
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700743 for (i = 0; i < loc->elf_ex.e_phnum; i++, elf_ppnt++) {
744 char *elf_interpreter;
745 loff_t pos;
Alexey Dobriyan5cf4a362019-05-14 15:43:36 -0700746
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700747 if (elf_ppnt->p_type != PT_INTERP)
748 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700749
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700750 /*
751 * This is the program interpreter used for shared libraries -
752 * for now assume that this is an a.out format binary.
753 */
754 retval = -ENOEXEC;
755 if (elf_ppnt->p_filesz > PATH_MAX || elf_ppnt->p_filesz < 2)
756 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700757
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700758 retval = -ENOMEM;
759 elf_interpreter = kmalloc(elf_ppnt->p_filesz, GFP_KERNEL);
760 if (!elf_interpreter)
761 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700762
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700763 pos = elf_ppnt->p_offset;
764 retval = kernel_read(bprm->file, elf_interpreter,
765 elf_ppnt->p_filesz, &pos);
766 if (retval != elf_ppnt->p_filesz) {
767 if (retval >= 0)
768 retval = -EIO;
769 goto out_free_interp;
770 }
771 /* make sure path is NULL terminated */
772 retval = -ENOEXEC;
773 if (elf_interpreter[elf_ppnt->p_filesz - 1] != '\0')
774 goto out_free_interp;
Alexey Dobriyan1fb84492007-01-26 00:57:16 -0800775
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700776 interpreter = open_exec(elf_interpreter);
777 kfree(elf_interpreter);
778 retval = PTR_ERR(interpreter);
779 if (IS_ERR(interpreter))
780 goto out_free_ph;
Alexey Dobriyan1fb84492007-01-26 00:57:16 -0800781
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700782 /*
783 * If the binary is not readable then enforce mm->dumpable = 0
784 * regardless of the interpreter's permissions.
785 */
786 would_dump(bprm, interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700787
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700788 /* Get the exec headers */
789 pos = 0;
790 retval = kernel_read(interpreter, &loc->interp_elf_ex,
791 sizeof(loc->interp_elf_ex), &pos);
792 if (retval != sizeof(loc->interp_elf_ex)) {
793 if (retval >= 0)
794 retval = -EIO;
795 goto out_free_dentry;
796 }
797
798 break;
Alexey Dobriyancc338012019-05-14 15:43:39 -0700799
800out_free_interp:
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700801 kfree(elf_interpreter);
802 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700803 }
804
805 elf_ppnt = elf_phdata;
806 for (i = 0; i < loc->elf_ex.e_phnum; i++, elf_ppnt++)
Paul Burton774c1052014-09-11 08:30:16 +0100807 switch (elf_ppnt->p_type) {
808 case PT_GNU_STACK:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700809 if (elf_ppnt->p_flags & PF_X)
810 executable_stack = EXSTACK_ENABLE_X;
811 else
812 executable_stack = EXSTACK_DISABLE_X;
813 break;
Paul Burton774c1052014-09-11 08:30:16 +0100814
815 case PT_LOPROC ... PT_HIPROC:
816 retval = arch_elf_pt_proc(&loc->elf_ex, elf_ppnt,
817 bprm->file, false,
818 &arch_state);
819 if (retval)
820 goto out_free_dentry;
821 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700822 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700823
824 /* Some simple consistency checks for the interpreter */
Alexey Dobriyancc338012019-05-14 15:43:39 -0700825 if (interpreter) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700826 retval = -ELIBBAD;
Andi Kleend20894a2008-02-08 04:21:54 -0800827 /* Not an ELF interpreter */
828 if (memcmp(loc->interp_elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700829 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700830 /* Verify the interpreter has a valid arch */
Nicolas Pitre47552002017-08-16 16:05:13 -0400831 if (!elf_check_arch(&loc->interp_elf_ex) ||
832 elf_check_fdpic(&loc->interp_elf_ex))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700833 goto out_free_dentry;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100834
835 /* Load the interpreter program headers */
836 interp_elf_phdata = load_elf_phdrs(&loc->interp_elf_ex,
837 interpreter);
838 if (!interp_elf_phdata)
839 goto out_free_dentry;
Paul Burton774c1052014-09-11 08:30:16 +0100840
841 /* Pass PT_LOPROC..PT_HIPROC headers to arch code */
842 elf_ppnt = interp_elf_phdata;
843 for (i = 0; i < loc->interp_elf_ex.e_phnum; i++, elf_ppnt++)
844 switch (elf_ppnt->p_type) {
845 case PT_LOPROC ... PT_HIPROC:
846 retval = arch_elf_pt_proc(&loc->interp_elf_ex,
847 elf_ppnt, interpreter,
848 true, &arch_state);
849 if (retval)
850 goto out_free_dentry;
851 break;
852 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700853 }
854
Paul Burton774c1052014-09-11 08:30:16 +0100855 /*
856 * Allow arch code to reject the ELF at this point, whilst it's
857 * still possible to return an error to the code that invoked
858 * the exec syscall.
859 */
Maciej W. Rozyckieb4bc072015-11-13 00:47:48 +0000860 retval = arch_check_elf(&loc->elf_ex,
861 !!interpreter, &loc->interp_elf_ex,
862 &arch_state);
Paul Burton774c1052014-09-11 08:30:16 +0100863 if (retval)
864 goto out_free_dentry;
865
Linus Torvalds1da177e2005-04-16 15:20:36 -0700866 /* Flush all traces of the currently running executable */
867 retval = flush_old_exec(bprm);
868 if (retval)
869 goto out_free_dentry;
870
Linus Torvalds1da177e2005-04-16 15:20:36 -0700871 /* Do this immediately, since STACK_TOP as used in setup_arg_pages
872 may depend on the personality. */
Paul Burton774c1052014-09-11 08:30:16 +0100873 SET_PERSONALITY2(loc->elf_ex, &arch_state);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700874 if (elf_read_implies_exec(loc->elf_ex, executable_stack))
875 current->personality |= READ_IMPLIES_EXEC;
876
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700877 if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700878 current->flags |= PF_RANDOMIZE;
Linus Torvalds221af7f2010-01-28 22:14:42 -0800879
880 setup_new_exec(bprm);
Linus Torvalds9f834ec2016-08-22 16:41:46 -0700881 install_exec_creds(bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700882
883 /* Do this so that we can load the interpreter, if need be. We will
884 change some of these later */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700885 retval = setup_arg_pages(bprm, randomize_stack_top(STACK_TOP),
886 executable_stack);
Al Viro19d860a2014-05-04 20:11:36 -0400887 if (retval < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700888 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700889
Alexey Dobriyan852643162019-05-14 15:43:48 -0700890 elf_bss = 0;
891 elf_brk = 0;
892
893 start_code = ~0UL;
894 end_code = 0;
895 start_data = 0;
896 end_data = 0;
897
André Goddard Rosaaf901ca2009-11-14 13:09:05 -0200898 /* Now we do a little grungy work by mmapping the ELF image into
Jiri Kosinacc503c12008-01-30 13:31:07 +0100899 the correct location in memory. */
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700900 for(i = 0, elf_ppnt = elf_phdata;
901 i < loc->elf_ex.e_phnum; i++, elf_ppnt++) {
Alexey Dobriyand8e7cb32019-05-14 15:43:51 -0700902 int elf_prot, elf_flags, elf_fixed = MAP_FIXED_NOREPLACE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700903 unsigned long k, vaddr;
Michael Davidsona87938b2015-04-14 15:47:38 -0700904 unsigned long total_size = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700905
906 if (elf_ppnt->p_type != PT_LOAD)
907 continue;
908
909 if (unlikely (elf_brk > elf_bss)) {
910 unsigned long nbyte;
911
912 /* There was a PT_LOAD segment with p_memsz > p_filesz
913 before this one. Map anonymous pages, if needed,
914 and clear the area. */
Mikael Petterssonf670d0e2011-01-12 17:00:02 -0800915 retval = set_brk(elf_bss + load_bias,
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800916 elf_brk + load_bias,
917 bss_prot);
Al Viro19d860a2014-05-04 20:11:36 -0400918 if (retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700919 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700920 nbyte = ELF_PAGEOFFSET(elf_bss);
921 if (nbyte) {
922 nbyte = ELF_MIN_ALIGN - nbyte;
923 if (nbyte > elf_brk - elf_bss)
924 nbyte = elf_brk - elf_bss;
925 if (clear_user((void __user *)elf_bss +
926 load_bias, nbyte)) {
927 /*
928 * This bss-zeroing can fail if the ELF
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700929 * file specifies odd protections. So
Linus Torvalds1da177e2005-04-16 15:20:36 -0700930 * we don't check the return value
931 */
932 }
933 }
Michal Hockoad55eac2018-04-10 16:36:05 -0700934
935 /*
936 * Some binaries have overlapping elf segments and then
937 * we have to forcefully map over an existing mapping
938 * e.g. over this newly established brk mapping.
939 */
940 elf_fixed = MAP_FIXED;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700941 }
942
Alexey Dobriyand8e7cb32019-05-14 15:43:51 -0700943 elf_prot = make_prot(elf_ppnt->p_flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700944
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700945 elf_flags = MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700946
947 vaddr = elf_ppnt->p_vaddr;
Kees Cookeab09532017-07-10 15:52:37 -0700948 /*
949 * If we are loading ET_EXEC or we have already performed
950 * the ET_DYN load_addr calculations, proceed normally.
951 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700952 if (loc->elf_ex.e_type == ET_EXEC || load_addr_set) {
Michal Hockoad55eac2018-04-10 16:36:05 -0700953 elf_flags |= elf_fixed;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700954 } else if (loc->elf_ex.e_type == ET_DYN) {
Kees Cookeab09532017-07-10 15:52:37 -0700955 /*
956 * This logic is run once for the first LOAD Program
957 * Header for ET_DYN binaries to calculate the
958 * randomization (load_bias) for all the LOAD
959 * Program Headers, and to calculate the entire
960 * size of the ELF mapping (total_size). (Note that
961 * load_addr_set is set to true later once the
962 * initial mapping is performed.)
963 *
964 * There are effectively two types of ET_DYN
965 * binaries: programs (i.e. PIE: ET_DYN with INTERP)
966 * and loaders (ET_DYN without INTERP, since they
967 * _are_ the ELF interpreter). The loaders must
968 * be loaded away from programs since the program
969 * may otherwise collide with the loader (especially
970 * for ET_EXEC which does not have a randomized
971 * position). For example to handle invocations of
972 * "./ld.so someprog" to test out a new version of
973 * the loader, the subsequent program that the
974 * loader loads must avoid the loader itself, so
975 * they cannot share the same load range. Sufficient
976 * room for the brk must be allocated with the
977 * loader as well, since brk must be available with
978 * the loader.
979 *
980 * Therefore, programs are loaded offset from
981 * ELF_ET_DYN_BASE and loaders are loaded into the
982 * independently randomized mmap region (0 load_bias
983 * without MAP_FIXED).
984 */
Alexey Dobriyancc338012019-05-14 15:43:39 -0700985 if (interpreter) {
Kees Cookeab09532017-07-10 15:52:37 -0700986 load_bias = ELF_ET_DYN_BASE;
987 if (current->flags & PF_RANDOMIZE)
988 load_bias += arch_mmap_rnd();
Michal Hockoad55eac2018-04-10 16:36:05 -0700989 elf_flags |= elf_fixed;
Kees Cookeab09532017-07-10 15:52:37 -0700990 } else
991 load_bias = 0;
992
993 /*
994 * Since load_bias is used for all subsequent loading
995 * calculations, we must lower it by the first vaddr
996 * so that the remaining calculations based on the
997 * ELF vaddrs will be correctly offset. The result
998 * is then page aligned.
999 */
1000 load_bias = ELF_PAGESTART(load_bias - vaddr);
1001
Michael Davidsona87938b2015-04-14 15:47:38 -07001002 total_size = total_mapping_size(elf_phdata,
1003 loc->elf_ex.e_phnum);
1004 if (!total_size) {
Andrew Morton2b1d3ae2015-05-28 15:44:24 -07001005 retval = -EINVAL;
Michael Davidsona87938b2015-04-14 15:47:38 -07001006 goto out_free_dentry;
1007 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001008 }
1009
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001010 error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt,
Michael Davidsona87938b2015-04-14 15:47:38 -07001011 elf_prot, elf_flags, total_size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001012 if (BAD_ADDR(error)) {
Alexey Kuznetsovb140f2512007-05-08 00:31:57 -07001013 retval = IS_ERR((void *)error) ?
1014 PTR_ERR((void*)error) : -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001015 goto out_free_dentry;
1016 }
1017
1018 if (!load_addr_set) {
1019 load_addr_set = 1;
1020 load_addr = (elf_ppnt->p_vaddr - elf_ppnt->p_offset);
1021 if (loc->elf_ex.e_type == ET_DYN) {
1022 load_bias += error -
1023 ELF_PAGESTART(load_bias + vaddr);
1024 load_addr += load_bias;
1025 reloc_func_desc = load_bias;
1026 }
1027 }
1028 k = elf_ppnt->p_vaddr;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001029 if (k < start_code)
1030 start_code = k;
1031 if (start_data < k)
1032 start_data = k;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001033
1034 /*
1035 * Check to see if the section's size will overflow the
1036 * allowed task size. Note that p_filesz must always be
1037 * <= p_memsz so it is only necessary to check p_memsz.
1038 */
Chuck Ebbertce510592006-07-03 00:24:14 -07001039 if (BAD_ADDR(k) || elf_ppnt->p_filesz > elf_ppnt->p_memsz ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07001040 elf_ppnt->p_memsz > TASK_SIZE ||
1041 TASK_SIZE - elf_ppnt->p_memsz < k) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001042 /* set_brk can never work. Avoid overflows. */
Alexey Kuznetsovb140f2512007-05-08 00:31:57 -07001043 retval = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001044 goto out_free_dentry;
1045 }
1046
1047 k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz;
1048
1049 if (k > elf_bss)
1050 elf_bss = k;
1051 if ((elf_ppnt->p_flags & PF_X) && end_code < k)
1052 end_code = k;
1053 if (end_data < k)
1054 end_data = k;
1055 k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz;
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001056 if (k > elf_brk) {
1057 bss_prot = elf_prot;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001058 elf_brk = k;
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001059 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001060 }
1061
1062 loc->elf_ex.e_entry += load_bias;
1063 elf_bss += load_bias;
1064 elf_brk += load_bias;
1065 start_code += load_bias;
1066 end_code += load_bias;
1067 start_data += load_bias;
1068 end_data += load_bias;
1069
1070 /* Calling set_brk effectively mmaps the pages that we need
1071 * for the bss and break sections. We must do this before
1072 * mapping in the interpreter, to make sure it doesn't wind
1073 * up getting placed where the bss needs to go.
1074 */
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001075 retval = set_brk(elf_bss, elf_brk, bss_prot);
Al Viro19d860a2014-05-04 20:11:36 -04001076 if (retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001077 goto out_free_dentry;
akpm@osdl.org6de50512005-10-11 08:29:08 -07001078 if (likely(elf_bss != elf_brk) && unlikely(padzero(elf_bss))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001079 retval = -EFAULT; /* Nobody gets to see this, but.. */
1080 goto out_free_dentry;
1081 }
1082
Alexey Dobriyancc338012019-05-14 15:43:39 -07001083 if (interpreter) {
Alan Cox6eec4822012-10-04 17:13:42 -07001084 unsigned long interp_map_addr = 0;
Jiri Kosinacc503c12008-01-30 13:31:07 +01001085
Andi Kleend20894a2008-02-08 04:21:54 -08001086 elf_entry = load_elf_interp(&loc->interp_elf_ex,
1087 interpreter,
1088 &interp_map_addr,
Paul Burtona9d9ef12014-09-11 08:30:15 +01001089 load_bias, interp_elf_phdata);
Andi Kleend20894a2008-02-08 04:21:54 -08001090 if (!IS_ERR((void *)elf_entry)) {
1091 /*
1092 * load_elf_interp() returns relocation
1093 * adjustment
1094 */
1095 interp_load_addr = elf_entry;
1096 elf_entry += loc->interp_elf_ex.e_entry;
Jiri Kosinacc503c12008-01-30 13:31:07 +01001097 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001098 if (BAD_ADDR(elf_entry)) {
Chuck Ebbertce510592006-07-03 00:24:14 -07001099 retval = IS_ERR((void *)elf_entry) ?
1100 (int)elf_entry : -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001101 goto out_free_dentry;
1102 }
1103 reloc_func_desc = interp_load_addr;
1104
1105 allow_write_access(interpreter);
1106 fput(interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001107 } else {
1108 elf_entry = loc->elf_ex.e_entry;
Suresh Siddha5342fba2006-02-26 04:18:28 +01001109 if (BAD_ADDR(elf_entry)) {
Chuck Ebbertce510592006-07-03 00:24:14 -07001110 retval = -EINVAL;
Suresh Siddha5342fba2006-02-26 04:18:28 +01001111 goto out_free_dentry;
1112 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001113 }
1114
Paul Burton774c1052014-09-11 08:30:16 +01001115 kfree(interp_elf_phdata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001116 kfree(elf_phdata);
1117
Linus Torvalds1da177e2005-04-16 15:20:36 -07001118 set_binfmt(&elf_format);
1119
Benjamin Herrenschmidt547ee842005-04-16 15:24:35 -07001120#ifdef ARCH_HAS_SETUP_ADDITIONAL_PAGES
Alexey Dobriyancc338012019-05-14 15:43:39 -07001121 retval = arch_setup_additional_pages(bprm, !!interpreter);
Al Viro19d860a2014-05-04 20:11:36 -04001122 if (retval < 0)
Roland McGrath18c8baff2005-04-28 15:17:19 -07001123 goto out;
Benjamin Herrenschmidt547ee842005-04-16 15:24:35 -07001124#endif /* ARCH_HAS_SETUP_ADDITIONAL_PAGES */
1125
Ollie Wildb6a2fea2007-07-19 01:48:16 -07001126 retval = create_elf_tables(bprm, &loc->elf_ex,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001127 load_addr, interp_load_addr);
Al Viro19d860a2014-05-04 20:11:36 -04001128 if (retval < 0)
Ollie Wildb6a2fea2007-07-19 01:48:16 -07001129 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001130 current->mm->end_code = end_code;
1131 current->mm->start_code = start_code;
1132 current->mm->start_data = start_data;
1133 current->mm->end_data = end_data;
1134 current->mm->start_stack = bprm->p;
1135
Jiri Kosina4471a672011-04-14 15:22:09 -07001136 if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1)) {
Kees Cookbbdc6072019-05-14 15:43:57 -07001137 /*
1138 * For architectures with ELF randomization, when executing
1139 * a loader directly (i.e. no interpreter listed in ELF
1140 * headers), move the brk area out of the mmap region
1141 * (since it grows up, and may collide early with the stack
1142 * growing down), and into the unused ELF_ET_DYN_BASE region.
1143 */
1144 if (IS_ENABLED(CONFIG_ARCH_HAS_ELF_RANDOMIZE) && !interpreter)
1145 current->mm->brk = current->mm->start_brk =
1146 ELF_ET_DYN_BASE;
1147
Jiri Kosinac1d171a2008-01-30 13:30:40 +01001148 current->mm->brk = current->mm->start_brk =
1149 arch_randomize_brk(current->mm);
Kees Cook204db6e2015-04-14 15:48:12 -07001150#ifdef compat_brk_randomized
Jiri Kosina4471a672011-04-14 15:22:09 -07001151 current->brk_randomized = 1;
1152#endif
1153 }
Jiri Kosinac1d171a2008-01-30 13:30:40 +01001154
Linus Torvalds1da177e2005-04-16 15:20:36 -07001155 if (current->personality & MMAP_PAGE_ZERO) {
1156 /* Why this, you ask??? Well SVr4 maps page 0 as read-only,
1157 and some applications "depend" upon this behavior.
1158 Since we do not have the power to recompile these, we
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001159 emulate the SVr4 behavior. Sigh. */
Linus Torvalds6be5ceb2012-04-20 17:13:58 -07001160 error = vm_mmap(NULL, 0, PAGE_SIZE, PROT_READ | PROT_EXEC,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001161 MAP_FIXED | MAP_PRIVATE, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001162 }
1163
Alexey Dobriyan249b08e2019-05-14 15:43:54 -07001164 regs = current_pt_regs();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001165#ifdef ELF_PLAT_INIT
1166 /*
1167 * The ABI may specify that certain registers be set up in special
1168 * ways (on i386 %edx is the address of a DT_FINI function, for
1169 * example. In addition, it may also specify (eg, PowerPC64 ELF)
1170 * that the e_entry field is the address of the function descriptor
1171 * for the startup routine, rather than the address of the startup
1172 * routine itself. This macro performs whatever initialization to
1173 * the regs structure is required as well as any relocations to the
1174 * function descriptor entries when executing dynamically links apps.
1175 */
1176 ELF_PLAT_INIT(regs, reloc_func_desc);
1177#endif
1178
Kees Cookb8383832018-04-10 16:34:57 -07001179 finalize_exec(bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001180 start_thread(regs, elf_entry, bprm->p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001181 retval = 0;
1182out:
1183 kfree(loc);
1184out_ret:
1185 return retval;
1186
1187 /* error cleanup */
1188out_free_dentry:
Paul Burtona9d9ef12014-09-11 08:30:15 +01001189 kfree(interp_elf_phdata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001190 allow_write_access(interpreter);
1191 if (interpreter)
1192 fput(interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001193out_free_ph:
1194 kfree(elf_phdata);
1195 goto out;
1196}
1197
Josh Triplett69369a72014-04-03 14:48:27 -07001198#ifdef CONFIG_USELIB
Linus Torvalds1da177e2005-04-16 15:20:36 -07001199/* This is really simpleminded and specialized - we are loading an
1200 a.out library that is given an ELF header. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001201static int load_elf_library(struct file *file)
1202{
1203 struct elf_phdr *elf_phdata;
1204 struct elf_phdr *eppnt;
1205 unsigned long elf_bss, bss, len;
1206 int retval, error, i, j;
1207 struct elfhdr elf_ex;
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +02001208 loff_t pos = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001209
1210 error = -ENOEXEC;
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +02001211 retval = kernel_read(file, &elf_ex, sizeof(elf_ex), &pos);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001212 if (retval != sizeof(elf_ex))
1213 goto out;
1214
1215 if (memcmp(elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
1216 goto out;
1217
1218 /* First of all, some simple consistency checks */
1219 if (elf_ex.e_type != ET_EXEC || elf_ex.e_phnum > 2 ||
Al Viro72c2d532013-09-22 16:27:52 -04001220 !elf_check_arch(&elf_ex) || !file->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001221 goto out;
Nicolas Pitre47552002017-08-16 16:05:13 -04001222 if (elf_check_fdpic(&elf_ex))
1223 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001224
1225 /* Now read in all of the header information */
1226
1227 j = sizeof(struct elf_phdr) * elf_ex.e_phnum;
1228 /* j < ELF_MIN_ALIGN because elf_ex.e_phnum <= 2 */
1229
1230 error = -ENOMEM;
1231 elf_phdata = kmalloc(j, GFP_KERNEL);
1232 if (!elf_phdata)
1233 goto out;
1234
1235 eppnt = elf_phdata;
1236 error = -ENOEXEC;
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +02001237 pos = elf_ex.e_phoff;
1238 retval = kernel_read(file, eppnt, j, &pos);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001239 if (retval != j)
1240 goto out_free_ph;
1241
1242 for (j = 0, i = 0; i<elf_ex.e_phnum; i++)
1243 if ((eppnt + i)->p_type == PT_LOAD)
1244 j++;
1245 if (j != 1)
1246 goto out_free_ph;
1247
1248 while (eppnt->p_type != PT_LOAD)
1249 eppnt++;
1250
1251 /* Now use mmap to map the library into memory. */
Linus Torvalds6be5ceb2012-04-20 17:13:58 -07001252 error = vm_mmap(file,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001253 ELF_PAGESTART(eppnt->p_vaddr),
1254 (eppnt->p_filesz +
1255 ELF_PAGEOFFSET(eppnt->p_vaddr)),
1256 PROT_READ | PROT_WRITE | PROT_EXEC,
Michal Hocko4ed28632018-04-10 16:36:01 -07001257 MAP_FIXED_NOREPLACE | MAP_PRIVATE | MAP_DENYWRITE,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001258 (eppnt->p_offset -
1259 ELF_PAGEOFFSET(eppnt->p_vaddr)));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001260 if (error != ELF_PAGESTART(eppnt->p_vaddr))
1261 goto out_free_ph;
1262
1263 elf_bss = eppnt->p_vaddr + eppnt->p_filesz;
1264 if (padzero(elf_bss)) {
1265 error = -EFAULT;
1266 goto out_free_ph;
1267 }
1268
Oscar Salvador24962af2018-07-13 16:59:13 -07001269 len = ELF_PAGEALIGN(eppnt->p_filesz + eppnt->p_vaddr);
1270 bss = ELF_PAGEALIGN(eppnt->p_memsz + eppnt->p_vaddr);
Michal Hockoecc2bc82016-05-23 16:25:39 -07001271 if (bss > len) {
1272 error = vm_brk(len, bss - len);
Linus Torvalds5d22fc22016-05-27 15:57:31 -07001273 if (error)
Michal Hockoecc2bc82016-05-23 16:25:39 -07001274 goto out_free_ph;
1275 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001276 error = 0;
1277
1278out_free_ph:
1279 kfree(elf_phdata);
1280out:
1281 return error;
1282}
Josh Triplett69369a72014-04-03 14:48:27 -07001283#endif /* #ifdef CONFIG_USELIB */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001284
Christoph Hellwig698ba7b2009-12-15 16:47:37 -08001285#ifdef CONFIG_ELF_CORE
Linus Torvalds1da177e2005-04-16 15:20:36 -07001286/*
1287 * ELF core dumper
1288 *
1289 * Modelled on fs/exec.c:aout_core_dump()
1290 * Jeremy Fitzhardinge <jeremy@sw.oz.au>
1291 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001292
1293/*
Jason Baron909af762012-03-23 15:02:51 -07001294 * The purpose of always_dump_vma() is to make sure that special kernel mappings
1295 * that are useful for post-mortem analysis are included in every core dump.
1296 * In that way we ensure that the core dump is fully interpretable later
1297 * without matching up the same kernel and hardware config to see what PC values
1298 * meant. These special mappings include - vDSO, vsyscall, and other
1299 * architecture specific mappings
1300 */
1301static bool always_dump_vma(struct vm_area_struct *vma)
1302{
1303 /* Any vsyscall mappings? */
1304 if (vma == get_gate_vma(vma->vm_mm))
1305 return true;
Andy Lutomirski78d683e2014-05-19 15:58:32 -07001306
1307 /*
1308 * Assume that all vmas with a .name op should always be dumped.
1309 * If this changes, a new vm_ops field can easily be added.
1310 */
1311 if (vma->vm_ops && vma->vm_ops->name && vma->vm_ops->name(vma))
1312 return true;
1313
Jason Baron909af762012-03-23 15:02:51 -07001314 /*
1315 * arch_vma_name() returns non-NULL for special architecture mappings,
1316 * such as vDSO sections.
1317 */
1318 if (arch_vma_name(vma))
1319 return true;
1320
1321 return false;
1322}
1323
1324/*
Roland McGrath82df3972007-10-16 23:27:02 -07001325 * Decide what to dump of a segment, part, all or none.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001326 */
Roland McGrath82df3972007-10-16 23:27:02 -07001327static unsigned long vma_dump_size(struct vm_area_struct *vma,
1328 unsigned long mm_flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001329{
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001330#define FILTER(type) (mm_flags & (1UL << MMF_DUMP_##type))
1331
Jason Baron909af762012-03-23 15:02:51 -07001332 /* always dump the vdso and vsyscall sections */
1333 if (always_dump_vma(vma))
Roland McGrath82df3972007-10-16 23:27:02 -07001334 goto whole;
Roland McGrathe5b97dd2007-01-26 00:56:48 -08001335
Konstantin Khlebnikov0103bd12012-10-08 16:28:59 -07001336 if (vma->vm_flags & VM_DONTDUMP)
Jason Baronaccb61f2012-03-23 15:02:51 -07001337 return 0;
1338
Ross Zwisler50378352015-10-05 16:33:36 -06001339 /* support for DAX */
1340 if (vma_is_dax(vma)) {
1341 if ((vma->vm_flags & VM_SHARED) && FILTER(DAX_SHARED))
1342 goto whole;
1343 if (!(vma->vm_flags & VM_SHARED) && FILTER(DAX_PRIVATE))
1344 goto whole;
1345 return 0;
1346 }
1347
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001348 /* Hugetlb memory check */
1349 if (vma->vm_flags & VM_HUGETLB) {
1350 if ((vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_SHARED))
1351 goto whole;
1352 if (!(vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_PRIVATE))
1353 goto whole;
Naoya Horiguchi23d9e482013-04-17 15:58:28 -07001354 return 0;
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001355 }
1356
Linus Torvalds1da177e2005-04-16 15:20:36 -07001357 /* Do not dump I/O mapped devices or special mappings */
Konstantin Khlebnikov314e51b2012-10-08 16:29:02 -07001358 if (vma->vm_flags & VM_IO)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001359 return 0;
1360
Kawai, Hidehiroa1b59e82007-07-19 01:48:29 -07001361 /* By default, dump shared memory if mapped from an anonymous file. */
1362 if (vma->vm_flags & VM_SHARED) {
Al Viro496ad9a2013-01-23 17:07:38 -05001363 if (file_inode(vma->vm_file)->i_nlink == 0 ?
Roland McGrath82df3972007-10-16 23:27:02 -07001364 FILTER(ANON_SHARED) : FILTER(MAPPED_SHARED))
1365 goto whole;
1366 return 0;
Kawai, Hidehiroa1b59e82007-07-19 01:48:29 -07001367 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001368
Roland McGrath82df3972007-10-16 23:27:02 -07001369 /* Dump segments that have been written to. */
1370 if (vma->anon_vma && FILTER(ANON_PRIVATE))
1371 goto whole;
1372 if (vma->vm_file == NULL)
1373 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001374
Roland McGrath82df3972007-10-16 23:27:02 -07001375 if (FILTER(MAPPED_PRIVATE))
1376 goto whole;
1377
1378 /*
1379 * If this looks like the beginning of a DSO or executable mapping,
1380 * check for an ELF header. If we find one, dump the first page to
1381 * aid in determining what was mapped here.
1382 */
Roland McGrath92dc07b2009-02-06 17:34:07 -08001383 if (FILTER(ELF_HEADERS) &&
1384 vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) {
Roland McGrath82df3972007-10-16 23:27:02 -07001385 u32 __user *header = (u32 __user *) vma->vm_start;
1386 u32 word;
Roland McGrath92dc07b2009-02-06 17:34:07 -08001387 mm_segment_t fs = get_fs();
Roland McGrath82df3972007-10-16 23:27:02 -07001388 /*
1389 * Doing it this way gets the constant folded by GCC.
1390 */
1391 union {
1392 u32 cmp;
1393 char elfmag[SELFMAG];
1394 } magic;
1395 BUILD_BUG_ON(SELFMAG != sizeof word);
1396 magic.elfmag[EI_MAG0] = ELFMAG0;
1397 magic.elfmag[EI_MAG1] = ELFMAG1;
1398 magic.elfmag[EI_MAG2] = ELFMAG2;
1399 magic.elfmag[EI_MAG3] = ELFMAG3;
Roland McGrath92dc07b2009-02-06 17:34:07 -08001400 /*
1401 * Switch to the user "segment" for get_user(),
1402 * then put back what elf_core_dump() had in place.
1403 */
1404 set_fs(USER_DS);
1405 if (unlikely(get_user(word, header)))
1406 word = 0;
1407 set_fs(fs);
1408 if (word == magic.cmp)
Roland McGrath82df3972007-10-16 23:27:02 -07001409 return PAGE_SIZE;
1410 }
1411
1412#undef FILTER
1413
1414 return 0;
1415
1416whole:
1417 return vma->vm_end - vma->vm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001418}
1419
Linus Torvalds1da177e2005-04-16 15:20:36 -07001420/* An ELF note in memory */
1421struct memelfnote
1422{
1423 const char *name;
1424 int type;
1425 unsigned int datasz;
1426 void *data;
1427};
1428
1429static int notesize(struct memelfnote *en)
1430{
1431 int sz;
1432
1433 sz = sizeof(struct elf_note);
1434 sz += roundup(strlen(en->name) + 1, 4);
1435 sz += roundup(en->datasz, 4);
1436
1437 return sz;
1438}
1439
Al Viroecc8c772013-10-05 15:32:35 -04001440static int writenote(struct memelfnote *men, struct coredump_params *cprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001441{
1442 struct elf_note en;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001443 en.n_namesz = strlen(men->name) + 1;
1444 en.n_descsz = men->datasz;
1445 en.n_type = men->type;
1446
Al Viroecc8c772013-10-05 15:32:35 -04001447 return dump_emit(cprm, &en, sizeof(en)) &&
Al Viro22a8cb82013-10-08 11:05:01 -04001448 dump_emit(cprm, men->name, en.n_namesz) && dump_align(cprm, 4) &&
1449 dump_emit(cprm, men->data, men->datasz) && dump_align(cprm, 4);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001450}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001451
Roland McGrath3aba4812008-01-30 13:31:44 +01001452static void fill_elf_header(struct elfhdr *elf, int segs,
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001453 u16 machine, u32 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001454{
Cyrill Gorcunov6970c8e2008-04-29 01:01:18 -07001455 memset(elf, 0, sizeof(*elf));
1456
Linus Torvalds1da177e2005-04-16 15:20:36 -07001457 memcpy(elf->e_ident, ELFMAG, SELFMAG);
1458 elf->e_ident[EI_CLASS] = ELF_CLASS;
1459 elf->e_ident[EI_DATA] = ELF_DATA;
1460 elf->e_ident[EI_VERSION] = EV_CURRENT;
1461 elf->e_ident[EI_OSABI] = ELF_OSABI;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001462
1463 elf->e_type = ET_CORE;
Roland McGrath3aba4812008-01-30 13:31:44 +01001464 elf->e_machine = machine;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001465 elf->e_version = EV_CURRENT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001466 elf->e_phoff = sizeof(struct elfhdr);
Roland McGrath3aba4812008-01-30 13:31:44 +01001467 elf->e_flags = flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001468 elf->e_ehsize = sizeof(struct elfhdr);
1469 elf->e_phentsize = sizeof(struct elf_phdr);
1470 elf->e_phnum = segs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001471}
1472
Andrew Morton8d6b5eee2006-09-25 23:32:04 -07001473static void fill_elf_note_phdr(struct elf_phdr *phdr, int sz, loff_t offset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001474{
1475 phdr->p_type = PT_NOTE;
1476 phdr->p_offset = offset;
1477 phdr->p_vaddr = 0;
1478 phdr->p_paddr = 0;
1479 phdr->p_filesz = sz;
1480 phdr->p_memsz = 0;
1481 phdr->p_flags = 0;
1482 phdr->p_align = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001483}
1484
1485static void fill_note(struct memelfnote *note, const char *name, int type,
1486 unsigned int sz, void *data)
1487{
1488 note->name = name;
1489 note->type = type;
1490 note->datasz = sz;
1491 note->data = data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001492}
1493
1494/*
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001495 * fill up all the fields in prstatus from the given task struct, except
1496 * registers which need to be filled up separately.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001497 */
1498static void fill_prstatus(struct elf_prstatus *prstatus,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001499 struct task_struct *p, long signr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001500{
1501 prstatus->pr_info.si_signo = prstatus->pr_cursig = signr;
1502 prstatus->pr_sigpend = p->pending.signal.sig[0];
1503 prstatus->pr_sighold = p->blocked.sig[0];
Oleg Nesterov3b34fc52009-06-17 16:27:38 -07001504 rcu_read_lock();
1505 prstatus->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1506 rcu_read_unlock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001507 prstatus->pr_pid = task_pid_vnr(p);
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001508 prstatus->pr_pgrp = task_pgrp_vnr(p);
1509 prstatus->pr_sid = task_session_vnr(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001510 if (thread_group_leader(p)) {
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001511 struct task_cputime cputime;
Frank Mayharf06febc2008-09-12 09:54:39 -07001512
Linus Torvalds1da177e2005-04-16 15:20:36 -07001513 /*
Frank Mayharf06febc2008-09-12 09:54:39 -07001514 * This is the record for the group leader. It shows the
1515 * group-wide total, not its individual thread total.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001516 */
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001517 thread_group_cputime(p, &cputime);
1518 prstatus->pr_utime = ns_to_timeval(cputime.utime);
1519 prstatus->pr_stime = ns_to_timeval(cputime.stime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001520 } else {
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001521 u64 utime, stime;
Frederic Weisbecker6fac4822012-11-13 14:20:55 +01001522
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001523 task_cputime(p, &utime, &stime);
1524 prstatus->pr_utime = ns_to_timeval(utime);
1525 prstatus->pr_stime = ns_to_timeval(stime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001526 }
Frederic Weisbecker5613fda2017-01-31 04:09:23 +01001527
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001528 prstatus->pr_cutime = ns_to_timeval(p->signal->cutime);
1529 prstatus->pr_cstime = ns_to_timeval(p->signal->cstime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001530}
1531
1532static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p,
1533 struct mm_struct *mm)
1534{
David Howellsc69e8d92008-11-14 10:39:19 +11001535 const struct cred *cred;
Greg Kroah-Hartmana84a5052005-05-11 00:10:44 -07001536 unsigned int i, len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001537
1538 /* first copy the parameters from user space */
1539 memset(psinfo, 0, sizeof(struct elf_prpsinfo));
1540
1541 len = mm->arg_end - mm->arg_start;
1542 if (len >= ELF_PRARGSZ)
1543 len = ELF_PRARGSZ-1;
1544 if (copy_from_user(&psinfo->pr_psargs,
1545 (const char __user *)mm->arg_start, len))
1546 return -EFAULT;
1547 for(i = 0; i < len; i++)
1548 if (psinfo->pr_psargs[i] == 0)
1549 psinfo->pr_psargs[i] = ' ';
1550 psinfo->pr_psargs[len] = 0;
1551
Oleg Nesterov3b34fc52009-06-17 16:27:38 -07001552 rcu_read_lock();
1553 psinfo->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1554 rcu_read_unlock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001555 psinfo->pr_pid = task_pid_vnr(p);
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001556 psinfo->pr_pgrp = task_pgrp_vnr(p);
1557 psinfo->pr_sid = task_session_vnr(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001558
1559 i = p->state ? ffz(~p->state) + 1 : 0;
1560 psinfo->pr_state = i;
Carsten Otte55148542006-03-25 03:08:22 -08001561 psinfo->pr_sname = (i > 5) ? '.' : "RSDTZW"[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001562 psinfo->pr_zomb = psinfo->pr_sname == 'Z';
1563 psinfo->pr_nice = task_nice(p);
1564 psinfo->pr_flag = p->flags;
David Howellsc69e8d92008-11-14 10:39:19 +11001565 rcu_read_lock();
1566 cred = __task_cred(p);
Eric W. Biedermanebc887b2012-02-07 18:36:10 -08001567 SET_UID(psinfo->pr_uid, from_kuid_munged(cred->user_ns, cred->uid));
1568 SET_GID(psinfo->pr_gid, from_kgid_munged(cred->user_ns, cred->gid));
David Howellsc69e8d92008-11-14 10:39:19 +11001569 rcu_read_unlock();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001570 strncpy(psinfo->pr_fname, p->comm, sizeof(psinfo->pr_fname));
1571
1572 return 0;
1573}
1574
Roland McGrath3aba4812008-01-30 13:31:44 +01001575static void fill_auxv_note(struct memelfnote *note, struct mm_struct *mm)
1576{
1577 elf_addr_t *auxv = (elf_addr_t *) mm->saved_auxv;
1578 int i = 0;
1579 do
1580 i += 2;
1581 while (auxv[i - 2] != AT_NULL);
1582 fill_note(note, "CORE", NT_AUXV, i * sizeof(elf_addr_t), auxv);
1583}
1584
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001585static void fill_siginfo_note(struct memelfnote *note, user_siginfo_t *csigdata,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02001586 const kernel_siginfo_t *siginfo)
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001587{
1588 mm_segment_t old_fs = get_fs();
1589 set_fs(KERNEL_DS);
1590 copy_siginfo_to_user((user_siginfo_t __user *) csigdata, siginfo);
1591 set_fs(old_fs);
1592 fill_note(note, "CORE", NT_SIGINFO, sizeof(*csigdata), csigdata);
1593}
1594
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001595#define MAX_FILE_NOTE_SIZE (4*1024*1024)
1596/*
1597 * Format of NT_FILE note:
1598 *
1599 * long count -- how many files are mapped
1600 * long page_size -- units for file_ofs
1601 * array of [COUNT] elements of
1602 * long start
1603 * long end
1604 * long file_ofs
1605 * followed by COUNT filenames in ASCII: "FILE1" NUL "FILE2" NUL...
1606 */
Dan Aloni72023652013-09-30 13:45:02 -07001607static int fill_files_note(struct memelfnote *note)
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001608{
1609 struct vm_area_struct *vma;
1610 unsigned count, size, names_ofs, remaining, n;
1611 user_long_t *data;
1612 user_long_t *start_end_ofs;
1613 char *name_base, *name_curpos;
1614
1615 /* *Estimated* file count and total data size needed */
1616 count = current->mm->map_count;
Alexey Dobriyan60c9d922018-02-06 15:39:13 -08001617 if (count > UINT_MAX / 64)
1618 return -EINVAL;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001619 size = count * 64;
1620
1621 names_ofs = (2 + 3 * count) * sizeof(data[0]);
1622 alloc:
1623 if (size >= MAX_FILE_NOTE_SIZE) /* paranoia check */
Dan Aloni72023652013-09-30 13:45:02 -07001624 return -EINVAL;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001625 size = round_up(size, PAGE_SIZE);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001626 data = kvmalloc(size, GFP_KERNEL);
1627 if (ZERO_OR_NULL_PTR(data))
Dan Aloni72023652013-09-30 13:45:02 -07001628 return -ENOMEM;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001629
1630 start_end_ofs = data + 2;
1631 name_base = name_curpos = ((char *)data) + names_ofs;
1632 remaining = size - names_ofs;
1633 count = 0;
1634 for (vma = current->mm->mmap; vma != NULL; vma = vma->vm_next) {
1635 struct file *file;
1636 const char *filename;
1637
1638 file = vma->vm_file;
1639 if (!file)
1640 continue;
Miklos Szeredi9bf39ab2015-06-19 10:29:13 +02001641 filename = file_path(file, name_curpos, remaining);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001642 if (IS_ERR(filename)) {
1643 if (PTR_ERR(filename) == -ENAMETOOLONG) {
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001644 kvfree(data);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001645 size = size * 5 / 4;
1646 goto alloc;
1647 }
1648 continue;
1649 }
1650
Miklos Szeredi9bf39ab2015-06-19 10:29:13 +02001651 /* file_path() fills at the end, move name down */
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001652 /* n = strlen(filename) + 1: */
1653 n = (name_curpos + remaining) - filename;
1654 remaining = filename - name_curpos;
1655 memmove(name_curpos, filename, n);
1656 name_curpos += n;
1657
1658 *start_end_ofs++ = vma->vm_start;
1659 *start_end_ofs++ = vma->vm_end;
1660 *start_end_ofs++ = vma->vm_pgoff;
1661 count++;
1662 }
1663
1664 /* Now we know exact count of files, can store it */
1665 data[0] = count;
1666 data[1] = PAGE_SIZE;
1667 /*
1668 * Count usually is less than current->mm->map_count,
1669 * we need to move filenames down.
1670 */
1671 n = current->mm->map_count - count;
1672 if (n != 0) {
1673 unsigned shift_bytes = n * 3 * sizeof(data[0]);
1674 memmove(name_base - shift_bytes, name_base,
1675 name_curpos - name_base);
1676 name_curpos -= shift_bytes;
1677 }
1678
1679 size = name_curpos - (char *)data;
1680 fill_note(note, "CORE", NT_FILE, size, data);
Dan Aloni72023652013-09-30 13:45:02 -07001681 return 0;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001682}
1683
Roland McGrath4206d3a2008-01-30 13:31:45 +01001684#ifdef CORE_DUMP_USE_REGSET
1685#include <linux/regset.h>
1686
1687struct elf_thread_core_info {
1688 struct elf_thread_core_info *next;
1689 struct task_struct *task;
1690 struct elf_prstatus prstatus;
1691 struct memelfnote notes[0];
1692};
1693
1694struct elf_note_info {
1695 struct elf_thread_core_info *thread;
1696 struct memelfnote psinfo;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001697 struct memelfnote signote;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001698 struct memelfnote auxv;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001699 struct memelfnote files;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001700 user_siginfo_t csigdata;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001701 size_t size;
1702 int thread_notes;
1703};
1704
Roland McGrathd31472b2008-03-04 14:28:30 -08001705/*
1706 * When a regset has a writeback hook, we call it on each thread before
1707 * dumping user memory. On register window machines, this makes sure the
1708 * user memory backing the register data is up to date before we read it.
1709 */
1710static void do_thread_regset_writeback(struct task_struct *task,
1711 const struct user_regset *regset)
1712{
1713 if (regset->writeback)
1714 regset->writeback(task, regset, 1);
1715}
1716
H. J. Lu0953f65d2012-02-14 13:34:52 -08001717#ifndef PRSTATUS_SIZE
Dmitry Safonov90954e72016-09-05 16:33:06 +03001718#define PRSTATUS_SIZE(S, R) sizeof(S)
H. J. Lu0953f65d2012-02-14 13:34:52 -08001719#endif
1720
1721#ifndef SET_PR_FPVALID
Dmitry Safonov90954e72016-09-05 16:33:06 +03001722#define SET_PR_FPVALID(S, V, R) ((S)->pr_fpvalid = (V))
H. J. Lu0953f65d2012-02-14 13:34:52 -08001723#endif
1724
Roland McGrath4206d3a2008-01-30 13:31:45 +01001725static int fill_thread_core_info(struct elf_thread_core_info *t,
1726 const struct user_regset_view *view,
1727 long signr, size_t *total)
1728{
1729 unsigned int i;
Dave Martin27e64b42017-10-31 15:50:53 +00001730 unsigned int regset0_size = regset_size(t->task, &view->regsets[0]);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001731
1732 /*
1733 * NT_PRSTATUS is the one special case, because the regset data
1734 * goes into the pr_reg field inside the note contents, rather
1735 * than being the whole note contents. We fill the reset in here.
1736 * We assume that regset 0 is NT_PRSTATUS.
1737 */
1738 fill_prstatus(&t->prstatus, t->task, signr);
Dave Martin27e64b42017-10-31 15:50:53 +00001739 (void) view->regsets[0].get(t->task, &view->regsets[0], 0, regset0_size,
Dmitry Safonov90954e72016-09-05 16:33:06 +03001740 &t->prstatus.pr_reg, NULL);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001741
1742 fill_note(&t->notes[0], "CORE", NT_PRSTATUS,
Dave Martin27e64b42017-10-31 15:50:53 +00001743 PRSTATUS_SIZE(t->prstatus, regset0_size), &t->prstatus);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001744 *total += notesize(&t->notes[0]);
1745
Roland McGrathd31472b2008-03-04 14:28:30 -08001746 do_thread_regset_writeback(t->task, &view->regsets[0]);
1747
Roland McGrath4206d3a2008-01-30 13:31:45 +01001748 /*
1749 * Each other regset might generate a note too. For each regset
1750 * that has no core_note_type or is inactive, we leave t->notes[i]
1751 * all zero and we'll know to skip writing it later.
1752 */
1753 for (i = 1; i < view->n; ++i) {
1754 const struct user_regset *regset = &view->regsets[i];
Roland McGrathd31472b2008-03-04 14:28:30 -08001755 do_thread_regset_writeback(t->task, regset);
H. Peter Anvinc8e25252012-03-02 10:43:48 -08001756 if (regset->core_note_type && regset->get &&
Maciej W. Rozycki2f819db2018-05-15 23:32:45 +01001757 (!regset->active || regset->active(t->task, regset) > 0)) {
Roland McGrath4206d3a2008-01-30 13:31:45 +01001758 int ret;
Dave Martin27e64b42017-10-31 15:50:53 +00001759 size_t size = regset_size(t->task, regset);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001760 void *data = kmalloc(size, GFP_KERNEL);
1761 if (unlikely(!data))
1762 return 0;
1763 ret = regset->get(t->task, regset,
1764 0, size, data, NULL);
1765 if (unlikely(ret))
1766 kfree(data);
1767 else {
1768 if (regset->core_note_type != NT_PRFPREG)
1769 fill_note(&t->notes[i], "LINUX",
1770 regset->core_note_type,
1771 size, data);
1772 else {
Dmitry Safonov90954e72016-09-05 16:33:06 +03001773 SET_PR_FPVALID(&t->prstatus,
Dave Martin27e64b42017-10-31 15:50:53 +00001774 1, regset0_size);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001775 fill_note(&t->notes[i], "CORE",
1776 NT_PRFPREG, size, data);
1777 }
1778 *total += notesize(&t->notes[i]);
1779 }
1780 }
1781 }
1782
1783 return 1;
1784}
1785
1786static int fill_note_info(struct elfhdr *elf, int phdrs,
1787 struct elf_note_info *info,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02001788 const kernel_siginfo_t *siginfo, struct pt_regs *regs)
Roland McGrath4206d3a2008-01-30 13:31:45 +01001789{
1790 struct task_struct *dump_task = current;
1791 const struct user_regset_view *view = task_user_regset_view(dump_task);
1792 struct elf_thread_core_info *t;
1793 struct elf_prpsinfo *psinfo;
Oleg Nesterov83914442008-07-25 01:47:45 -07001794 struct core_thread *ct;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001795 unsigned int i;
1796
1797 info->size = 0;
1798 info->thread = NULL;
1799
1800 psinfo = kmalloc(sizeof(*psinfo), GFP_KERNEL);
Alan Cox6899e922012-12-17 16:02:09 -08001801 if (psinfo == NULL) {
1802 info->psinfo.data = NULL; /* So we don't free this wrongly */
Roland McGrath4206d3a2008-01-30 13:31:45 +01001803 return 0;
Alan Cox6899e922012-12-17 16:02:09 -08001804 }
Roland McGrath4206d3a2008-01-30 13:31:45 +01001805
Amerigo Wange2dbe122009-07-01 01:06:26 -04001806 fill_note(&info->psinfo, "CORE", NT_PRPSINFO, sizeof(*psinfo), psinfo);
1807
Roland McGrath4206d3a2008-01-30 13:31:45 +01001808 /*
1809 * Figure out how many notes we're going to need for each thread.
1810 */
1811 info->thread_notes = 0;
1812 for (i = 0; i < view->n; ++i)
1813 if (view->regsets[i].core_note_type != 0)
1814 ++info->thread_notes;
1815
1816 /*
1817 * Sanity check. We rely on regset 0 being in NT_PRSTATUS,
1818 * since it is our one special case.
1819 */
1820 if (unlikely(info->thread_notes == 0) ||
1821 unlikely(view->regsets[0].core_note_type != NT_PRSTATUS)) {
1822 WARN_ON(1);
1823 return 0;
1824 }
1825
1826 /*
1827 * Initialize the ELF file header.
1828 */
1829 fill_elf_header(elf, phdrs,
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001830 view->e_machine, view->e_flags);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001831
1832 /*
1833 * Allocate a structure for each thread.
1834 */
Oleg Nesterov83914442008-07-25 01:47:45 -07001835 for (ct = &dump_task->mm->core_state->dumper; ct; ct = ct->next) {
1836 t = kzalloc(offsetof(struct elf_thread_core_info,
1837 notes[info->thread_notes]),
1838 GFP_KERNEL);
1839 if (unlikely(!t))
1840 return 0;
Oleg Nesterov24d52882008-07-25 01:47:40 -07001841
Oleg Nesterov83914442008-07-25 01:47:45 -07001842 t->task = ct->task;
1843 if (ct->task == dump_task || !info->thread) {
1844 t->next = info->thread;
1845 info->thread = t;
1846 } else {
1847 /*
1848 * Make sure to keep the original task at
1849 * the head of the list.
1850 */
1851 t->next = info->thread->next;
1852 info->thread->next = t;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001853 }
Oleg Nesterov83914442008-07-25 01:47:45 -07001854 }
Roland McGrath4206d3a2008-01-30 13:31:45 +01001855
1856 /*
1857 * Now fill in each thread's information.
1858 */
1859 for (t = info->thread; t != NULL; t = t->next)
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07001860 if (!fill_thread_core_info(t, view, siginfo->si_signo, &info->size))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001861 return 0;
1862
1863 /*
1864 * Fill in the two process-wide notes.
1865 */
1866 fill_psinfo(psinfo, dump_task->group_leader, dump_task->mm);
1867 info->size += notesize(&info->psinfo);
1868
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001869 fill_siginfo_note(&info->signote, &info->csigdata, siginfo);
1870 info->size += notesize(&info->signote);
1871
Roland McGrath4206d3a2008-01-30 13:31:45 +01001872 fill_auxv_note(&info->auxv, current->mm);
1873 info->size += notesize(&info->auxv);
1874
Dan Aloni72023652013-09-30 13:45:02 -07001875 if (fill_files_note(&info->files) == 0)
1876 info->size += notesize(&info->files);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001877
Roland McGrath4206d3a2008-01-30 13:31:45 +01001878 return 1;
1879}
1880
1881static size_t get_note_info_size(struct elf_note_info *info)
1882{
1883 return info->size;
1884}
1885
1886/*
1887 * Write all the notes for each thread. When writing the first thread, the
1888 * process-wide notes are interleaved after the first thread-specific note.
1889 */
1890static int write_note_info(struct elf_note_info *info,
Al Viroecc8c772013-10-05 15:32:35 -04001891 struct coredump_params *cprm)
Roland McGrath4206d3a2008-01-30 13:31:45 +01001892{
Fabian Frederickb219e252014-06-04 16:12:14 -07001893 bool first = true;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001894 struct elf_thread_core_info *t = info->thread;
1895
1896 do {
1897 int i;
1898
Al Viroecc8c772013-10-05 15:32:35 -04001899 if (!writenote(&t->notes[0], cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001900 return 0;
1901
Al Viroecc8c772013-10-05 15:32:35 -04001902 if (first && !writenote(&info->psinfo, cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001903 return 0;
Al Viroecc8c772013-10-05 15:32:35 -04001904 if (first && !writenote(&info->signote, cprm))
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001905 return 0;
Al Viroecc8c772013-10-05 15:32:35 -04001906 if (first && !writenote(&info->auxv, cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001907 return 0;
Dan Aloni72023652013-09-30 13:45:02 -07001908 if (first && info->files.data &&
Al Viroecc8c772013-10-05 15:32:35 -04001909 !writenote(&info->files, cprm))
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001910 return 0;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001911
1912 for (i = 1; i < info->thread_notes; ++i)
1913 if (t->notes[i].data &&
Al Viroecc8c772013-10-05 15:32:35 -04001914 !writenote(&t->notes[i], cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001915 return 0;
1916
Fabian Frederickb219e252014-06-04 16:12:14 -07001917 first = false;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001918 t = t->next;
1919 } while (t);
1920
1921 return 1;
1922}
1923
1924static void free_note_info(struct elf_note_info *info)
1925{
1926 struct elf_thread_core_info *threads = info->thread;
1927 while (threads) {
1928 unsigned int i;
1929 struct elf_thread_core_info *t = threads;
1930 threads = t->next;
1931 WARN_ON(t->notes[0].data && t->notes[0].data != &t->prstatus);
1932 for (i = 1; i < info->thread_notes; ++i)
1933 kfree(t->notes[i].data);
1934 kfree(t);
1935 }
1936 kfree(info->psinfo.data);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001937 kvfree(info->files.data);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001938}
1939
1940#else
1941
Linus Torvalds1da177e2005-04-16 15:20:36 -07001942/* Here is the structure in which status of each thread is captured. */
1943struct elf_thread_status
1944{
1945 struct list_head list;
1946 struct elf_prstatus prstatus; /* NT_PRSTATUS */
1947 elf_fpregset_t fpu; /* NT_PRFPREG */
1948 struct task_struct *thread;
1949#ifdef ELF_CORE_COPY_XFPREGS
Mark Nelson5b20cd82007-10-16 23:25:39 -07001950 elf_fpxregset_t xfpu; /* ELF_CORE_XFPREG_TYPE */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001951#endif
1952 struct memelfnote notes[3];
1953 int num_notes;
1954};
1955
1956/*
1957 * In order to add the specific thread information for the elf file format,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001958 * we need to keep a linked list of every threads pr_status and then create
1959 * a single section for them in the final core file.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001960 */
1961static int elf_dump_thread_status(long signr, struct elf_thread_status *t)
1962{
1963 int sz = 0;
1964 struct task_struct *p = t->thread;
1965 t->num_notes = 0;
1966
1967 fill_prstatus(&t->prstatus, p, signr);
1968 elf_core_copy_task_regs(p, &t->prstatus.pr_reg);
1969
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001970 fill_note(&t->notes[0], "CORE", NT_PRSTATUS, sizeof(t->prstatus),
1971 &(t->prstatus));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001972 t->num_notes++;
1973 sz += notesize(&t->notes[0]);
1974
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001975 if ((t->prstatus.pr_fpvalid = elf_core_copy_task_fpregs(p, NULL,
1976 &t->fpu))) {
1977 fill_note(&t->notes[1], "CORE", NT_PRFPREG, sizeof(t->fpu),
1978 &(t->fpu));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001979 t->num_notes++;
1980 sz += notesize(&t->notes[1]);
1981 }
1982
1983#ifdef ELF_CORE_COPY_XFPREGS
1984 if (elf_core_copy_task_xfpregs(p, &t->xfpu)) {
Mark Nelson5b20cd82007-10-16 23:25:39 -07001985 fill_note(&t->notes[2], "LINUX", ELF_CORE_XFPREG_TYPE,
1986 sizeof(t->xfpu), &t->xfpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001987 t->num_notes++;
1988 sz += notesize(&t->notes[2]);
1989 }
1990#endif
1991 return sz;
1992}
1993
Roland McGrath3aba4812008-01-30 13:31:44 +01001994struct elf_note_info {
1995 struct memelfnote *notes;
Dan Aloni72023652013-09-30 13:45:02 -07001996 struct memelfnote *notes_files;
Roland McGrath3aba4812008-01-30 13:31:44 +01001997 struct elf_prstatus *prstatus; /* NT_PRSTATUS */
1998 struct elf_prpsinfo *psinfo; /* NT_PRPSINFO */
1999 struct list_head thread_list;
2000 elf_fpregset_t *fpu;
2001#ifdef ELF_CORE_COPY_XFPREGS
2002 elf_fpxregset_t *xfpu;
2003#endif
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07002004 user_siginfo_t csigdata;
Roland McGrath3aba4812008-01-30 13:31:44 +01002005 int thread_status_size;
2006 int numnote;
2007};
2008
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002009static int elf_note_info_init(struct elf_note_info *info)
Roland McGrath3aba4812008-01-30 13:31:44 +01002010{
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002011 memset(info, 0, sizeof(*info));
Roland McGrath3aba4812008-01-30 13:31:44 +01002012 INIT_LIST_HEAD(&info->thread_list);
2013
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07002014 /* Allocate space for ELF notes */
Kees Cook6da2ec52018-06-12 13:55:00 -07002015 info->notes = kmalloc_array(8, sizeof(struct memelfnote), GFP_KERNEL);
Roland McGrath3aba4812008-01-30 13:31:44 +01002016 if (!info->notes)
2017 return 0;
2018 info->psinfo = kmalloc(sizeof(*info->psinfo), GFP_KERNEL);
2019 if (!info->psinfo)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002020 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002021 info->prstatus = kmalloc(sizeof(*info->prstatus), GFP_KERNEL);
2022 if (!info->prstatus)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002023 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002024 info->fpu = kmalloc(sizeof(*info->fpu), GFP_KERNEL);
2025 if (!info->fpu)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002026 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002027#ifdef ELF_CORE_COPY_XFPREGS
2028 info->xfpu = kmalloc(sizeof(*info->xfpu), GFP_KERNEL);
2029 if (!info->xfpu)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002030 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002031#endif
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002032 return 1;
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002033}
Roland McGrath3aba4812008-01-30 13:31:44 +01002034
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002035static int fill_note_info(struct elfhdr *elf, int phdrs,
2036 struct elf_note_info *info,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02002037 const kernel_siginfo_t *siginfo, struct pt_regs *regs)
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002038{
Al Viroafabada2013-10-14 07:39:56 -04002039 struct core_thread *ct;
2040 struct elf_thread_status *ets;
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002041
2042 if (!elf_note_info_init(info))
2043 return 0;
2044
Al Viroafabada2013-10-14 07:39:56 -04002045 for (ct = current->mm->core_state->dumper.next;
2046 ct; ct = ct->next) {
2047 ets = kzalloc(sizeof(*ets), GFP_KERNEL);
2048 if (!ets)
2049 return 0;
Oleg Nesterov24d52882008-07-25 01:47:40 -07002050
Al Viroafabada2013-10-14 07:39:56 -04002051 ets->thread = ct->task;
2052 list_add(&ets->list, &info->thread_list);
2053 }
Oleg Nesterov83914442008-07-25 01:47:45 -07002054
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002055 list_for_each_entry(ets, &info->thread_list, list) {
Al Viroafabada2013-10-14 07:39:56 -04002056 int sz;
Oleg Nesterov83914442008-07-25 01:47:45 -07002057
Al Viroafabada2013-10-14 07:39:56 -04002058 sz = elf_dump_thread_status(siginfo->si_signo, ets);
2059 info->thread_status_size += sz;
Roland McGrath3aba4812008-01-30 13:31:44 +01002060 }
2061 /* now collect the dump for the current */
2062 memset(info->prstatus, 0, sizeof(*info->prstatus));
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07002063 fill_prstatus(info->prstatus, current, siginfo->si_signo);
Roland McGrath3aba4812008-01-30 13:31:44 +01002064 elf_core_copy_regs(&info->prstatus->pr_reg, regs);
2065
2066 /* Set up header */
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08002067 fill_elf_header(elf, phdrs, ELF_ARCH, ELF_CORE_EFLAGS);
Roland McGrath3aba4812008-01-30 13:31:44 +01002068
2069 /*
2070 * Set up the notes in similar form to SVR4 core dumps made
2071 * with info from their /proc.
2072 */
2073
2074 fill_note(info->notes + 0, "CORE", NT_PRSTATUS,
2075 sizeof(*info->prstatus), info->prstatus);
2076 fill_psinfo(info->psinfo, current->group_leader, current->mm);
2077 fill_note(info->notes + 1, "CORE", NT_PRPSINFO,
2078 sizeof(*info->psinfo), info->psinfo);
2079
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07002080 fill_siginfo_note(info->notes + 2, &info->csigdata, siginfo);
2081 fill_auxv_note(info->notes + 3, current->mm);
Dan Aloni72023652013-09-30 13:45:02 -07002082 info->numnote = 4;
Roland McGrath3aba4812008-01-30 13:31:44 +01002083
Dan Aloni72023652013-09-30 13:45:02 -07002084 if (fill_files_note(info->notes + info->numnote) == 0) {
2085 info->notes_files = info->notes + info->numnote;
2086 info->numnote++;
2087 }
Roland McGrath3aba4812008-01-30 13:31:44 +01002088
2089 /* Try to dump the FPU. */
2090 info->prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, regs,
2091 info->fpu);
2092 if (info->prstatus->pr_fpvalid)
2093 fill_note(info->notes + info->numnote++,
2094 "CORE", NT_PRFPREG, sizeof(*info->fpu), info->fpu);
2095#ifdef ELF_CORE_COPY_XFPREGS
2096 if (elf_core_copy_task_xfpregs(current, info->xfpu))
2097 fill_note(info->notes + info->numnote++,
2098 "LINUX", ELF_CORE_XFPREG_TYPE,
2099 sizeof(*info->xfpu), info->xfpu);
2100#endif
2101
2102 return 1;
Roland McGrath3aba4812008-01-30 13:31:44 +01002103}
2104
2105static size_t get_note_info_size(struct elf_note_info *info)
2106{
2107 int sz = 0;
2108 int i;
2109
2110 for (i = 0; i < info->numnote; i++)
2111 sz += notesize(info->notes + i);
2112
2113 sz += info->thread_status_size;
2114
2115 return sz;
2116}
2117
2118static int write_note_info(struct elf_note_info *info,
Al Viroecc8c772013-10-05 15:32:35 -04002119 struct coredump_params *cprm)
Roland McGrath3aba4812008-01-30 13:31:44 +01002120{
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002121 struct elf_thread_status *ets;
Roland McGrath3aba4812008-01-30 13:31:44 +01002122 int i;
Roland McGrath3aba4812008-01-30 13:31:44 +01002123
2124 for (i = 0; i < info->numnote; i++)
Al Viroecc8c772013-10-05 15:32:35 -04002125 if (!writenote(info->notes + i, cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002126 return 0;
2127
2128 /* write out the thread status notes section */
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002129 list_for_each_entry(ets, &info->thread_list, list) {
2130 for (i = 0; i < ets->num_notes; i++)
2131 if (!writenote(&ets->notes[i], cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002132 return 0;
2133 }
2134
2135 return 1;
2136}
2137
2138static void free_note_info(struct elf_note_info *info)
2139{
2140 while (!list_empty(&info->thread_list)) {
2141 struct list_head *tmp = info->thread_list.next;
2142 list_del(tmp);
2143 kfree(list_entry(tmp, struct elf_thread_status, list));
2144 }
2145
Dan Aloni72023652013-09-30 13:45:02 -07002146 /* Free data possibly allocated by fill_files_note(): */
2147 if (info->notes_files)
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002148 kvfree(info->notes_files->data);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07002149
Roland McGrath3aba4812008-01-30 13:31:44 +01002150 kfree(info->prstatus);
2151 kfree(info->psinfo);
2152 kfree(info->notes);
2153 kfree(info->fpu);
2154#ifdef ELF_CORE_COPY_XFPREGS
2155 kfree(info->xfpu);
2156#endif
2157}
2158
Roland McGrath4206d3a2008-01-30 13:31:45 +01002159#endif
2160
Roland McGrathf47aef52007-01-26 00:56:49 -08002161static struct vm_area_struct *first_vma(struct task_struct *tsk,
2162 struct vm_area_struct *gate_vma)
2163{
2164 struct vm_area_struct *ret = tsk->mm->mmap;
2165
2166 if (ret)
2167 return ret;
2168 return gate_vma;
2169}
2170/*
2171 * Helper function for iterating across a vma list. It ensures that the caller
2172 * will visit `gate_vma' prior to terminating the search.
2173 */
2174static struct vm_area_struct *next_vma(struct vm_area_struct *this_vma,
2175 struct vm_area_struct *gate_vma)
2176{
2177 struct vm_area_struct *ret;
2178
2179 ret = this_vma->vm_next;
2180 if (ret)
2181 return ret;
2182 if (this_vma == gate_vma)
2183 return NULL;
2184 return gate_vma;
2185}
2186
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002187static void fill_extnum_info(struct elfhdr *elf, struct elf_shdr *shdr4extnum,
2188 elf_addr_t e_shoff, int segs)
2189{
2190 elf->e_shoff = e_shoff;
2191 elf->e_shentsize = sizeof(*shdr4extnum);
2192 elf->e_shnum = 1;
2193 elf->e_shstrndx = SHN_UNDEF;
2194
2195 memset(shdr4extnum, 0, sizeof(*shdr4extnum));
2196
2197 shdr4extnum->sh_type = SHT_NULL;
2198 shdr4extnum->sh_size = elf->e_shnum;
2199 shdr4extnum->sh_link = elf->e_shstrndx;
2200 shdr4extnum->sh_info = segs;
2201}
2202
Linus Torvalds1da177e2005-04-16 15:20:36 -07002203/*
2204 * Actual dumper
2205 *
2206 * This is a two-pass process; first we find the offsets of the bits,
2207 * and then they are actually written out. If we run out of core limit
2208 * we just truncate.
2209 */
Masami Hiramatsuf6151df2009-12-17 15:27:16 -08002210static int elf_core_dump(struct coredump_params *cprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002211{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002212 int has_dumped = 0;
2213 mm_segment_t fs;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002214 int segs, i;
2215 size_t vma_data_size = 0;
Roland McGrathf47aef52007-01-26 00:56:49 -08002216 struct vm_area_struct *vma, *gate_vma;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002217 struct elfhdr *elf = NULL;
Al Virocdc3d562013-10-05 22:24:29 -04002218 loff_t offset = 0, dataoff;
Dan Aloni72023652013-09-30 13:45:02 -07002219 struct elf_note_info info = { };
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002220 struct elf_phdr *phdr4note = NULL;
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002221 struct elf_shdr *shdr4extnum = NULL;
2222 Elf_Half e_phnum;
2223 elf_addr_t e_shoff;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002224 elf_addr_t *vma_filesz = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002225
2226 /*
2227 * We no longer stop all VM operations.
2228 *
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002229 * This is because those proceses that could possibly change map_count
2230 * or the mmap / vma pages are now blocked in do_exit on current
2231 * finishing this core dump.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002232 *
2233 * Only ptrace can touch these memory addresses, but it doesn't change
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002234 * the map_count or the pages allocated. So no possibility of crashing
Linus Torvalds1da177e2005-04-16 15:20:36 -07002235 * exists while dumping the mm->vm_next areas to the core file.
2236 */
2237
2238 /* alloc memory for large data structures: too large to be on stack */
2239 elf = kmalloc(sizeof(*elf), GFP_KERNEL);
2240 if (!elf)
WANG Cong5f719552008-05-06 12:45:35 +08002241 goto out;
KAMEZAWA Hiroyuki341c87b2009-06-30 11:41:23 -07002242 /*
2243 * The number of segs are recored into ELF header as 16bit value.
2244 * Please check DEFAULT_MAX_MAP_COUNT definition when you modify here.
2245 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002246 segs = current->mm->map_count;
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002247 segs += elf_core_extra_phdrs();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002248
Stephen Wilson31db58b2011-03-13 15:49:15 -04002249 gate_vma = get_gate_vma(current->mm);
Roland McGrathf47aef52007-01-26 00:56:49 -08002250 if (gate_vma != NULL)
2251 segs++;
2252
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002253 /* for notes section */
2254 segs++;
2255
2256 /* If segs > PN_XNUM(0xffff), then e_phnum overflows. To avoid
2257 * this, kernel supports extended numbering. Have a look at
2258 * include/linux/elf.h for further information. */
2259 e_phnum = segs > PN_XNUM ? PN_XNUM : segs;
2260
Roland McGrath3aba4812008-01-30 13:31:44 +01002261 /*
2262 * Collect all the non-memory information about the process for the
2263 * notes. This also sets up the file header.
2264 */
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07002265 if (!fill_note_info(elf, e_phnum, &info, cprm->siginfo, cprm->regs))
Roland McGrath3aba4812008-01-30 13:31:44 +01002266 goto cleanup;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002267
2268 has_dumped = 1;
Oleg Nesterov079148b2013-04-30 15:28:16 -07002269
Linus Torvalds1da177e2005-04-16 15:20:36 -07002270 fs = get_fs();
2271 set_fs(KERNEL_DS);
2272
Linus Torvalds1da177e2005-04-16 15:20:36 -07002273 offset += sizeof(*elf); /* Elf header */
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002274 offset += segs * sizeof(struct elf_phdr); /* Program headers */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002275
2276 /* Write notes phdr entry */
2277 {
Roland McGrath3aba4812008-01-30 13:31:44 +01002278 size_t sz = get_note_info_size(&info);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002279
Michael Ellermane5501492007-09-19 14:38:12 +10002280 sz += elf_coredump_extra_notes_size();
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +01002281
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002282 phdr4note = kmalloc(sizeof(*phdr4note), GFP_KERNEL);
2283 if (!phdr4note)
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -08002284 goto end_coredump;
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002285
2286 fill_elf_note_phdr(phdr4note, sz, offset);
2287 offset += sz;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002288 }
2289
Linus Torvalds1da177e2005-04-16 15:20:36 -07002290 dataoff = offset = roundup(offset, ELF_EXEC_PAGESIZE);
2291
Jason Baron30f74aa2016-12-12 16:46:40 -08002292 if (segs - 1 > ULONG_MAX / sizeof(*vma_filesz))
2293 goto end_coredump;
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002294 vma_filesz = kvmalloc(array_size(sizeof(*vma_filesz), (segs - 1)),
2295 GFP_KERNEL);
2296 if (ZERO_OR_NULL_PTR(vma_filesz))
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002297 goto end_coredump;
2298
2299 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
2300 vma = next_vma(vma, gate_vma)) {
2301 unsigned long dump_size;
2302
2303 dump_size = vma_dump_size(vma, cprm->mm_flags);
2304 vma_filesz[i++] = dump_size;
2305 vma_data_size += dump_size;
2306 }
2307
2308 offset += vma_data_size;
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002309 offset += elf_core_extra_data_size();
2310 e_shoff = offset;
2311
2312 if (e_phnum == PN_XNUM) {
2313 shdr4extnum = kmalloc(sizeof(*shdr4extnum), GFP_KERNEL);
2314 if (!shdr4extnum)
2315 goto end_coredump;
2316 fill_extnum_info(elf, shdr4extnum, e_shoff, segs);
2317 }
2318
2319 offset = dataoff;
2320
Al Viroecc8c772013-10-05 15:32:35 -04002321 if (!dump_emit(cprm, elf, sizeof(*elf)))
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002322 goto end_coredump;
2323
Al Viroecc8c772013-10-05 15:32:35 -04002324 if (!dump_emit(cprm, phdr4note, sizeof(*phdr4note)))
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002325 goto end_coredump;
2326
Linus Torvalds1da177e2005-04-16 15:20:36 -07002327 /* Write program headers for segments dump */
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002328 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
Roland McGrathf47aef52007-01-26 00:56:49 -08002329 vma = next_vma(vma, gate_vma)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002330 struct elf_phdr phdr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002331
2332 phdr.p_type = PT_LOAD;
2333 phdr.p_offset = offset;
2334 phdr.p_vaddr = vma->vm_start;
2335 phdr.p_paddr = 0;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002336 phdr.p_filesz = vma_filesz[i++];
Roland McGrath82df3972007-10-16 23:27:02 -07002337 phdr.p_memsz = vma->vm_end - vma->vm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002338 offset += phdr.p_filesz;
2339 phdr.p_flags = vma->vm_flags & VM_READ ? PF_R : 0;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002340 if (vma->vm_flags & VM_WRITE)
2341 phdr.p_flags |= PF_W;
2342 if (vma->vm_flags & VM_EXEC)
2343 phdr.p_flags |= PF_X;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002344 phdr.p_align = ELF_EXEC_PAGESIZE;
2345
Al Viroecc8c772013-10-05 15:32:35 -04002346 if (!dump_emit(cprm, &phdr, sizeof(phdr)))
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -08002347 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002348 }
2349
Al Viro506f21c2013-10-05 17:22:57 -04002350 if (!elf_core_write_extra_phdrs(cprm, offset))
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002351 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002352
2353 /* write out the notes section */
Al Viroecc8c772013-10-05 15:32:35 -04002354 if (!write_note_info(&info, cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002355 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002356
Al Virocdc3d562013-10-05 22:24:29 -04002357 if (elf_coredump_extra_notes_write(cprm))
Michael Ellermane5501492007-09-19 14:38:12 +10002358 goto end_coredump;
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +01002359
Andi Kleend025c9d2006-09-30 23:29:28 -07002360 /* Align to page */
Mateusz Guzik1607f092016-06-05 23:14:14 +02002361 if (!dump_skip(cprm, dataoff - cprm->pos))
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002362 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002363
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002364 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
Roland McGrathf47aef52007-01-26 00:56:49 -08002365 vma = next_vma(vma, gate_vma)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002366 unsigned long addr;
Roland McGrath82df3972007-10-16 23:27:02 -07002367 unsigned long end;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002368
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002369 end = vma->vm_start + vma_filesz[i++];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002370
Roland McGrath82df3972007-10-16 23:27:02 -07002371 for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002372 struct page *page;
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002373 int stop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002374
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002375 page = get_dump_page(addr);
2376 if (page) {
2377 void *kaddr = kmap(page);
Al Viro13046ec2013-10-05 18:08:47 -04002378 stop = !dump_emit(cprm, kaddr, PAGE_SIZE);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002379 kunmap(page);
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03002380 put_page(page);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002381 } else
Al Viro9b56d542013-10-08 09:26:08 -04002382 stop = !dump_skip(cprm, PAGE_SIZE);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002383 if (stop)
2384 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002385 }
2386 }
Dave Kleikamp4d22c752017-01-11 13:25:00 -06002387 dump_truncate(cprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002388
Al Viroaa3e7ea2013-10-05 17:50:15 -04002389 if (!elf_core_write_extra_data(cprm))
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002390 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002391
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002392 if (e_phnum == PN_XNUM) {
Al Viro13046ec2013-10-05 18:08:47 -04002393 if (!dump_emit(cprm, shdr4extnum, sizeof(*shdr4extnum)))
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002394 goto end_coredump;
2395 }
2396
Linus Torvalds1da177e2005-04-16 15:20:36 -07002397end_coredump:
2398 set_fs(fs);
2399
2400cleanup:
Roland McGrath3aba4812008-01-30 13:31:44 +01002401 free_note_info(&info);
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002402 kfree(shdr4extnum);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002403 kvfree(vma_filesz);
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002404 kfree(phdr4note);
WANG Cong5f719552008-05-06 12:45:35 +08002405 kfree(elf);
2406out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002407 return has_dumped;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002408}
2409
Christoph Hellwig698ba7b2009-12-15 16:47:37 -08002410#endif /* CONFIG_ELF_CORE */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002411
2412static int __init init_elf_binfmt(void)
2413{
Al Viro8fc3dc52012-03-17 03:05:16 -04002414 register_binfmt(&elf_format);
2415 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002416}
2417
2418static void __exit exit_elf_binfmt(void)
2419{
2420 /* Remove the COFF and ELF loaders. */
2421 unregister_binfmt(&elf_format);
2422}
2423
2424core_initcall(init_elf_binfmt);
2425module_exit(exit_elf_binfmt);
2426MODULE_LICENSE("GPL");