blob: 8264b468f2831ff34ed3c381f759f04c8bbcc7c8 [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 /* N.B. passed_fileno might not be initialized? */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001131 current->mm->end_code = end_code;
1132 current->mm->start_code = start_code;
1133 current->mm->start_data = start_data;
1134 current->mm->end_data = end_data;
1135 current->mm->start_stack = bprm->p;
1136
Jiri Kosina4471a672011-04-14 15:22:09 -07001137 if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1)) {
Kees Cookbbdc6072019-05-14 15:43:57 -07001138 /*
1139 * For architectures with ELF randomization, when executing
1140 * a loader directly (i.e. no interpreter listed in ELF
1141 * headers), move the brk area out of the mmap region
1142 * (since it grows up, and may collide early with the stack
1143 * growing down), and into the unused ELF_ET_DYN_BASE region.
1144 */
1145 if (IS_ENABLED(CONFIG_ARCH_HAS_ELF_RANDOMIZE) && !interpreter)
1146 current->mm->brk = current->mm->start_brk =
1147 ELF_ET_DYN_BASE;
1148
Jiri Kosinac1d171a2008-01-30 13:30:40 +01001149 current->mm->brk = current->mm->start_brk =
1150 arch_randomize_brk(current->mm);
Kees Cook204db6e2015-04-14 15:48:12 -07001151#ifdef compat_brk_randomized
Jiri Kosina4471a672011-04-14 15:22:09 -07001152 current->brk_randomized = 1;
1153#endif
1154 }
Jiri Kosinac1d171a2008-01-30 13:30:40 +01001155
Linus Torvalds1da177e2005-04-16 15:20:36 -07001156 if (current->personality & MMAP_PAGE_ZERO) {
1157 /* Why this, you ask??? Well SVr4 maps page 0 as read-only,
1158 and some applications "depend" upon this behavior.
1159 Since we do not have the power to recompile these, we
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001160 emulate the SVr4 behavior. Sigh. */
Linus Torvalds6be5ceb2012-04-20 17:13:58 -07001161 error = vm_mmap(NULL, 0, PAGE_SIZE, PROT_READ | PROT_EXEC,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001162 MAP_FIXED | MAP_PRIVATE, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163 }
1164
Alexey Dobriyan249b08e2019-05-14 15:43:54 -07001165 regs = current_pt_regs();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001166#ifdef ELF_PLAT_INIT
1167 /*
1168 * The ABI may specify that certain registers be set up in special
1169 * ways (on i386 %edx is the address of a DT_FINI function, for
1170 * example. In addition, it may also specify (eg, PowerPC64 ELF)
1171 * that the e_entry field is the address of the function descriptor
1172 * for the startup routine, rather than the address of the startup
1173 * routine itself. This macro performs whatever initialization to
1174 * the regs structure is required as well as any relocations to the
1175 * function descriptor entries when executing dynamically links apps.
1176 */
1177 ELF_PLAT_INIT(regs, reloc_func_desc);
1178#endif
1179
Kees Cookb8383832018-04-10 16:34:57 -07001180 finalize_exec(bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001181 start_thread(regs, elf_entry, bprm->p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001182 retval = 0;
1183out:
1184 kfree(loc);
1185out_ret:
1186 return retval;
1187
1188 /* error cleanup */
1189out_free_dentry:
Paul Burtona9d9ef12014-09-11 08:30:15 +01001190 kfree(interp_elf_phdata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001191 allow_write_access(interpreter);
1192 if (interpreter)
1193 fput(interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001194out_free_ph:
1195 kfree(elf_phdata);
1196 goto out;
1197}
1198
Josh Triplett69369a72014-04-03 14:48:27 -07001199#ifdef CONFIG_USELIB
Linus Torvalds1da177e2005-04-16 15:20:36 -07001200/* This is really simpleminded and specialized - we are loading an
1201 a.out library that is given an ELF header. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001202static int load_elf_library(struct file *file)
1203{
1204 struct elf_phdr *elf_phdata;
1205 struct elf_phdr *eppnt;
1206 unsigned long elf_bss, bss, len;
1207 int retval, error, i, j;
1208 struct elfhdr elf_ex;
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +02001209 loff_t pos = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001210
1211 error = -ENOEXEC;
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +02001212 retval = kernel_read(file, &elf_ex, sizeof(elf_ex), &pos);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001213 if (retval != sizeof(elf_ex))
1214 goto out;
1215
1216 if (memcmp(elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
1217 goto out;
1218
1219 /* First of all, some simple consistency checks */
1220 if (elf_ex.e_type != ET_EXEC || elf_ex.e_phnum > 2 ||
Al Viro72c2d532013-09-22 16:27:52 -04001221 !elf_check_arch(&elf_ex) || !file->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001222 goto out;
Nicolas Pitre47552002017-08-16 16:05:13 -04001223 if (elf_check_fdpic(&elf_ex))
1224 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001225
1226 /* Now read in all of the header information */
1227
1228 j = sizeof(struct elf_phdr) * elf_ex.e_phnum;
1229 /* j < ELF_MIN_ALIGN because elf_ex.e_phnum <= 2 */
1230
1231 error = -ENOMEM;
1232 elf_phdata = kmalloc(j, GFP_KERNEL);
1233 if (!elf_phdata)
1234 goto out;
1235
1236 eppnt = elf_phdata;
1237 error = -ENOEXEC;
Christoph Hellwigbdd1d2d2017-09-01 17:39:13 +02001238 pos = elf_ex.e_phoff;
1239 retval = kernel_read(file, eppnt, j, &pos);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001240 if (retval != j)
1241 goto out_free_ph;
1242
1243 for (j = 0, i = 0; i<elf_ex.e_phnum; i++)
1244 if ((eppnt + i)->p_type == PT_LOAD)
1245 j++;
1246 if (j != 1)
1247 goto out_free_ph;
1248
1249 while (eppnt->p_type != PT_LOAD)
1250 eppnt++;
1251
1252 /* Now use mmap to map the library into memory. */
Linus Torvalds6be5ceb2012-04-20 17:13:58 -07001253 error = vm_mmap(file,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001254 ELF_PAGESTART(eppnt->p_vaddr),
1255 (eppnt->p_filesz +
1256 ELF_PAGEOFFSET(eppnt->p_vaddr)),
1257 PROT_READ | PROT_WRITE | PROT_EXEC,
Michal Hocko4ed28632018-04-10 16:36:01 -07001258 MAP_FIXED_NOREPLACE | MAP_PRIVATE | MAP_DENYWRITE,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001259 (eppnt->p_offset -
1260 ELF_PAGEOFFSET(eppnt->p_vaddr)));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001261 if (error != ELF_PAGESTART(eppnt->p_vaddr))
1262 goto out_free_ph;
1263
1264 elf_bss = eppnt->p_vaddr + eppnt->p_filesz;
1265 if (padzero(elf_bss)) {
1266 error = -EFAULT;
1267 goto out_free_ph;
1268 }
1269
Oscar Salvador24962af2018-07-13 16:59:13 -07001270 len = ELF_PAGEALIGN(eppnt->p_filesz + eppnt->p_vaddr);
1271 bss = ELF_PAGEALIGN(eppnt->p_memsz + eppnt->p_vaddr);
Michal Hockoecc2bc82016-05-23 16:25:39 -07001272 if (bss > len) {
1273 error = vm_brk(len, bss - len);
Linus Torvalds5d22fc22016-05-27 15:57:31 -07001274 if (error)
Michal Hockoecc2bc82016-05-23 16:25:39 -07001275 goto out_free_ph;
1276 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001277 error = 0;
1278
1279out_free_ph:
1280 kfree(elf_phdata);
1281out:
1282 return error;
1283}
Josh Triplett69369a72014-04-03 14:48:27 -07001284#endif /* #ifdef CONFIG_USELIB */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001285
Christoph Hellwig698ba7b2009-12-15 16:47:37 -08001286#ifdef CONFIG_ELF_CORE
Linus Torvalds1da177e2005-04-16 15:20:36 -07001287/*
1288 * ELF core dumper
1289 *
1290 * Modelled on fs/exec.c:aout_core_dump()
1291 * Jeremy Fitzhardinge <jeremy@sw.oz.au>
1292 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001293
1294/*
Jason Baron909af762012-03-23 15:02:51 -07001295 * The purpose of always_dump_vma() is to make sure that special kernel mappings
1296 * that are useful for post-mortem analysis are included in every core dump.
1297 * In that way we ensure that the core dump is fully interpretable later
1298 * without matching up the same kernel and hardware config to see what PC values
1299 * meant. These special mappings include - vDSO, vsyscall, and other
1300 * architecture specific mappings
1301 */
1302static bool always_dump_vma(struct vm_area_struct *vma)
1303{
1304 /* Any vsyscall mappings? */
1305 if (vma == get_gate_vma(vma->vm_mm))
1306 return true;
Andy Lutomirski78d683e2014-05-19 15:58:32 -07001307
1308 /*
1309 * Assume that all vmas with a .name op should always be dumped.
1310 * If this changes, a new vm_ops field can easily be added.
1311 */
1312 if (vma->vm_ops && vma->vm_ops->name && vma->vm_ops->name(vma))
1313 return true;
1314
Jason Baron909af762012-03-23 15:02:51 -07001315 /*
1316 * arch_vma_name() returns non-NULL for special architecture mappings,
1317 * such as vDSO sections.
1318 */
1319 if (arch_vma_name(vma))
1320 return true;
1321
1322 return false;
1323}
1324
1325/*
Roland McGrath82df3972007-10-16 23:27:02 -07001326 * Decide what to dump of a segment, part, all or none.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001327 */
Roland McGrath82df3972007-10-16 23:27:02 -07001328static unsigned long vma_dump_size(struct vm_area_struct *vma,
1329 unsigned long mm_flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001330{
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001331#define FILTER(type) (mm_flags & (1UL << MMF_DUMP_##type))
1332
Jason Baron909af762012-03-23 15:02:51 -07001333 /* always dump the vdso and vsyscall sections */
1334 if (always_dump_vma(vma))
Roland McGrath82df3972007-10-16 23:27:02 -07001335 goto whole;
Roland McGrathe5b97dd2007-01-26 00:56:48 -08001336
Konstantin Khlebnikov0103bd12012-10-08 16:28:59 -07001337 if (vma->vm_flags & VM_DONTDUMP)
Jason Baronaccb61f2012-03-23 15:02:51 -07001338 return 0;
1339
Ross Zwisler50378352015-10-05 16:33:36 -06001340 /* support for DAX */
1341 if (vma_is_dax(vma)) {
1342 if ((vma->vm_flags & VM_SHARED) && FILTER(DAX_SHARED))
1343 goto whole;
1344 if (!(vma->vm_flags & VM_SHARED) && FILTER(DAX_PRIVATE))
1345 goto whole;
1346 return 0;
1347 }
1348
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001349 /* Hugetlb memory check */
1350 if (vma->vm_flags & VM_HUGETLB) {
1351 if ((vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_SHARED))
1352 goto whole;
1353 if (!(vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_PRIVATE))
1354 goto whole;
Naoya Horiguchi23d9e482013-04-17 15:58:28 -07001355 return 0;
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001356 }
1357
Linus Torvalds1da177e2005-04-16 15:20:36 -07001358 /* Do not dump I/O mapped devices or special mappings */
Konstantin Khlebnikov314e51b2012-10-08 16:29:02 -07001359 if (vma->vm_flags & VM_IO)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001360 return 0;
1361
Kawai, Hidehiroa1b59e82007-07-19 01:48:29 -07001362 /* By default, dump shared memory if mapped from an anonymous file. */
1363 if (vma->vm_flags & VM_SHARED) {
Al Viro496ad9a2013-01-23 17:07:38 -05001364 if (file_inode(vma->vm_file)->i_nlink == 0 ?
Roland McGrath82df3972007-10-16 23:27:02 -07001365 FILTER(ANON_SHARED) : FILTER(MAPPED_SHARED))
1366 goto whole;
1367 return 0;
Kawai, Hidehiroa1b59e82007-07-19 01:48:29 -07001368 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001369
Roland McGrath82df3972007-10-16 23:27:02 -07001370 /* Dump segments that have been written to. */
1371 if (vma->anon_vma && FILTER(ANON_PRIVATE))
1372 goto whole;
1373 if (vma->vm_file == NULL)
1374 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001375
Roland McGrath82df3972007-10-16 23:27:02 -07001376 if (FILTER(MAPPED_PRIVATE))
1377 goto whole;
1378
1379 /*
1380 * If this looks like the beginning of a DSO or executable mapping,
1381 * check for an ELF header. If we find one, dump the first page to
1382 * aid in determining what was mapped here.
1383 */
Roland McGrath92dc07b2009-02-06 17:34:07 -08001384 if (FILTER(ELF_HEADERS) &&
1385 vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) {
Roland McGrath82df3972007-10-16 23:27:02 -07001386 u32 __user *header = (u32 __user *) vma->vm_start;
1387 u32 word;
Roland McGrath92dc07b2009-02-06 17:34:07 -08001388 mm_segment_t fs = get_fs();
Roland McGrath82df3972007-10-16 23:27:02 -07001389 /*
1390 * Doing it this way gets the constant folded by GCC.
1391 */
1392 union {
1393 u32 cmp;
1394 char elfmag[SELFMAG];
1395 } magic;
1396 BUILD_BUG_ON(SELFMAG != sizeof word);
1397 magic.elfmag[EI_MAG0] = ELFMAG0;
1398 magic.elfmag[EI_MAG1] = ELFMAG1;
1399 magic.elfmag[EI_MAG2] = ELFMAG2;
1400 magic.elfmag[EI_MAG3] = ELFMAG3;
Roland McGrath92dc07b2009-02-06 17:34:07 -08001401 /*
1402 * Switch to the user "segment" for get_user(),
1403 * then put back what elf_core_dump() had in place.
1404 */
1405 set_fs(USER_DS);
1406 if (unlikely(get_user(word, header)))
1407 word = 0;
1408 set_fs(fs);
1409 if (word == magic.cmp)
Roland McGrath82df3972007-10-16 23:27:02 -07001410 return PAGE_SIZE;
1411 }
1412
1413#undef FILTER
1414
1415 return 0;
1416
1417whole:
1418 return vma->vm_end - vma->vm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001419}
1420
Linus Torvalds1da177e2005-04-16 15:20:36 -07001421/* An ELF note in memory */
1422struct memelfnote
1423{
1424 const char *name;
1425 int type;
1426 unsigned int datasz;
1427 void *data;
1428};
1429
1430static int notesize(struct memelfnote *en)
1431{
1432 int sz;
1433
1434 sz = sizeof(struct elf_note);
1435 sz += roundup(strlen(en->name) + 1, 4);
1436 sz += roundup(en->datasz, 4);
1437
1438 return sz;
1439}
1440
Al Viroecc8c772013-10-05 15:32:35 -04001441static int writenote(struct memelfnote *men, struct coredump_params *cprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001442{
1443 struct elf_note en;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001444 en.n_namesz = strlen(men->name) + 1;
1445 en.n_descsz = men->datasz;
1446 en.n_type = men->type;
1447
Al Viroecc8c772013-10-05 15:32:35 -04001448 return dump_emit(cprm, &en, sizeof(en)) &&
Al Viro22a8cb82013-10-08 11:05:01 -04001449 dump_emit(cprm, men->name, en.n_namesz) && dump_align(cprm, 4) &&
1450 dump_emit(cprm, men->data, men->datasz) && dump_align(cprm, 4);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001451}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001452
Roland McGrath3aba4812008-01-30 13:31:44 +01001453static void fill_elf_header(struct elfhdr *elf, int segs,
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001454 u16 machine, u32 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001455{
Cyrill Gorcunov6970c8e2008-04-29 01:01:18 -07001456 memset(elf, 0, sizeof(*elf));
1457
Linus Torvalds1da177e2005-04-16 15:20:36 -07001458 memcpy(elf->e_ident, ELFMAG, SELFMAG);
1459 elf->e_ident[EI_CLASS] = ELF_CLASS;
1460 elf->e_ident[EI_DATA] = ELF_DATA;
1461 elf->e_ident[EI_VERSION] = EV_CURRENT;
1462 elf->e_ident[EI_OSABI] = ELF_OSABI;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001463
1464 elf->e_type = ET_CORE;
Roland McGrath3aba4812008-01-30 13:31:44 +01001465 elf->e_machine = machine;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001466 elf->e_version = EV_CURRENT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001467 elf->e_phoff = sizeof(struct elfhdr);
Roland McGrath3aba4812008-01-30 13:31:44 +01001468 elf->e_flags = flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001469 elf->e_ehsize = sizeof(struct elfhdr);
1470 elf->e_phentsize = sizeof(struct elf_phdr);
1471 elf->e_phnum = segs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001472}
1473
Andrew Morton8d6b5eee2006-09-25 23:32:04 -07001474static void fill_elf_note_phdr(struct elf_phdr *phdr, int sz, loff_t offset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001475{
1476 phdr->p_type = PT_NOTE;
1477 phdr->p_offset = offset;
1478 phdr->p_vaddr = 0;
1479 phdr->p_paddr = 0;
1480 phdr->p_filesz = sz;
1481 phdr->p_memsz = 0;
1482 phdr->p_flags = 0;
1483 phdr->p_align = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001484}
1485
1486static void fill_note(struct memelfnote *note, const char *name, int type,
1487 unsigned int sz, void *data)
1488{
1489 note->name = name;
1490 note->type = type;
1491 note->datasz = sz;
1492 note->data = data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001493}
1494
1495/*
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001496 * fill up all the fields in prstatus from the given task struct, except
1497 * registers which need to be filled up separately.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001498 */
1499static void fill_prstatus(struct elf_prstatus *prstatus,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001500 struct task_struct *p, long signr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001501{
1502 prstatus->pr_info.si_signo = prstatus->pr_cursig = signr;
1503 prstatus->pr_sigpend = p->pending.signal.sig[0];
1504 prstatus->pr_sighold = p->blocked.sig[0];
Oleg Nesterov3b34fc52009-06-17 16:27:38 -07001505 rcu_read_lock();
1506 prstatus->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1507 rcu_read_unlock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001508 prstatus->pr_pid = task_pid_vnr(p);
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001509 prstatus->pr_pgrp = task_pgrp_vnr(p);
1510 prstatus->pr_sid = task_session_vnr(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001511 if (thread_group_leader(p)) {
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001512 struct task_cputime cputime;
Frank Mayharf06febc2008-09-12 09:54:39 -07001513
Linus Torvalds1da177e2005-04-16 15:20:36 -07001514 /*
Frank Mayharf06febc2008-09-12 09:54:39 -07001515 * This is the record for the group leader. It shows the
1516 * group-wide total, not its individual thread total.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001517 */
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001518 thread_group_cputime(p, &cputime);
1519 prstatus->pr_utime = ns_to_timeval(cputime.utime);
1520 prstatus->pr_stime = ns_to_timeval(cputime.stime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001521 } else {
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001522 u64 utime, stime;
Frederic Weisbecker6fac4822012-11-13 14:20:55 +01001523
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001524 task_cputime(p, &utime, &stime);
1525 prstatus->pr_utime = ns_to_timeval(utime);
1526 prstatus->pr_stime = ns_to_timeval(stime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001527 }
Frederic Weisbecker5613fda2017-01-31 04:09:23 +01001528
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001529 prstatus->pr_cutime = ns_to_timeval(p->signal->cutime);
1530 prstatus->pr_cstime = ns_to_timeval(p->signal->cstime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001531}
1532
1533static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p,
1534 struct mm_struct *mm)
1535{
David Howellsc69e8d92008-11-14 10:39:19 +11001536 const struct cred *cred;
Greg Kroah-Hartmana84a5052005-05-11 00:10:44 -07001537 unsigned int i, len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001538
1539 /* first copy the parameters from user space */
1540 memset(psinfo, 0, sizeof(struct elf_prpsinfo));
1541
1542 len = mm->arg_end - mm->arg_start;
1543 if (len >= ELF_PRARGSZ)
1544 len = ELF_PRARGSZ-1;
1545 if (copy_from_user(&psinfo->pr_psargs,
1546 (const char __user *)mm->arg_start, len))
1547 return -EFAULT;
1548 for(i = 0; i < len; i++)
1549 if (psinfo->pr_psargs[i] == 0)
1550 psinfo->pr_psargs[i] = ' ';
1551 psinfo->pr_psargs[len] = 0;
1552
Oleg Nesterov3b34fc52009-06-17 16:27:38 -07001553 rcu_read_lock();
1554 psinfo->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1555 rcu_read_unlock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001556 psinfo->pr_pid = task_pid_vnr(p);
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001557 psinfo->pr_pgrp = task_pgrp_vnr(p);
1558 psinfo->pr_sid = task_session_vnr(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001559
1560 i = p->state ? ffz(~p->state) + 1 : 0;
1561 psinfo->pr_state = i;
Carsten Otte55148542006-03-25 03:08:22 -08001562 psinfo->pr_sname = (i > 5) ? '.' : "RSDTZW"[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001563 psinfo->pr_zomb = psinfo->pr_sname == 'Z';
1564 psinfo->pr_nice = task_nice(p);
1565 psinfo->pr_flag = p->flags;
David Howellsc69e8d92008-11-14 10:39:19 +11001566 rcu_read_lock();
1567 cred = __task_cred(p);
Eric W. Biedermanebc887b2012-02-07 18:36:10 -08001568 SET_UID(psinfo->pr_uid, from_kuid_munged(cred->user_ns, cred->uid));
1569 SET_GID(psinfo->pr_gid, from_kgid_munged(cred->user_ns, cred->gid));
David Howellsc69e8d92008-11-14 10:39:19 +11001570 rcu_read_unlock();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001571 strncpy(psinfo->pr_fname, p->comm, sizeof(psinfo->pr_fname));
1572
1573 return 0;
1574}
1575
Roland McGrath3aba4812008-01-30 13:31:44 +01001576static void fill_auxv_note(struct memelfnote *note, struct mm_struct *mm)
1577{
1578 elf_addr_t *auxv = (elf_addr_t *) mm->saved_auxv;
1579 int i = 0;
1580 do
1581 i += 2;
1582 while (auxv[i - 2] != AT_NULL);
1583 fill_note(note, "CORE", NT_AUXV, i * sizeof(elf_addr_t), auxv);
1584}
1585
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001586static void fill_siginfo_note(struct memelfnote *note, user_siginfo_t *csigdata,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02001587 const kernel_siginfo_t *siginfo)
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001588{
1589 mm_segment_t old_fs = get_fs();
1590 set_fs(KERNEL_DS);
1591 copy_siginfo_to_user((user_siginfo_t __user *) csigdata, siginfo);
1592 set_fs(old_fs);
1593 fill_note(note, "CORE", NT_SIGINFO, sizeof(*csigdata), csigdata);
1594}
1595
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001596#define MAX_FILE_NOTE_SIZE (4*1024*1024)
1597/*
1598 * Format of NT_FILE note:
1599 *
1600 * long count -- how many files are mapped
1601 * long page_size -- units for file_ofs
1602 * array of [COUNT] elements of
1603 * long start
1604 * long end
1605 * long file_ofs
1606 * followed by COUNT filenames in ASCII: "FILE1" NUL "FILE2" NUL...
1607 */
Dan Aloni72023652013-09-30 13:45:02 -07001608static int fill_files_note(struct memelfnote *note)
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001609{
1610 struct vm_area_struct *vma;
1611 unsigned count, size, names_ofs, remaining, n;
1612 user_long_t *data;
1613 user_long_t *start_end_ofs;
1614 char *name_base, *name_curpos;
1615
1616 /* *Estimated* file count and total data size needed */
1617 count = current->mm->map_count;
Alexey Dobriyan60c9d922018-02-06 15:39:13 -08001618 if (count > UINT_MAX / 64)
1619 return -EINVAL;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001620 size = count * 64;
1621
1622 names_ofs = (2 + 3 * count) * sizeof(data[0]);
1623 alloc:
1624 if (size >= MAX_FILE_NOTE_SIZE) /* paranoia check */
Dan Aloni72023652013-09-30 13:45:02 -07001625 return -EINVAL;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001626 size = round_up(size, PAGE_SIZE);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001627 data = kvmalloc(size, GFP_KERNEL);
1628 if (ZERO_OR_NULL_PTR(data))
Dan Aloni72023652013-09-30 13:45:02 -07001629 return -ENOMEM;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001630
1631 start_end_ofs = data + 2;
1632 name_base = name_curpos = ((char *)data) + names_ofs;
1633 remaining = size - names_ofs;
1634 count = 0;
1635 for (vma = current->mm->mmap; vma != NULL; vma = vma->vm_next) {
1636 struct file *file;
1637 const char *filename;
1638
1639 file = vma->vm_file;
1640 if (!file)
1641 continue;
Miklos Szeredi9bf39ab2015-06-19 10:29:13 +02001642 filename = file_path(file, name_curpos, remaining);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001643 if (IS_ERR(filename)) {
1644 if (PTR_ERR(filename) == -ENAMETOOLONG) {
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001645 kvfree(data);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001646 size = size * 5 / 4;
1647 goto alloc;
1648 }
1649 continue;
1650 }
1651
Miklos Szeredi9bf39ab2015-06-19 10:29:13 +02001652 /* file_path() fills at the end, move name down */
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001653 /* n = strlen(filename) + 1: */
1654 n = (name_curpos + remaining) - filename;
1655 remaining = filename - name_curpos;
1656 memmove(name_curpos, filename, n);
1657 name_curpos += n;
1658
1659 *start_end_ofs++ = vma->vm_start;
1660 *start_end_ofs++ = vma->vm_end;
1661 *start_end_ofs++ = vma->vm_pgoff;
1662 count++;
1663 }
1664
1665 /* Now we know exact count of files, can store it */
1666 data[0] = count;
1667 data[1] = PAGE_SIZE;
1668 /*
1669 * Count usually is less than current->mm->map_count,
1670 * we need to move filenames down.
1671 */
1672 n = current->mm->map_count - count;
1673 if (n != 0) {
1674 unsigned shift_bytes = n * 3 * sizeof(data[0]);
1675 memmove(name_base - shift_bytes, name_base,
1676 name_curpos - name_base);
1677 name_curpos -= shift_bytes;
1678 }
1679
1680 size = name_curpos - (char *)data;
1681 fill_note(note, "CORE", NT_FILE, size, data);
Dan Aloni72023652013-09-30 13:45:02 -07001682 return 0;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001683}
1684
Roland McGrath4206d3a2008-01-30 13:31:45 +01001685#ifdef CORE_DUMP_USE_REGSET
1686#include <linux/regset.h>
1687
1688struct elf_thread_core_info {
1689 struct elf_thread_core_info *next;
1690 struct task_struct *task;
1691 struct elf_prstatus prstatus;
1692 struct memelfnote notes[0];
1693};
1694
1695struct elf_note_info {
1696 struct elf_thread_core_info *thread;
1697 struct memelfnote psinfo;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001698 struct memelfnote signote;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001699 struct memelfnote auxv;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001700 struct memelfnote files;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001701 user_siginfo_t csigdata;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001702 size_t size;
1703 int thread_notes;
1704};
1705
Roland McGrathd31472b2008-03-04 14:28:30 -08001706/*
1707 * When a regset has a writeback hook, we call it on each thread before
1708 * dumping user memory. On register window machines, this makes sure the
1709 * user memory backing the register data is up to date before we read it.
1710 */
1711static void do_thread_regset_writeback(struct task_struct *task,
1712 const struct user_regset *regset)
1713{
1714 if (regset->writeback)
1715 regset->writeback(task, regset, 1);
1716}
1717
H. J. Lu0953f65d2012-02-14 13:34:52 -08001718#ifndef PRSTATUS_SIZE
Dmitry Safonov90954e72016-09-05 16:33:06 +03001719#define PRSTATUS_SIZE(S, R) sizeof(S)
H. J. Lu0953f65d2012-02-14 13:34:52 -08001720#endif
1721
1722#ifndef SET_PR_FPVALID
Dmitry Safonov90954e72016-09-05 16:33:06 +03001723#define SET_PR_FPVALID(S, V, R) ((S)->pr_fpvalid = (V))
H. J. Lu0953f65d2012-02-14 13:34:52 -08001724#endif
1725
Roland McGrath4206d3a2008-01-30 13:31:45 +01001726static int fill_thread_core_info(struct elf_thread_core_info *t,
1727 const struct user_regset_view *view,
1728 long signr, size_t *total)
1729{
1730 unsigned int i;
Dave Martin27e64b42017-10-31 15:50:53 +00001731 unsigned int regset0_size = regset_size(t->task, &view->regsets[0]);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001732
1733 /*
1734 * NT_PRSTATUS is the one special case, because the regset data
1735 * goes into the pr_reg field inside the note contents, rather
1736 * than being the whole note contents. We fill the reset in here.
1737 * We assume that regset 0 is NT_PRSTATUS.
1738 */
1739 fill_prstatus(&t->prstatus, t->task, signr);
Dave Martin27e64b42017-10-31 15:50:53 +00001740 (void) view->regsets[0].get(t->task, &view->regsets[0], 0, regset0_size,
Dmitry Safonov90954e72016-09-05 16:33:06 +03001741 &t->prstatus.pr_reg, NULL);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001742
1743 fill_note(&t->notes[0], "CORE", NT_PRSTATUS,
Dave Martin27e64b42017-10-31 15:50:53 +00001744 PRSTATUS_SIZE(t->prstatus, regset0_size), &t->prstatus);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001745 *total += notesize(&t->notes[0]);
1746
Roland McGrathd31472b2008-03-04 14:28:30 -08001747 do_thread_regset_writeback(t->task, &view->regsets[0]);
1748
Roland McGrath4206d3a2008-01-30 13:31:45 +01001749 /*
1750 * Each other regset might generate a note too. For each regset
1751 * that has no core_note_type or is inactive, we leave t->notes[i]
1752 * all zero and we'll know to skip writing it later.
1753 */
1754 for (i = 1; i < view->n; ++i) {
1755 const struct user_regset *regset = &view->regsets[i];
Roland McGrathd31472b2008-03-04 14:28:30 -08001756 do_thread_regset_writeback(t->task, regset);
H. Peter Anvinc8e25252012-03-02 10:43:48 -08001757 if (regset->core_note_type && regset->get &&
Maciej W. Rozycki2f819db2018-05-15 23:32:45 +01001758 (!regset->active || regset->active(t->task, regset) > 0)) {
Roland McGrath4206d3a2008-01-30 13:31:45 +01001759 int ret;
Dave Martin27e64b42017-10-31 15:50:53 +00001760 size_t size = regset_size(t->task, regset);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001761 void *data = kmalloc(size, GFP_KERNEL);
1762 if (unlikely(!data))
1763 return 0;
1764 ret = regset->get(t->task, regset,
1765 0, size, data, NULL);
1766 if (unlikely(ret))
1767 kfree(data);
1768 else {
1769 if (regset->core_note_type != NT_PRFPREG)
1770 fill_note(&t->notes[i], "LINUX",
1771 regset->core_note_type,
1772 size, data);
1773 else {
Dmitry Safonov90954e72016-09-05 16:33:06 +03001774 SET_PR_FPVALID(&t->prstatus,
Dave Martin27e64b42017-10-31 15:50:53 +00001775 1, regset0_size);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001776 fill_note(&t->notes[i], "CORE",
1777 NT_PRFPREG, size, data);
1778 }
1779 *total += notesize(&t->notes[i]);
1780 }
1781 }
1782 }
1783
1784 return 1;
1785}
1786
1787static int fill_note_info(struct elfhdr *elf, int phdrs,
1788 struct elf_note_info *info,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02001789 const kernel_siginfo_t *siginfo, struct pt_regs *regs)
Roland McGrath4206d3a2008-01-30 13:31:45 +01001790{
1791 struct task_struct *dump_task = current;
1792 const struct user_regset_view *view = task_user_regset_view(dump_task);
1793 struct elf_thread_core_info *t;
1794 struct elf_prpsinfo *psinfo;
Oleg Nesterov83914442008-07-25 01:47:45 -07001795 struct core_thread *ct;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001796 unsigned int i;
1797
1798 info->size = 0;
1799 info->thread = NULL;
1800
1801 psinfo = kmalloc(sizeof(*psinfo), GFP_KERNEL);
Alan Cox6899e922012-12-17 16:02:09 -08001802 if (psinfo == NULL) {
1803 info->psinfo.data = NULL; /* So we don't free this wrongly */
Roland McGrath4206d3a2008-01-30 13:31:45 +01001804 return 0;
Alan Cox6899e922012-12-17 16:02:09 -08001805 }
Roland McGrath4206d3a2008-01-30 13:31:45 +01001806
Amerigo Wange2dbe122009-07-01 01:06:26 -04001807 fill_note(&info->psinfo, "CORE", NT_PRPSINFO, sizeof(*psinfo), psinfo);
1808
Roland McGrath4206d3a2008-01-30 13:31:45 +01001809 /*
1810 * Figure out how many notes we're going to need for each thread.
1811 */
1812 info->thread_notes = 0;
1813 for (i = 0; i < view->n; ++i)
1814 if (view->regsets[i].core_note_type != 0)
1815 ++info->thread_notes;
1816
1817 /*
1818 * Sanity check. We rely on regset 0 being in NT_PRSTATUS,
1819 * since it is our one special case.
1820 */
1821 if (unlikely(info->thread_notes == 0) ||
1822 unlikely(view->regsets[0].core_note_type != NT_PRSTATUS)) {
1823 WARN_ON(1);
1824 return 0;
1825 }
1826
1827 /*
1828 * Initialize the ELF file header.
1829 */
1830 fill_elf_header(elf, phdrs,
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001831 view->e_machine, view->e_flags);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001832
1833 /*
1834 * Allocate a structure for each thread.
1835 */
Oleg Nesterov83914442008-07-25 01:47:45 -07001836 for (ct = &dump_task->mm->core_state->dumper; ct; ct = ct->next) {
1837 t = kzalloc(offsetof(struct elf_thread_core_info,
1838 notes[info->thread_notes]),
1839 GFP_KERNEL);
1840 if (unlikely(!t))
1841 return 0;
Oleg Nesterov24d52882008-07-25 01:47:40 -07001842
Oleg Nesterov83914442008-07-25 01:47:45 -07001843 t->task = ct->task;
1844 if (ct->task == dump_task || !info->thread) {
1845 t->next = info->thread;
1846 info->thread = t;
1847 } else {
1848 /*
1849 * Make sure to keep the original task at
1850 * the head of the list.
1851 */
1852 t->next = info->thread->next;
1853 info->thread->next = t;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001854 }
Oleg Nesterov83914442008-07-25 01:47:45 -07001855 }
Roland McGrath4206d3a2008-01-30 13:31:45 +01001856
1857 /*
1858 * Now fill in each thread's information.
1859 */
1860 for (t = info->thread; t != NULL; t = t->next)
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07001861 if (!fill_thread_core_info(t, view, siginfo->si_signo, &info->size))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001862 return 0;
1863
1864 /*
1865 * Fill in the two process-wide notes.
1866 */
1867 fill_psinfo(psinfo, dump_task->group_leader, dump_task->mm);
1868 info->size += notesize(&info->psinfo);
1869
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001870 fill_siginfo_note(&info->signote, &info->csigdata, siginfo);
1871 info->size += notesize(&info->signote);
1872
Roland McGrath4206d3a2008-01-30 13:31:45 +01001873 fill_auxv_note(&info->auxv, current->mm);
1874 info->size += notesize(&info->auxv);
1875
Dan Aloni72023652013-09-30 13:45:02 -07001876 if (fill_files_note(&info->files) == 0)
1877 info->size += notesize(&info->files);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001878
Roland McGrath4206d3a2008-01-30 13:31:45 +01001879 return 1;
1880}
1881
1882static size_t get_note_info_size(struct elf_note_info *info)
1883{
1884 return info->size;
1885}
1886
1887/*
1888 * Write all the notes for each thread. When writing the first thread, the
1889 * process-wide notes are interleaved after the first thread-specific note.
1890 */
1891static int write_note_info(struct elf_note_info *info,
Al Viroecc8c772013-10-05 15:32:35 -04001892 struct coredump_params *cprm)
Roland McGrath4206d3a2008-01-30 13:31:45 +01001893{
Fabian Frederickb219e252014-06-04 16:12:14 -07001894 bool first = true;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001895 struct elf_thread_core_info *t = info->thread;
1896
1897 do {
1898 int i;
1899
Al Viroecc8c772013-10-05 15:32:35 -04001900 if (!writenote(&t->notes[0], cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001901 return 0;
1902
Al Viroecc8c772013-10-05 15:32:35 -04001903 if (first && !writenote(&info->psinfo, cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001904 return 0;
Al Viroecc8c772013-10-05 15:32:35 -04001905 if (first && !writenote(&info->signote, cprm))
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001906 return 0;
Al Viroecc8c772013-10-05 15:32:35 -04001907 if (first && !writenote(&info->auxv, cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001908 return 0;
Dan Aloni72023652013-09-30 13:45:02 -07001909 if (first && info->files.data &&
Al Viroecc8c772013-10-05 15:32:35 -04001910 !writenote(&info->files, cprm))
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001911 return 0;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001912
1913 for (i = 1; i < info->thread_notes; ++i)
1914 if (t->notes[i].data &&
Al Viroecc8c772013-10-05 15:32:35 -04001915 !writenote(&t->notes[i], cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001916 return 0;
1917
Fabian Frederickb219e252014-06-04 16:12:14 -07001918 first = false;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001919 t = t->next;
1920 } while (t);
1921
1922 return 1;
1923}
1924
1925static void free_note_info(struct elf_note_info *info)
1926{
1927 struct elf_thread_core_info *threads = info->thread;
1928 while (threads) {
1929 unsigned int i;
1930 struct elf_thread_core_info *t = threads;
1931 threads = t->next;
1932 WARN_ON(t->notes[0].data && t->notes[0].data != &t->prstatus);
1933 for (i = 1; i < info->thread_notes; ++i)
1934 kfree(t->notes[i].data);
1935 kfree(t);
1936 }
1937 kfree(info->psinfo.data);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001938 kvfree(info->files.data);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001939}
1940
1941#else
1942
Linus Torvalds1da177e2005-04-16 15:20:36 -07001943/* Here is the structure in which status of each thread is captured. */
1944struct elf_thread_status
1945{
1946 struct list_head list;
1947 struct elf_prstatus prstatus; /* NT_PRSTATUS */
1948 elf_fpregset_t fpu; /* NT_PRFPREG */
1949 struct task_struct *thread;
1950#ifdef ELF_CORE_COPY_XFPREGS
Mark Nelson5b20cd82007-10-16 23:25:39 -07001951 elf_fpxregset_t xfpu; /* ELF_CORE_XFPREG_TYPE */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001952#endif
1953 struct memelfnote notes[3];
1954 int num_notes;
1955};
1956
1957/*
1958 * In order to add the specific thread information for the elf file format,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001959 * we need to keep a linked list of every threads pr_status and then create
1960 * a single section for them in the final core file.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001961 */
1962static int elf_dump_thread_status(long signr, struct elf_thread_status *t)
1963{
1964 int sz = 0;
1965 struct task_struct *p = t->thread;
1966 t->num_notes = 0;
1967
1968 fill_prstatus(&t->prstatus, p, signr);
1969 elf_core_copy_task_regs(p, &t->prstatus.pr_reg);
1970
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001971 fill_note(&t->notes[0], "CORE", NT_PRSTATUS, sizeof(t->prstatus),
1972 &(t->prstatus));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001973 t->num_notes++;
1974 sz += notesize(&t->notes[0]);
1975
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001976 if ((t->prstatus.pr_fpvalid = elf_core_copy_task_fpregs(p, NULL,
1977 &t->fpu))) {
1978 fill_note(&t->notes[1], "CORE", NT_PRFPREG, sizeof(t->fpu),
1979 &(t->fpu));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001980 t->num_notes++;
1981 sz += notesize(&t->notes[1]);
1982 }
1983
1984#ifdef ELF_CORE_COPY_XFPREGS
1985 if (elf_core_copy_task_xfpregs(p, &t->xfpu)) {
Mark Nelson5b20cd82007-10-16 23:25:39 -07001986 fill_note(&t->notes[2], "LINUX", ELF_CORE_XFPREG_TYPE,
1987 sizeof(t->xfpu), &t->xfpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001988 t->num_notes++;
1989 sz += notesize(&t->notes[2]);
1990 }
1991#endif
1992 return sz;
1993}
1994
Roland McGrath3aba4812008-01-30 13:31:44 +01001995struct elf_note_info {
1996 struct memelfnote *notes;
Dan Aloni72023652013-09-30 13:45:02 -07001997 struct memelfnote *notes_files;
Roland McGrath3aba4812008-01-30 13:31:44 +01001998 struct elf_prstatus *prstatus; /* NT_PRSTATUS */
1999 struct elf_prpsinfo *psinfo; /* NT_PRPSINFO */
2000 struct list_head thread_list;
2001 elf_fpregset_t *fpu;
2002#ifdef ELF_CORE_COPY_XFPREGS
2003 elf_fpxregset_t *xfpu;
2004#endif
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07002005 user_siginfo_t csigdata;
Roland McGrath3aba4812008-01-30 13:31:44 +01002006 int thread_status_size;
2007 int numnote;
2008};
2009
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002010static int elf_note_info_init(struct elf_note_info *info)
Roland McGrath3aba4812008-01-30 13:31:44 +01002011{
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002012 memset(info, 0, sizeof(*info));
Roland McGrath3aba4812008-01-30 13:31:44 +01002013 INIT_LIST_HEAD(&info->thread_list);
2014
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07002015 /* Allocate space for ELF notes */
Kees Cook6da2ec52018-06-12 13:55:00 -07002016 info->notes = kmalloc_array(8, sizeof(struct memelfnote), GFP_KERNEL);
Roland McGrath3aba4812008-01-30 13:31:44 +01002017 if (!info->notes)
2018 return 0;
2019 info->psinfo = kmalloc(sizeof(*info->psinfo), GFP_KERNEL);
2020 if (!info->psinfo)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002021 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002022 info->prstatus = kmalloc(sizeof(*info->prstatus), GFP_KERNEL);
2023 if (!info->prstatus)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002024 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002025 info->fpu = kmalloc(sizeof(*info->fpu), GFP_KERNEL);
2026 if (!info->fpu)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002027 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002028#ifdef ELF_CORE_COPY_XFPREGS
2029 info->xfpu = kmalloc(sizeof(*info->xfpu), GFP_KERNEL);
2030 if (!info->xfpu)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002031 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002032#endif
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002033 return 1;
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002034}
Roland McGrath3aba4812008-01-30 13:31:44 +01002035
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002036static int fill_note_info(struct elfhdr *elf, int phdrs,
2037 struct elf_note_info *info,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02002038 const kernel_siginfo_t *siginfo, struct pt_regs *regs)
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002039{
Al Viroafabada2013-10-14 07:39:56 -04002040 struct core_thread *ct;
2041 struct elf_thread_status *ets;
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002042
2043 if (!elf_note_info_init(info))
2044 return 0;
2045
Al Viroafabada2013-10-14 07:39:56 -04002046 for (ct = current->mm->core_state->dumper.next;
2047 ct; ct = ct->next) {
2048 ets = kzalloc(sizeof(*ets), GFP_KERNEL);
2049 if (!ets)
2050 return 0;
Oleg Nesterov24d52882008-07-25 01:47:40 -07002051
Al Viroafabada2013-10-14 07:39:56 -04002052 ets->thread = ct->task;
2053 list_add(&ets->list, &info->thread_list);
2054 }
Oleg Nesterov83914442008-07-25 01:47:45 -07002055
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002056 list_for_each_entry(ets, &info->thread_list, list) {
Al Viroafabada2013-10-14 07:39:56 -04002057 int sz;
Oleg Nesterov83914442008-07-25 01:47:45 -07002058
Al Viroafabada2013-10-14 07:39:56 -04002059 sz = elf_dump_thread_status(siginfo->si_signo, ets);
2060 info->thread_status_size += sz;
Roland McGrath3aba4812008-01-30 13:31:44 +01002061 }
2062 /* now collect the dump for the current */
2063 memset(info->prstatus, 0, sizeof(*info->prstatus));
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07002064 fill_prstatus(info->prstatus, current, siginfo->si_signo);
Roland McGrath3aba4812008-01-30 13:31:44 +01002065 elf_core_copy_regs(&info->prstatus->pr_reg, regs);
2066
2067 /* Set up header */
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08002068 fill_elf_header(elf, phdrs, ELF_ARCH, ELF_CORE_EFLAGS);
Roland McGrath3aba4812008-01-30 13:31:44 +01002069
2070 /*
2071 * Set up the notes in similar form to SVR4 core dumps made
2072 * with info from their /proc.
2073 */
2074
2075 fill_note(info->notes + 0, "CORE", NT_PRSTATUS,
2076 sizeof(*info->prstatus), info->prstatus);
2077 fill_psinfo(info->psinfo, current->group_leader, current->mm);
2078 fill_note(info->notes + 1, "CORE", NT_PRPSINFO,
2079 sizeof(*info->psinfo), info->psinfo);
2080
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07002081 fill_siginfo_note(info->notes + 2, &info->csigdata, siginfo);
2082 fill_auxv_note(info->notes + 3, current->mm);
Dan Aloni72023652013-09-30 13:45:02 -07002083 info->numnote = 4;
Roland McGrath3aba4812008-01-30 13:31:44 +01002084
Dan Aloni72023652013-09-30 13:45:02 -07002085 if (fill_files_note(info->notes + info->numnote) == 0) {
2086 info->notes_files = info->notes + info->numnote;
2087 info->numnote++;
2088 }
Roland McGrath3aba4812008-01-30 13:31:44 +01002089
2090 /* Try to dump the FPU. */
2091 info->prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, regs,
2092 info->fpu);
2093 if (info->prstatus->pr_fpvalid)
2094 fill_note(info->notes + info->numnote++,
2095 "CORE", NT_PRFPREG, sizeof(*info->fpu), info->fpu);
2096#ifdef ELF_CORE_COPY_XFPREGS
2097 if (elf_core_copy_task_xfpregs(current, info->xfpu))
2098 fill_note(info->notes + info->numnote++,
2099 "LINUX", ELF_CORE_XFPREG_TYPE,
2100 sizeof(*info->xfpu), info->xfpu);
2101#endif
2102
2103 return 1;
Roland McGrath3aba4812008-01-30 13:31:44 +01002104}
2105
2106static size_t get_note_info_size(struct elf_note_info *info)
2107{
2108 int sz = 0;
2109 int i;
2110
2111 for (i = 0; i < info->numnote; i++)
2112 sz += notesize(info->notes + i);
2113
2114 sz += info->thread_status_size;
2115
2116 return sz;
2117}
2118
2119static int write_note_info(struct elf_note_info *info,
Al Viroecc8c772013-10-05 15:32:35 -04002120 struct coredump_params *cprm)
Roland McGrath3aba4812008-01-30 13:31:44 +01002121{
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002122 struct elf_thread_status *ets;
Roland McGrath3aba4812008-01-30 13:31:44 +01002123 int i;
Roland McGrath3aba4812008-01-30 13:31:44 +01002124
2125 for (i = 0; i < info->numnote; i++)
Al Viroecc8c772013-10-05 15:32:35 -04002126 if (!writenote(info->notes + i, cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002127 return 0;
2128
2129 /* write out the thread status notes section */
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002130 list_for_each_entry(ets, &info->thread_list, list) {
2131 for (i = 0; i < ets->num_notes; i++)
2132 if (!writenote(&ets->notes[i], cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002133 return 0;
2134 }
2135
2136 return 1;
2137}
2138
2139static void free_note_info(struct elf_note_info *info)
2140{
2141 while (!list_empty(&info->thread_list)) {
2142 struct list_head *tmp = info->thread_list.next;
2143 list_del(tmp);
2144 kfree(list_entry(tmp, struct elf_thread_status, list));
2145 }
2146
Dan Aloni72023652013-09-30 13:45:02 -07002147 /* Free data possibly allocated by fill_files_note(): */
2148 if (info->notes_files)
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002149 kvfree(info->notes_files->data);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07002150
Roland McGrath3aba4812008-01-30 13:31:44 +01002151 kfree(info->prstatus);
2152 kfree(info->psinfo);
2153 kfree(info->notes);
2154 kfree(info->fpu);
2155#ifdef ELF_CORE_COPY_XFPREGS
2156 kfree(info->xfpu);
2157#endif
2158}
2159
Roland McGrath4206d3a2008-01-30 13:31:45 +01002160#endif
2161
Roland McGrathf47aef52007-01-26 00:56:49 -08002162static struct vm_area_struct *first_vma(struct task_struct *tsk,
2163 struct vm_area_struct *gate_vma)
2164{
2165 struct vm_area_struct *ret = tsk->mm->mmap;
2166
2167 if (ret)
2168 return ret;
2169 return gate_vma;
2170}
2171/*
2172 * Helper function for iterating across a vma list. It ensures that the caller
2173 * will visit `gate_vma' prior to terminating the search.
2174 */
2175static struct vm_area_struct *next_vma(struct vm_area_struct *this_vma,
2176 struct vm_area_struct *gate_vma)
2177{
2178 struct vm_area_struct *ret;
2179
2180 ret = this_vma->vm_next;
2181 if (ret)
2182 return ret;
2183 if (this_vma == gate_vma)
2184 return NULL;
2185 return gate_vma;
2186}
2187
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002188static void fill_extnum_info(struct elfhdr *elf, struct elf_shdr *shdr4extnum,
2189 elf_addr_t e_shoff, int segs)
2190{
2191 elf->e_shoff = e_shoff;
2192 elf->e_shentsize = sizeof(*shdr4extnum);
2193 elf->e_shnum = 1;
2194 elf->e_shstrndx = SHN_UNDEF;
2195
2196 memset(shdr4extnum, 0, sizeof(*shdr4extnum));
2197
2198 shdr4extnum->sh_type = SHT_NULL;
2199 shdr4extnum->sh_size = elf->e_shnum;
2200 shdr4extnum->sh_link = elf->e_shstrndx;
2201 shdr4extnum->sh_info = segs;
2202}
2203
Linus Torvalds1da177e2005-04-16 15:20:36 -07002204/*
2205 * Actual dumper
2206 *
2207 * This is a two-pass process; first we find the offsets of the bits,
2208 * and then they are actually written out. If we run out of core limit
2209 * we just truncate.
2210 */
Masami Hiramatsuf6151df2009-12-17 15:27:16 -08002211static int elf_core_dump(struct coredump_params *cprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002212{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002213 int has_dumped = 0;
2214 mm_segment_t fs;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002215 int segs, i;
2216 size_t vma_data_size = 0;
Roland McGrathf47aef52007-01-26 00:56:49 -08002217 struct vm_area_struct *vma, *gate_vma;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002218 struct elfhdr *elf = NULL;
Al Virocdc3d562013-10-05 22:24:29 -04002219 loff_t offset = 0, dataoff;
Dan Aloni72023652013-09-30 13:45:02 -07002220 struct elf_note_info info = { };
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002221 struct elf_phdr *phdr4note = NULL;
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002222 struct elf_shdr *shdr4extnum = NULL;
2223 Elf_Half e_phnum;
2224 elf_addr_t e_shoff;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002225 elf_addr_t *vma_filesz = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002226
2227 /*
2228 * We no longer stop all VM operations.
2229 *
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002230 * This is because those proceses that could possibly change map_count
2231 * or the mmap / vma pages are now blocked in do_exit on current
2232 * finishing this core dump.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002233 *
2234 * Only ptrace can touch these memory addresses, but it doesn't change
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002235 * the map_count or the pages allocated. So no possibility of crashing
Linus Torvalds1da177e2005-04-16 15:20:36 -07002236 * exists while dumping the mm->vm_next areas to the core file.
2237 */
2238
2239 /* alloc memory for large data structures: too large to be on stack */
2240 elf = kmalloc(sizeof(*elf), GFP_KERNEL);
2241 if (!elf)
WANG Cong5f719552008-05-06 12:45:35 +08002242 goto out;
KAMEZAWA Hiroyuki341c87b2009-06-30 11:41:23 -07002243 /*
2244 * The number of segs are recored into ELF header as 16bit value.
2245 * Please check DEFAULT_MAX_MAP_COUNT definition when you modify here.
2246 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002247 segs = current->mm->map_count;
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002248 segs += elf_core_extra_phdrs();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002249
Stephen Wilson31db58b2011-03-13 15:49:15 -04002250 gate_vma = get_gate_vma(current->mm);
Roland McGrathf47aef52007-01-26 00:56:49 -08002251 if (gate_vma != NULL)
2252 segs++;
2253
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002254 /* for notes section */
2255 segs++;
2256
2257 /* If segs > PN_XNUM(0xffff), then e_phnum overflows. To avoid
2258 * this, kernel supports extended numbering. Have a look at
2259 * include/linux/elf.h for further information. */
2260 e_phnum = segs > PN_XNUM ? PN_XNUM : segs;
2261
Roland McGrath3aba4812008-01-30 13:31:44 +01002262 /*
2263 * Collect all the non-memory information about the process for the
2264 * notes. This also sets up the file header.
2265 */
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07002266 if (!fill_note_info(elf, e_phnum, &info, cprm->siginfo, cprm->regs))
Roland McGrath3aba4812008-01-30 13:31:44 +01002267 goto cleanup;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002268
2269 has_dumped = 1;
Oleg Nesterov079148b2013-04-30 15:28:16 -07002270
Linus Torvalds1da177e2005-04-16 15:20:36 -07002271 fs = get_fs();
2272 set_fs(KERNEL_DS);
2273
Linus Torvalds1da177e2005-04-16 15:20:36 -07002274 offset += sizeof(*elf); /* Elf header */
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002275 offset += segs * sizeof(struct elf_phdr); /* Program headers */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002276
2277 /* Write notes phdr entry */
2278 {
Roland McGrath3aba4812008-01-30 13:31:44 +01002279 size_t sz = get_note_info_size(&info);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002280
Michael Ellermane5501492007-09-19 14:38:12 +10002281 sz += elf_coredump_extra_notes_size();
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +01002282
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002283 phdr4note = kmalloc(sizeof(*phdr4note), GFP_KERNEL);
2284 if (!phdr4note)
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -08002285 goto end_coredump;
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002286
2287 fill_elf_note_phdr(phdr4note, sz, offset);
2288 offset += sz;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002289 }
2290
Linus Torvalds1da177e2005-04-16 15:20:36 -07002291 dataoff = offset = roundup(offset, ELF_EXEC_PAGESIZE);
2292
Jason Baron30f74aa2016-12-12 16:46:40 -08002293 if (segs - 1 > ULONG_MAX / sizeof(*vma_filesz))
2294 goto end_coredump;
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002295 vma_filesz = kvmalloc(array_size(sizeof(*vma_filesz), (segs - 1)),
2296 GFP_KERNEL);
2297 if (ZERO_OR_NULL_PTR(vma_filesz))
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002298 goto end_coredump;
2299
2300 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
2301 vma = next_vma(vma, gate_vma)) {
2302 unsigned long dump_size;
2303
2304 dump_size = vma_dump_size(vma, cprm->mm_flags);
2305 vma_filesz[i++] = dump_size;
2306 vma_data_size += dump_size;
2307 }
2308
2309 offset += vma_data_size;
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002310 offset += elf_core_extra_data_size();
2311 e_shoff = offset;
2312
2313 if (e_phnum == PN_XNUM) {
2314 shdr4extnum = kmalloc(sizeof(*shdr4extnum), GFP_KERNEL);
2315 if (!shdr4extnum)
2316 goto end_coredump;
2317 fill_extnum_info(elf, shdr4extnum, e_shoff, segs);
2318 }
2319
2320 offset = dataoff;
2321
Al Viroecc8c772013-10-05 15:32:35 -04002322 if (!dump_emit(cprm, elf, sizeof(*elf)))
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002323 goto end_coredump;
2324
Al Viroecc8c772013-10-05 15:32:35 -04002325 if (!dump_emit(cprm, phdr4note, sizeof(*phdr4note)))
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002326 goto end_coredump;
2327
Linus Torvalds1da177e2005-04-16 15:20:36 -07002328 /* Write program headers for segments dump */
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002329 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
Roland McGrathf47aef52007-01-26 00:56:49 -08002330 vma = next_vma(vma, gate_vma)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002331 struct elf_phdr phdr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002332
2333 phdr.p_type = PT_LOAD;
2334 phdr.p_offset = offset;
2335 phdr.p_vaddr = vma->vm_start;
2336 phdr.p_paddr = 0;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002337 phdr.p_filesz = vma_filesz[i++];
Roland McGrath82df3972007-10-16 23:27:02 -07002338 phdr.p_memsz = vma->vm_end - vma->vm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002339 offset += phdr.p_filesz;
2340 phdr.p_flags = vma->vm_flags & VM_READ ? PF_R : 0;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002341 if (vma->vm_flags & VM_WRITE)
2342 phdr.p_flags |= PF_W;
2343 if (vma->vm_flags & VM_EXEC)
2344 phdr.p_flags |= PF_X;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002345 phdr.p_align = ELF_EXEC_PAGESIZE;
2346
Al Viroecc8c772013-10-05 15:32:35 -04002347 if (!dump_emit(cprm, &phdr, sizeof(phdr)))
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -08002348 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002349 }
2350
Al Viro506f21c2013-10-05 17:22:57 -04002351 if (!elf_core_write_extra_phdrs(cprm, offset))
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002352 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002353
2354 /* write out the notes section */
Al Viroecc8c772013-10-05 15:32:35 -04002355 if (!write_note_info(&info, cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002356 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002357
Al Virocdc3d562013-10-05 22:24:29 -04002358 if (elf_coredump_extra_notes_write(cprm))
Michael Ellermane5501492007-09-19 14:38:12 +10002359 goto end_coredump;
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +01002360
Andi Kleend025c9d2006-09-30 23:29:28 -07002361 /* Align to page */
Mateusz Guzik1607f092016-06-05 23:14:14 +02002362 if (!dump_skip(cprm, dataoff - cprm->pos))
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002363 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002364
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002365 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
Roland McGrathf47aef52007-01-26 00:56:49 -08002366 vma = next_vma(vma, gate_vma)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002367 unsigned long addr;
Roland McGrath82df3972007-10-16 23:27:02 -07002368 unsigned long end;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002369
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002370 end = vma->vm_start + vma_filesz[i++];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002371
Roland McGrath82df3972007-10-16 23:27:02 -07002372 for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002373 struct page *page;
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002374 int stop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002375
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002376 page = get_dump_page(addr);
2377 if (page) {
2378 void *kaddr = kmap(page);
Al Viro13046ec2013-10-05 18:08:47 -04002379 stop = !dump_emit(cprm, kaddr, PAGE_SIZE);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002380 kunmap(page);
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03002381 put_page(page);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002382 } else
Al Viro9b56d542013-10-08 09:26:08 -04002383 stop = !dump_skip(cprm, PAGE_SIZE);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002384 if (stop)
2385 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002386 }
2387 }
Dave Kleikamp4d22c752017-01-11 13:25:00 -06002388 dump_truncate(cprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002389
Al Viroaa3e7ea2013-10-05 17:50:15 -04002390 if (!elf_core_write_extra_data(cprm))
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002391 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002392
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002393 if (e_phnum == PN_XNUM) {
Al Viro13046ec2013-10-05 18:08:47 -04002394 if (!dump_emit(cprm, shdr4extnum, sizeof(*shdr4extnum)))
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002395 goto end_coredump;
2396 }
2397
Linus Torvalds1da177e2005-04-16 15:20:36 -07002398end_coredump:
2399 set_fs(fs);
2400
2401cleanup:
Roland McGrath3aba4812008-01-30 13:31:44 +01002402 free_note_info(&info);
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002403 kfree(shdr4extnum);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002404 kvfree(vma_filesz);
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002405 kfree(phdr4note);
WANG Cong5f719552008-05-06 12:45:35 +08002406 kfree(elf);
2407out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002408 return has_dumped;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002409}
2410
Christoph Hellwig698ba7b2009-12-15 16:47:37 -08002411#endif /* CONFIG_ELF_CORE */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002412
2413static int __init init_elf_binfmt(void)
2414{
Al Viro8fc3dc52012-03-17 03:05:16 -04002415 register_binfmt(&elf_format);
2416 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002417}
2418
2419static void __exit exit_elf_binfmt(void)
2420{
2421 /* Remove the COFF and ELF loaders. */
2422 unregister_binfmt(&elf_format);
2423}
2424
2425core_initcall(init_elf_binfmt);
2426module_exit(exit_elf_binfmt);
2427MODULE_LICENSE("GPL");