blob: 9afb5ed5b2d0f1599fcef8fcd59c64b3f7f4b168 [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
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800164create_elf_tables(struct linux_binprm *bprm, const struct elfhdr *exec,
165 unsigned long load_addr, unsigned long interp_load_addr,
166 unsigned long e_entry)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700167{
Alexey Dobriyan03c6d722020-01-30 22:16:58 -0800168 struct mm_struct *mm = current->mm;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700169 unsigned long p = bprm->p;
170 int argc = bprm->argc;
171 int envc = bprm->envc;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700172 elf_addr_t __user *sp;
173 elf_addr_t __user *u_platform;
Nathan Lynch483fad12008-07-22 04:48:46 +1000174 elf_addr_t __user *u_base_platform;
Kees Cookf06295b2009-01-07 18:08:52 -0800175 elf_addr_t __user *u_rand_bytes;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700176 const char *k_platform = ELF_PLATFORM;
Nathan Lynch483fad12008-07-22 04:48:46 +1000177 const char *k_base_platform = ELF_BASE_PLATFORM;
Kees Cookf06295b2009-01-07 18:08:52 -0800178 unsigned char k_rand_bytes[16];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700179 int items;
180 elf_addr_t *elf_info;
Alexey Dobriyan1f83d802020-01-30 22:16:50 -0800181 int ei_index;
David Howells86a264a2008-11-14 10:39:18 +1100182 const struct cred *cred = current_cred();
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700183 struct vm_area_struct *vma;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700184
185 /*
Franck Bui-Huud68c9d62007-10-16 23:30:24 -0700186 * In some cases (e.g. Hyper-Threading), we want to avoid L1
187 * evictions by the processes running on the same package. One
188 * thing we can do is to shuffle the initial stack for them.
189 */
190
191 p = arch_align_stack(p);
192
193 /*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700194 * If this architecture has a platform capability string, copy it
195 * to userspace. In some cases (Sparc), this info is impossible
196 * for userspace to get any other way, in others (i386) it is
197 * merely difficult.
198 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700199 u_platform = NULL;
200 if (k_platform) {
201 size_t len = strlen(k_platform) + 1;
202
Linus Torvalds1da177e2005-04-16 15:20:36 -0700203 u_platform = (elf_addr_t __user *)STACK_ALLOC(p, len);
204 if (__copy_to_user(u_platform, k_platform, len))
205 return -EFAULT;
206 }
207
Nathan Lynch483fad12008-07-22 04:48:46 +1000208 /*
209 * If this architecture has a "base" platform capability
210 * string, copy it to userspace.
211 */
212 u_base_platform = NULL;
213 if (k_base_platform) {
214 size_t len = strlen(k_base_platform) + 1;
215
216 u_base_platform = (elf_addr_t __user *)STACK_ALLOC(p, len);
217 if (__copy_to_user(u_base_platform, k_base_platform, len))
218 return -EFAULT;
219 }
220
Kees Cookf06295b2009-01-07 18:08:52 -0800221 /*
222 * Generate 16 random bytes for userspace PRNG seeding.
223 */
224 get_random_bytes(k_rand_bytes, sizeof(k_rand_bytes));
225 u_rand_bytes = (elf_addr_t __user *)
226 STACK_ALLOC(p, sizeof(k_rand_bytes));
227 if (__copy_to_user(u_rand_bytes, k_rand_bytes, sizeof(k_rand_bytes)))
228 return -EFAULT;
229
Linus Torvalds1da177e2005-04-16 15:20:36 -0700230 /* Create the ELF interpreter info */
Alexey Dobriyan03c6d722020-01-30 22:16:58 -0800231 elf_info = (elf_addr_t *)mm->saved_auxv;
Olaf Hering4f9a58d2007-10-16 23:30:12 -0700232 /* update AT_VECTOR_SIZE_BASE if the number of NEW_AUX_ENT() changes */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700233#define NEW_AUX_ENT(id, val) \
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700234 do { \
Alexey Dobriyan1f83d802020-01-30 22:16:50 -0800235 *elf_info++ = id; \
236 *elf_info++ = val; \
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700237 } while (0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700238
239#ifdef ARCH_DLINFO
240 /*
241 * ARCH_DLINFO must come first so PPC can do its special alignment of
242 * AUXV.
Olaf Hering4f9a58d2007-10-16 23:30:12 -0700243 * update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT() in
244 * ARCH_DLINFO changes
Linus Torvalds1da177e2005-04-16 15:20:36 -0700245 */
246 ARCH_DLINFO;
247#endif
248 NEW_AUX_ENT(AT_HWCAP, ELF_HWCAP);
249 NEW_AUX_ENT(AT_PAGESZ, ELF_EXEC_PAGESIZE);
250 NEW_AUX_ENT(AT_CLKTCK, CLOCKS_PER_SEC);
251 NEW_AUX_ENT(AT_PHDR, load_addr + exec->e_phoff);
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700252 NEW_AUX_ENT(AT_PHENT, sizeof(struct elf_phdr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700253 NEW_AUX_ENT(AT_PHNUM, exec->e_phnum);
254 NEW_AUX_ENT(AT_BASE, interp_load_addr);
255 NEW_AUX_ENT(AT_FLAGS, 0);
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800256 NEW_AUX_ENT(AT_ENTRY, e_entry);
Eric W. Biedermanebc887b2012-02-07 18:36:10 -0800257 NEW_AUX_ENT(AT_UID, from_kuid_munged(cred->user_ns, cred->uid));
258 NEW_AUX_ENT(AT_EUID, from_kuid_munged(cred->user_ns, cred->euid));
259 NEW_AUX_ENT(AT_GID, from_kgid_munged(cred->user_ns, cred->gid));
260 NEW_AUX_ENT(AT_EGID, from_kgid_munged(cred->user_ns, cred->egid));
Kees Cookc425e182017-07-18 15:25:22 -0700261 NEW_AUX_ENT(AT_SECURE, bprm->secureexec);
Kees Cookf06295b2009-01-07 18:08:52 -0800262 NEW_AUX_ENT(AT_RANDOM, (elf_addr_t)(unsigned long)u_rand_bytes);
Michael Neuling21713642013-04-17 17:33:11 +0000263#ifdef ELF_HWCAP2
264 NEW_AUX_ENT(AT_HWCAP2, ELF_HWCAP2);
265#endif
John Reiser65191082008-07-21 14:21:32 -0700266 NEW_AUX_ENT(AT_EXECFN, bprm->exec);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700267 if (k_platform) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700268 NEW_AUX_ENT(AT_PLATFORM,
Jesper Juhl785d5572006-06-23 02:05:35 -0700269 (elf_addr_t)(unsigned long)u_platform);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700270 }
Nathan Lynch483fad12008-07-22 04:48:46 +1000271 if (k_base_platform) {
272 NEW_AUX_ENT(AT_BASE_PLATFORM,
273 (elf_addr_t)(unsigned long)u_base_platform);
274 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700275 if (bprm->interp_flags & BINPRM_FLAGS_EXECFD) {
Jesper Juhl785d5572006-06-23 02:05:35 -0700276 NEW_AUX_ENT(AT_EXECFD, bprm->interp_data);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700277 }
278#undef NEW_AUX_ENT
279 /* AT_NULL is zero; clear the rest too */
Alexey Dobriyan03c6d722020-01-30 22:16:58 -0800280 memset(elf_info, 0, (char *)mm->saved_auxv +
281 sizeof(mm->saved_auxv) - (char *)elf_info);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700282
283 /* And advance past the AT_NULL entry. */
Alexey Dobriyan1f83d802020-01-30 22:16:50 -0800284 elf_info += 2;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700285
Alexey Dobriyan03c6d722020-01-30 22:16:58 -0800286 ei_index = elf_info - (elf_addr_t *)mm->saved_auxv;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700287 sp = STACK_ADD(p, ei_index);
288
Andi Kleend20894a2008-02-08 04:21:54 -0800289 items = (argc + 1) + (envc + 1) + 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700290 bprm->p = STACK_ROUND(sp, items);
291
292 /* Point sp at the lowest address on the stack */
293#ifdef CONFIG_STACK_GROWSUP
294 sp = (elf_addr_t __user *)bprm->p - items - ei_index;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700295 bprm->exec = (unsigned long)sp; /* XXX: PARISC HACK */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700296#else
297 sp = (elf_addr_t __user *)bprm->p;
298#endif
299
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700300
301 /*
302 * Grow the stack manually; some architectures have a limit on how
303 * far ahead a user-space access may be in order to grow the stack.
304 */
Alexey Dobriyan03c6d722020-01-30 22:16:58 -0800305 vma = find_extend_vma(mm, bprm->p);
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700306 if (!vma)
307 return -EFAULT;
308
Linus Torvalds1da177e2005-04-16 15:20:36 -0700309 /* Now, let's put argc (and argv, envp if appropriate) on the stack */
310 if (__put_user(argc, sp++))
311 return -EFAULT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700312
Kees Cook67c67772017-07-10 15:52:54 -0700313 /* Populate list of argv pointers back to argv strings. */
Alexey Dobriyan03c6d722020-01-30 22:16:58 -0800314 p = mm->arg_end = mm->arg_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700315 while (argc-- > 0) {
316 size_t len;
Kees Cook67c67772017-07-10 15:52:54 -0700317 if (__put_user((elf_addr_t)p, sp++))
Heiko Carstens841d5fb2006-12-06 20:36:35 -0800318 return -EFAULT;
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700319 len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);
320 if (!len || len > MAX_ARG_STRLEN)
WANG Cong23c49712008-05-08 21:52:33 +0800321 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700322 p += len;
323 }
Kees Cook67c67772017-07-10 15:52:54 -0700324 if (__put_user(0, sp++))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700325 return -EFAULT;
Alexey Dobriyan03c6d722020-01-30 22:16:58 -0800326 mm->arg_end = p;
Kees Cook67c67772017-07-10 15:52:54 -0700327
328 /* Populate list of envp pointers back to envp strings. */
Alexey Dobriyan03c6d722020-01-30 22:16:58 -0800329 mm->env_end = mm->env_start = p;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700330 while (envc-- > 0) {
331 size_t len;
Kees Cook67c67772017-07-10 15:52:54 -0700332 if (__put_user((elf_addr_t)p, sp++))
Heiko Carstens841d5fb2006-12-06 20:36:35 -0800333 return -EFAULT;
Ollie Wildb6a2fea2007-07-19 01:48:16 -0700334 len = strnlen_user((void __user *)p, MAX_ARG_STRLEN);
335 if (!len || len > MAX_ARG_STRLEN)
WANG Cong23c49712008-05-08 21:52:33 +0800336 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700337 p += len;
338 }
Kees Cook67c67772017-07-10 15:52:54 -0700339 if (__put_user(0, sp++))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700340 return -EFAULT;
Alexey Dobriyan03c6d722020-01-30 22:16:58 -0800341 mm->env_end = p;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700342
343 /* Put the elf_info on the stack in the right place. */
Alexey Dobriyan03c6d722020-01-30 22:16:58 -0800344 if (copy_to_user(sp, mm->saved_auxv, ei_index * sizeof(elf_addr_t)))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700345 return -EFAULT;
346 return 0;
347}
348
James Hoganc07380b2011-05-09 10:58:40 +0100349#ifndef elf_map
350
Linus Torvalds1da177e2005-04-16 15:20:36 -0700351static unsigned long elf_map(struct file *filep, unsigned long addr,
Alexey Dobriyan49ac9812019-03-07 16:29:03 -0800352 const struct elf_phdr *eppnt, int prot, int type,
Jiri Kosinacc503c12008-01-30 13:31:07 +0100353 unsigned long total_size)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700354{
355 unsigned long map_addr;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100356 unsigned long size = eppnt->p_filesz + ELF_PAGEOFFSET(eppnt->p_vaddr);
357 unsigned long off = eppnt->p_offset - ELF_PAGEOFFSET(eppnt->p_vaddr);
358 addr = ELF_PAGESTART(addr);
359 size = ELF_PAGEALIGN(size);
Jan Kratochvil60bfba72007-07-15 23:40:06 -0700360
Andrew Mortond4e3cc32007-07-21 04:37:32 -0700361 /* mmap() will return -EINVAL if given a zero size, but a
362 * segment with zero filesize is perfectly valid */
Jiri Kosinacc503c12008-01-30 13:31:07 +0100363 if (!size)
364 return addr;
365
Jiri Kosinacc503c12008-01-30 13:31:07 +0100366 /*
367 * total_size is the size of the ELF (interpreter) image.
368 * The _first_ mmap needs to know the full size, otherwise
369 * randomization might put this image into an overlapping
370 * position with the ELF binary image. (since size < total_size)
371 * So we first map the 'big' image - and unmap the remainder at
372 * the end. (which unmap is needed for ELF images with holes.)
373 */
374 if (total_size) {
375 total_size = ELF_PAGEALIGN(total_size);
Al Viro5a5e4c22012-05-30 01:49:38 -0400376 map_addr = vm_mmap(filep, addr, total_size, prot, type, off);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100377 if (!BAD_ADDR(map_addr))
Al Viro5a5e4c22012-05-30 01:49:38 -0400378 vm_munmap(map_addr+size, total_size-size);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100379 } else
Al Viro5a5e4c22012-05-30 01:49:38 -0400380 map_addr = vm_mmap(filep, addr, size, prot, type, off);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100381
Tetsuo Handad23a61e2018-04-20 14:56:13 -0700382 if ((type & MAP_FIXED_NOREPLACE) &&
383 PTR_ERR((void *)map_addr) == -EEXIST)
384 pr_info("%d (%s): Uhuuh, elf segment at %px requested but the memory is mapped already\n",
385 task_pid_nr(current), current->comm, (void *)addr);
Michal Hocko4ed28632018-04-10 16:36:01 -0700386
Linus Torvalds1da177e2005-04-16 15:20:36 -0700387 return(map_addr);
388}
389
James Hoganc07380b2011-05-09 10:58:40 +0100390#endif /* !elf_map */
391
Alexey Dobriyan49ac9812019-03-07 16:29:03 -0800392static unsigned long total_mapping_size(const struct elf_phdr *cmds, int nr)
Jiri Kosinacc503c12008-01-30 13:31:07 +0100393{
394 int i, first_idx = -1, last_idx = -1;
395
396 for (i = 0; i < nr; i++) {
397 if (cmds[i].p_type == PT_LOAD) {
398 last_idx = i;
399 if (first_idx == -1)
400 first_idx = i;
401 }
402 }
403 if (first_idx == -1)
404 return 0;
405
406 return cmds[last_idx].p_vaddr + cmds[last_idx].p_memsz -
407 ELF_PAGESTART(cmds[first_idx].p_vaddr);
408}
409
Alexey Dobriyan658c0332019-12-04 16:52:25 -0800410static int elf_read(struct file *file, void *buf, size_t len, loff_t pos)
411{
412 ssize_t rv;
413
414 rv = kernel_read(file, buf, len, &pos);
415 if (unlikely(rv != len)) {
416 return (rv < 0) ? rv : -EIO;
417 }
418 return 0;
419}
420
Paul Burton6a8d3892014-09-11 08:30:14 +0100421/**
422 * load_elf_phdrs() - load ELF program headers
423 * @elf_ex: ELF header of the binary whose program headers should be loaded
424 * @elf_file: the opened ELF binary file
425 *
426 * Loads ELF program headers from the binary file elf_file, which has the ELF
427 * header pointed to by elf_ex, into a newly allocated array. The caller is
428 * responsible for freeing the allocated data. Returns an ERR_PTR upon failure.
429 */
Alexey Dobriyan49ac9812019-03-07 16:29:03 -0800430static struct elf_phdr *load_elf_phdrs(const struct elfhdr *elf_ex,
Paul Burton6a8d3892014-09-11 08:30:14 +0100431 struct file *elf_file)
432{
433 struct elf_phdr *elf_phdata = NULL;
Alexey Dobriyanfaf1c312019-03-07 16:28:56 -0800434 int retval, err = -1;
Alexey Dobriyanfaf1c312019-03-07 16:28:56 -0800435 unsigned int size;
Paul Burton6a8d3892014-09-11 08:30:14 +0100436
437 /*
438 * If the size of this structure has changed, then punt, since
439 * we will be doing the wrong thing.
440 */
441 if (elf_ex->e_phentsize != sizeof(struct elf_phdr))
442 goto out;
443
444 /* Sanity check the number of program headers... */
Paul Burton6a8d3892014-09-11 08:30:14 +0100445 /* ...and their total size. */
446 size = sizeof(struct elf_phdr) * elf_ex->e_phnum;
Alexey Dobriyanfaf1c312019-03-07 16:28:56 -0800447 if (size == 0 || size > 65536 || size > ELF_MIN_ALIGN)
Paul Burton6a8d3892014-09-11 08:30:14 +0100448 goto out;
449
450 elf_phdata = kmalloc(size, GFP_KERNEL);
451 if (!elf_phdata)
452 goto out;
453
454 /* Read in the program headers */
Alexey Dobriyan658c0332019-12-04 16:52:25 -0800455 retval = elf_read(elf_file, elf_phdata, size, elf_ex->e_phoff);
456 if (retval < 0) {
457 err = retval;
Paul Burton6a8d3892014-09-11 08:30:14 +0100458 goto out;
459 }
460
461 /* Success! */
462 err = 0;
463out:
464 if (err) {
465 kfree(elf_phdata);
466 elf_phdata = NULL;
467 }
468 return elf_phdata;
469}
Jiri Kosinacc503c12008-01-30 13:31:07 +0100470
Paul Burton774c1052014-09-11 08:30:16 +0100471#ifndef CONFIG_ARCH_BINFMT_ELF_STATE
472
473/**
474 * struct arch_elf_state - arch-specific ELF loading state
475 *
476 * This structure is used to preserve architecture specific data during
477 * the loading of an ELF file, throughout the checking of architecture
478 * specific ELF headers & through to the point where the ELF load is
479 * known to be proceeding (ie. SET_PERSONALITY).
480 *
481 * This implementation is a dummy for architectures which require no
482 * specific state.
483 */
484struct arch_elf_state {
485};
486
487#define INIT_ARCH_ELF_STATE {}
488
489/**
490 * arch_elf_pt_proc() - check a PT_LOPROC..PT_HIPROC ELF program header
491 * @ehdr: The main ELF header
492 * @phdr: The program header to check
493 * @elf: The open ELF file
494 * @is_interp: True if the phdr is from the interpreter of the ELF being
495 * loaded, else false.
496 * @state: Architecture-specific state preserved throughout the process
497 * of loading the ELF.
498 *
499 * Inspects the program header phdr to validate its correctness and/or
500 * suitability for the system. Called once per ELF program header in the
501 * range PT_LOPROC to PT_HIPROC, for both the ELF being loaded and its
502 * interpreter.
503 *
504 * Return: Zero to proceed with the ELF load, non-zero to fail the ELF load
505 * with that return code.
506 */
507static inline int arch_elf_pt_proc(struct elfhdr *ehdr,
508 struct elf_phdr *phdr,
509 struct file *elf, bool is_interp,
510 struct arch_elf_state *state)
511{
512 /* Dummy implementation, always proceed */
513 return 0;
514}
515
516/**
Maciej W. Rozycki54d157142015-10-26 15:47:57 +0000517 * arch_check_elf() - check an ELF executable
Paul Burton774c1052014-09-11 08:30:16 +0100518 * @ehdr: The main ELF header
519 * @has_interp: True if the ELF has an interpreter, else false.
Maciej W. Rozyckieb4bc072015-11-13 00:47:48 +0000520 * @interp_ehdr: The interpreter's ELF header
Paul Burton774c1052014-09-11 08:30:16 +0100521 * @state: Architecture-specific state preserved throughout the process
522 * of loading the ELF.
523 *
524 * Provides a final opportunity for architecture code to reject the loading
525 * of the ELF & cause an exec syscall to return an error. This is called after
526 * all program headers to be checked by arch_elf_pt_proc have been.
527 *
528 * Return: Zero to proceed with the ELF load, non-zero to fail the ELF load
529 * with that return code.
530 */
531static inline int arch_check_elf(struct elfhdr *ehdr, bool has_interp,
Maciej W. Rozyckieb4bc072015-11-13 00:47:48 +0000532 struct elfhdr *interp_ehdr,
Paul Burton774c1052014-09-11 08:30:16 +0100533 struct arch_elf_state *state)
534{
535 /* Dummy implementation, always proceed */
536 return 0;
537}
538
539#endif /* !CONFIG_ARCH_BINFMT_ELF_STATE */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700540
Alexey Dobriyand8e7cb32019-05-14 15:43:51 -0700541static inline int make_prot(u32 p_flags)
542{
543 int prot = 0;
544
545 if (p_flags & PF_R)
546 prot |= PROT_READ;
547 if (p_flags & PF_W)
548 prot |= PROT_WRITE;
549 if (p_flags & PF_X)
550 prot |= PROT_EXEC;
551 return prot;
552}
553
Linus Torvalds1da177e2005-04-16 15:20:36 -0700554/* This is much more generalized than the library routine read function,
555 so we keep this separate. Technically the library read function
556 is only provided so that we can read a.out libraries that have
557 an ELF header */
558
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700559static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
Alexey Dobriyan81696d52019-12-04 16:52:22 -0800560 struct file *interpreter,
Paul Burtona9d9ef12014-09-11 08:30:15 +0100561 unsigned long no_base, struct elf_phdr *interp_elf_phdata)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700562{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700563 struct elf_phdr *eppnt;
564 unsigned long load_addr = 0;
565 int load_addr_set = 0;
566 unsigned long last_bss = 0, elf_bss = 0;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800567 int bss_prot = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700568 unsigned long error = ~0UL;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100569 unsigned long total_size;
Paul Burton6a8d3892014-09-11 08:30:14 +0100570 int i;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700571
572 /* First of all, some simple consistency checks */
573 if (interp_elf_ex->e_type != ET_EXEC &&
574 interp_elf_ex->e_type != ET_DYN)
575 goto out;
Nicolas Pitre47552002017-08-16 16:05:13 -0400576 if (!elf_check_arch(interp_elf_ex) ||
577 elf_check_fdpic(interp_elf_ex))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700578 goto out;
Al Viro72c2d532013-09-22 16:27:52 -0400579 if (!interpreter->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700580 goto out;
581
Paul Burtona9d9ef12014-09-11 08:30:15 +0100582 total_size = total_mapping_size(interp_elf_phdata,
583 interp_elf_ex->e_phnum);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100584 if (!total_size) {
585 error = -EINVAL;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100586 goto out;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100587 }
588
Paul Burtona9d9ef12014-09-11 08:30:15 +0100589 eppnt = interp_elf_phdata;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700590 for (i = 0; i < interp_elf_ex->e_phnum; i++, eppnt++) {
591 if (eppnt->p_type == PT_LOAD) {
592 int elf_type = MAP_PRIVATE | MAP_DENYWRITE;
Alexey Dobriyand8e7cb32019-05-14 15:43:51 -0700593 int elf_prot = make_prot(eppnt->p_flags);
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700594 unsigned long vaddr = 0;
595 unsigned long k, map_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700596
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700597 vaddr = eppnt->p_vaddr;
598 if (interp_elf_ex->e_type == ET_EXEC || load_addr_set)
Michal Hocko4ed28632018-04-10 16:36:01 -0700599 elf_type |= MAP_FIXED_NOREPLACE;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100600 else if (no_base && interp_elf_ex->e_type == ET_DYN)
601 load_addr = -vaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700602
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700603 map_addr = elf_map(interpreter, load_addr + vaddr,
Andrew Mortonbb1ad822008-01-30 13:31:07 +0100604 eppnt, elf_prot, elf_type, total_size);
Jiri Kosinacc503c12008-01-30 13:31:07 +0100605 total_size = 0;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700606 error = map_addr;
607 if (BAD_ADDR(map_addr))
Paul Burtona9d9ef12014-09-11 08:30:15 +0100608 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700609
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700610 if (!load_addr_set &&
611 interp_elf_ex->e_type == ET_DYN) {
612 load_addr = map_addr - ELF_PAGESTART(vaddr);
613 load_addr_set = 1;
614 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700615
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700616 /*
617 * Check to see if the section's size will overflow the
618 * allowed task size. Note that p_filesz must always be
619 * <= p_memsize so it's only necessary to check p_memsz.
620 */
621 k = load_addr + eppnt->p_vaddr;
Chuck Ebbertce510592006-07-03 00:24:14 -0700622 if (BAD_ADDR(k) ||
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700623 eppnt->p_filesz > eppnt->p_memsz ||
624 eppnt->p_memsz > TASK_SIZE ||
625 TASK_SIZE - eppnt->p_memsz < k) {
626 error = -ENOMEM;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100627 goto out;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700628 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700629
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700630 /*
631 * Find the end of the file mapping for this phdr, and
632 * keep track of the largest address we see for this.
633 */
634 k = load_addr + eppnt->p_vaddr + eppnt->p_filesz;
635 if (k > elf_bss)
636 elf_bss = k;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700637
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700638 /*
639 * Do the same thing for the memory mapping - between
640 * elf_bss and last_bss is the bss section.
641 */
Kees Cook0036d1f2016-08-02 14:04:51 -0700642 k = load_addr + eppnt->p_vaddr + eppnt->p_memsz;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800643 if (k > last_bss) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700644 last_bss = k;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800645 bss_prot = elf_prot;
646 }
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700647 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700648 }
649
Kees Cook0036d1f2016-08-02 14:04:51 -0700650 /*
651 * Now fill out the bss section: first pad the last page from
652 * the file up to the page boundary, and zero it from elf_bss
653 * up to the end of the page.
654 */
655 if (padzero(elf_bss)) {
656 error = -EFAULT;
657 goto out;
658 }
659 /*
660 * Next, align both the file and mem bss up to the page size,
661 * since this is where elf_bss was just zeroed up to, and where
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800662 * last_bss will end after the vm_brk_flags() below.
Kees Cook0036d1f2016-08-02 14:04:51 -0700663 */
664 elf_bss = ELF_PAGEALIGN(elf_bss);
665 last_bss = ELF_PAGEALIGN(last_bss);
666 /* Finally, if there is still more bss to allocate, do it. */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700667 if (last_bss > elf_bss) {
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800668 error = vm_brk_flags(elf_bss, last_bss - elf_bss,
669 bss_prot & PROT_EXEC ? VM_EXEC : 0);
Linus Torvalds5d22fc22016-05-27 15:57:31 -0700670 if (error)
Paul Burtona9d9ef12014-09-11 08:30:15 +0100671 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700672 }
673
Jiri Kosinacc503c12008-01-30 13:31:07 +0100674 error = load_addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700675out:
676 return error;
677}
678
Linus Torvalds1da177e2005-04-16 15:20:36 -0700679/*
680 * These are the functions used to load ELF style executables and shared
681 * libraries. There is no binary dependent code anywhere else.
682 */
683
Al Viro71613c32012-10-20 22:00:48 -0400684static int load_elf_binary(struct linux_binprm *bprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700685{
686 struct file *interpreter = NULL; /* to shut gcc up */
687 unsigned long load_addr = 0, load_bias = 0;
688 int load_addr_set = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700689 unsigned long error;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100690 struct elf_phdr *elf_ppnt, *elf_phdata, *interp_elf_phdata = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700691 unsigned long elf_bss, elf_brk;
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800692 int bss_prot = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700693 int retval, i;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100694 unsigned long elf_entry;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800695 unsigned long e_entry;
Jiri Kosinacc503c12008-01-30 13:31:07 +0100696 unsigned long interp_load_addr = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700697 unsigned long start_code, end_code, start_data, end_data;
David Daney1a530a62011-03-22 16:34:48 -0700698 unsigned long reloc_func_desc __maybe_unused = 0;
David Rientjes8de61e62006-12-06 20:40:16 -0800699 int executable_stack = EXSTACK_DEFAULT;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800700 struct elfhdr *elf_ex = (struct elfhdr *)bprm->buf;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700701 struct {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700702 struct elfhdr interp_elf_ex;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700703 } *loc;
Paul Burton774c1052014-09-11 08:30:16 +0100704 struct arch_elf_state arch_state = INIT_ARCH_ELF_STATE;
Alexey Dobriyan03c6d722020-01-30 22:16:58 -0800705 struct mm_struct *mm;
Alexey Dobriyan249b08e2019-05-14 15:43:54 -0700706 struct pt_regs *regs;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700707
708 loc = kmalloc(sizeof(*loc), GFP_KERNEL);
709 if (!loc) {
710 retval = -ENOMEM;
711 goto out_ret;
712 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700713
714 retval = -ENOEXEC;
715 /* First of all, some simple consistency checks */
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800716 if (memcmp(elf_ex->e_ident, ELFMAG, SELFMAG) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700717 goto out;
718
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800719 if (elf_ex->e_type != ET_EXEC && elf_ex->e_type != ET_DYN)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700720 goto out;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800721 if (!elf_check_arch(elf_ex))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700722 goto out;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800723 if (elf_check_fdpic(elf_ex))
Nicolas Pitre47552002017-08-16 16:05:13 -0400724 goto out;
Al Viro72c2d532013-09-22 16:27:52 -0400725 if (!bprm->file->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700726 goto out;
727
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800728 elf_phdata = load_elf_phdrs(elf_ex, bprm->file);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700729 if (!elf_phdata)
730 goto out;
731
Linus Torvalds1da177e2005-04-16 15:20:36 -0700732 elf_ppnt = elf_phdata;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800733 for (i = 0; i < elf_ex->e_phnum; i++, elf_ppnt++) {
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700734 char *elf_interpreter;
Alexey Dobriyan5cf4a362019-05-14 15:43:36 -0700735
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700736 if (elf_ppnt->p_type != PT_INTERP)
737 continue;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700738
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700739 /*
740 * This is the program interpreter used for shared libraries -
741 * for now assume that this is an a.out format binary.
742 */
743 retval = -ENOEXEC;
744 if (elf_ppnt->p_filesz > PATH_MAX || elf_ppnt->p_filesz < 2)
745 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700746
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700747 retval = -ENOMEM;
748 elf_interpreter = kmalloc(elf_ppnt->p_filesz, GFP_KERNEL);
749 if (!elf_interpreter)
750 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700751
Alexey Dobriyan658c0332019-12-04 16:52:25 -0800752 retval = elf_read(bprm->file, elf_interpreter, elf_ppnt->p_filesz,
753 elf_ppnt->p_offset);
754 if (retval < 0)
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700755 goto out_free_interp;
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700756 /* make sure path is NULL terminated */
757 retval = -ENOEXEC;
758 if (elf_interpreter[elf_ppnt->p_filesz - 1] != '\0')
759 goto out_free_interp;
Alexey Dobriyan1fb84492007-01-26 00:57:16 -0800760
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700761 interpreter = open_exec(elf_interpreter);
762 kfree(elf_interpreter);
763 retval = PTR_ERR(interpreter);
764 if (IS_ERR(interpreter))
765 goto out_free_ph;
Alexey Dobriyan1fb84492007-01-26 00:57:16 -0800766
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700767 /*
768 * If the binary is not readable then enforce mm->dumpable = 0
769 * regardless of the interpreter's permissions.
770 */
771 would_dump(bprm, interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700772
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700773 /* Get the exec headers */
Alexey Dobriyan658c0332019-12-04 16:52:25 -0800774 retval = elf_read(interpreter, &loc->interp_elf_ex,
775 sizeof(loc->interp_elf_ex), 0);
776 if (retval < 0)
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700777 goto out_free_dentry;
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700778
779 break;
Alexey Dobriyancc338012019-05-14 15:43:39 -0700780
781out_free_interp:
Alexey Dobriyanbe0deb52019-05-14 15:43:45 -0700782 kfree(elf_interpreter);
783 goto out_free_ph;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700784 }
785
786 elf_ppnt = elf_phdata;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800787 for (i = 0; i < elf_ex->e_phnum; i++, elf_ppnt++)
Paul Burton774c1052014-09-11 08:30:16 +0100788 switch (elf_ppnt->p_type) {
789 case PT_GNU_STACK:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700790 if (elf_ppnt->p_flags & PF_X)
791 executable_stack = EXSTACK_ENABLE_X;
792 else
793 executable_stack = EXSTACK_DISABLE_X;
794 break;
Paul Burton774c1052014-09-11 08:30:16 +0100795
796 case PT_LOPROC ... PT_HIPROC:
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800797 retval = arch_elf_pt_proc(elf_ex, elf_ppnt,
Paul Burton774c1052014-09-11 08:30:16 +0100798 bprm->file, false,
799 &arch_state);
800 if (retval)
801 goto out_free_dentry;
802 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700803 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700804
805 /* Some simple consistency checks for the interpreter */
Alexey Dobriyancc338012019-05-14 15:43:39 -0700806 if (interpreter) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700807 retval = -ELIBBAD;
Andi Kleend20894a2008-02-08 04:21:54 -0800808 /* Not an ELF interpreter */
809 if (memcmp(loc->interp_elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700810 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700811 /* Verify the interpreter has a valid arch */
Nicolas Pitre47552002017-08-16 16:05:13 -0400812 if (!elf_check_arch(&loc->interp_elf_ex) ||
813 elf_check_fdpic(&loc->interp_elf_ex))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700814 goto out_free_dentry;
Paul Burtona9d9ef12014-09-11 08:30:15 +0100815
816 /* Load the interpreter program headers */
817 interp_elf_phdata = load_elf_phdrs(&loc->interp_elf_ex,
818 interpreter);
819 if (!interp_elf_phdata)
820 goto out_free_dentry;
Paul Burton774c1052014-09-11 08:30:16 +0100821
822 /* Pass PT_LOPROC..PT_HIPROC headers to arch code */
823 elf_ppnt = interp_elf_phdata;
824 for (i = 0; i < loc->interp_elf_ex.e_phnum; i++, elf_ppnt++)
825 switch (elf_ppnt->p_type) {
826 case PT_LOPROC ... PT_HIPROC:
827 retval = arch_elf_pt_proc(&loc->interp_elf_ex,
828 elf_ppnt, interpreter,
829 true, &arch_state);
830 if (retval)
831 goto out_free_dentry;
832 break;
833 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700834 }
835
Paul Burton774c1052014-09-11 08:30:16 +0100836 /*
837 * Allow arch code to reject the ELF at this point, whilst it's
838 * still possible to return an error to the code that invoked
839 * the exec syscall.
840 */
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800841 retval = arch_check_elf(elf_ex,
Maciej W. Rozyckieb4bc072015-11-13 00:47:48 +0000842 !!interpreter, &loc->interp_elf_ex,
843 &arch_state);
Paul Burton774c1052014-09-11 08:30:16 +0100844 if (retval)
845 goto out_free_dentry;
846
Linus Torvalds1da177e2005-04-16 15:20:36 -0700847 /* Flush all traces of the currently running executable */
848 retval = flush_old_exec(bprm);
849 if (retval)
850 goto out_free_dentry;
851
Linus Torvalds1da177e2005-04-16 15:20:36 -0700852 /* Do this immediately, since STACK_TOP as used in setup_arg_pages
853 may depend on the personality. */
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800854 SET_PERSONALITY2(*elf_ex, &arch_state);
855 if (elf_read_implies_exec(*elf_ex, executable_stack))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700856 current->personality |= READ_IMPLIES_EXEC;
857
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700858 if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700859 current->flags |= PF_RANDOMIZE;
Linus Torvalds221af7f2010-01-28 22:14:42 -0800860
861 setup_new_exec(bprm);
Linus Torvalds9f834ec2016-08-22 16:41:46 -0700862 install_exec_creds(bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700863
864 /* Do this so that we can load the interpreter, if need be. We will
865 change some of these later */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700866 retval = setup_arg_pages(bprm, randomize_stack_top(STACK_TOP),
867 executable_stack);
Al Viro19d860a2014-05-04 20:11:36 -0400868 if (retval < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700869 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700870
Alexey Dobriyan852643162019-05-14 15:43:48 -0700871 elf_bss = 0;
872 elf_brk = 0;
873
874 start_code = ~0UL;
875 end_code = 0;
876 start_data = 0;
877 end_data = 0;
878
André Goddard Rosaaf901ca2009-11-14 13:09:05 -0200879 /* Now we do a little grungy work by mmapping the ELF image into
Jiri Kosinacc503c12008-01-30 13:31:07 +0100880 the correct location in memory. */
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700881 for(i = 0, elf_ppnt = elf_phdata;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800882 i < elf_ex->e_phnum; i++, elf_ppnt++) {
Linus Torvaldsb2129212019-10-06 13:53:27 -0700883 int elf_prot, elf_flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700884 unsigned long k, vaddr;
Michael Davidsona87938b2015-04-14 15:47:38 -0700885 unsigned long total_size = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700886
887 if (elf_ppnt->p_type != PT_LOAD)
888 continue;
889
890 if (unlikely (elf_brk > elf_bss)) {
891 unsigned long nbyte;
892
893 /* There was a PT_LOAD segment with p_memsz > p_filesz
894 before this one. Map anonymous pages, if needed,
895 and clear the area. */
Mikael Petterssonf670d0e2011-01-12 17:00:02 -0800896 retval = set_brk(elf_bss + load_bias,
Denys Vlasenko16e72e92017-02-22 15:45:16 -0800897 elf_brk + load_bias,
898 bss_prot);
Al Viro19d860a2014-05-04 20:11:36 -0400899 if (retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700900 goto out_free_dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700901 nbyte = ELF_PAGEOFFSET(elf_bss);
902 if (nbyte) {
903 nbyte = ELF_MIN_ALIGN - nbyte;
904 if (nbyte > elf_brk - elf_bss)
905 nbyte = elf_brk - elf_bss;
906 if (clear_user((void __user *)elf_bss +
907 load_bias, nbyte)) {
908 /*
909 * This bss-zeroing can fail if the ELF
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700910 * file specifies odd protections. So
Linus Torvalds1da177e2005-04-16 15:20:36 -0700911 * we don't check the return value
912 */
913 }
914 }
915 }
916
Alexey Dobriyand8e7cb32019-05-14 15:43:51 -0700917 elf_prot = make_prot(elf_ppnt->p_flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700918
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700919 elf_flags = MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700920
921 vaddr = elf_ppnt->p_vaddr;
Kees Cookeab09532017-07-10 15:52:37 -0700922 /*
923 * If we are loading ET_EXEC or we have already performed
924 * the ET_DYN load_addr calculations, proceed normally.
925 */
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800926 if (elf_ex->e_type == ET_EXEC || load_addr_set) {
Linus Torvaldsb2129212019-10-06 13:53:27 -0700927 elf_flags |= MAP_FIXED;
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800928 } else if (elf_ex->e_type == ET_DYN) {
Kees Cookeab09532017-07-10 15:52:37 -0700929 /*
930 * This logic is run once for the first LOAD Program
931 * Header for ET_DYN binaries to calculate the
932 * randomization (load_bias) for all the LOAD
933 * Program Headers, and to calculate the entire
934 * size of the ELF mapping (total_size). (Note that
935 * load_addr_set is set to true later once the
936 * initial mapping is performed.)
937 *
938 * There are effectively two types of ET_DYN
939 * binaries: programs (i.e. PIE: ET_DYN with INTERP)
940 * and loaders (ET_DYN without INTERP, since they
941 * _are_ the ELF interpreter). The loaders must
942 * be loaded away from programs since the program
943 * may otherwise collide with the loader (especially
944 * for ET_EXEC which does not have a randomized
945 * position). For example to handle invocations of
946 * "./ld.so someprog" to test out a new version of
947 * the loader, the subsequent program that the
948 * loader loads must avoid the loader itself, so
949 * they cannot share the same load range. Sufficient
950 * room for the brk must be allocated with the
951 * loader as well, since brk must be available with
952 * the loader.
953 *
954 * Therefore, programs are loaded offset from
955 * ELF_ET_DYN_BASE and loaders are loaded into the
956 * independently randomized mmap region (0 load_bias
957 * without MAP_FIXED).
958 */
Alexey Dobriyancc338012019-05-14 15:43:39 -0700959 if (interpreter) {
Kees Cookeab09532017-07-10 15:52:37 -0700960 load_bias = ELF_ET_DYN_BASE;
961 if (current->flags & PF_RANDOMIZE)
962 load_bias += arch_mmap_rnd();
Linus Torvaldsb2129212019-10-06 13:53:27 -0700963 elf_flags |= MAP_FIXED;
Kees Cookeab09532017-07-10 15:52:37 -0700964 } else
965 load_bias = 0;
966
967 /*
968 * Since load_bias is used for all subsequent loading
969 * calculations, we must lower it by the first vaddr
970 * so that the remaining calculations based on the
971 * ELF vaddrs will be correctly offset. The result
972 * is then page aligned.
973 */
974 load_bias = ELF_PAGESTART(load_bias - vaddr);
975
Michael Davidsona87938b2015-04-14 15:47:38 -0700976 total_size = total_mapping_size(elf_phdata,
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800977 elf_ex->e_phnum);
Michael Davidsona87938b2015-04-14 15:47:38 -0700978 if (!total_size) {
Andrew Morton2b1d3ae2015-05-28 15:44:24 -0700979 retval = -EINVAL;
Michael Davidsona87938b2015-04-14 15:47:38 -0700980 goto out_free_dentry;
981 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700982 }
983
Jesper Juhlf4e5cc22006-06-23 02:05:35 -0700984 error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt,
Michael Davidsona87938b2015-04-14 15:47:38 -0700985 elf_prot, elf_flags, total_size);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700986 if (BAD_ADDR(error)) {
Alexey Kuznetsovb140f2512007-05-08 00:31:57 -0700987 retval = IS_ERR((void *)error) ?
988 PTR_ERR((void*)error) : -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700989 goto out_free_dentry;
990 }
991
992 if (!load_addr_set) {
993 load_addr_set = 1;
994 load_addr = (elf_ppnt->p_vaddr - elf_ppnt->p_offset);
Alexey Dobriyana62c5b12020-01-30 22:16:55 -0800995 if (elf_ex->e_type == ET_DYN) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700996 load_bias += error -
997 ELF_PAGESTART(load_bias + vaddr);
998 load_addr += load_bias;
999 reloc_func_desc = load_bias;
1000 }
1001 }
1002 k = elf_ppnt->p_vaddr;
Alexey Dobriyanf67ef442020-01-30 22:16:52 -08001003 if ((elf_ppnt->p_flags & PF_X) && k < start_code)
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001004 start_code = k;
1005 if (start_data < k)
1006 start_data = k;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001007
1008 /*
1009 * Check to see if the section's size will overflow the
1010 * allowed task size. Note that p_filesz must always be
1011 * <= p_memsz so it is only necessary to check p_memsz.
1012 */
Chuck Ebbertce510592006-07-03 00:24:14 -07001013 if (BAD_ADDR(k) || elf_ppnt->p_filesz > elf_ppnt->p_memsz ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07001014 elf_ppnt->p_memsz > TASK_SIZE ||
1015 TASK_SIZE - elf_ppnt->p_memsz < k) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001016 /* set_brk can never work. Avoid overflows. */
Alexey Kuznetsovb140f2512007-05-08 00:31:57 -07001017 retval = -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001018 goto out_free_dentry;
1019 }
1020
1021 k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz;
1022
1023 if (k > elf_bss)
1024 elf_bss = k;
1025 if ((elf_ppnt->p_flags & PF_X) && end_code < k)
1026 end_code = k;
1027 if (end_data < k)
1028 end_data = k;
1029 k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz;
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001030 if (k > elf_brk) {
1031 bss_prot = elf_prot;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001032 elf_brk = k;
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001033 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001034 }
1035
Alexey Dobriyana62c5b12020-01-30 22:16:55 -08001036 e_entry = elf_ex->e_entry + load_bias;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001037 elf_bss += load_bias;
1038 elf_brk += load_bias;
1039 start_code += load_bias;
1040 end_code += load_bias;
1041 start_data += load_bias;
1042 end_data += load_bias;
1043
1044 /* Calling set_brk effectively mmaps the pages that we need
1045 * for the bss and break sections. We must do this before
1046 * mapping in the interpreter, to make sure it doesn't wind
1047 * up getting placed where the bss needs to go.
1048 */
Denys Vlasenko16e72e92017-02-22 15:45:16 -08001049 retval = set_brk(elf_bss, elf_brk, bss_prot);
Al Viro19d860a2014-05-04 20:11:36 -04001050 if (retval)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001051 goto out_free_dentry;
akpm@osdl.org6de50512005-10-11 08:29:08 -07001052 if (likely(elf_bss != elf_brk) && unlikely(padzero(elf_bss))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001053 retval = -EFAULT; /* Nobody gets to see this, but.. */
1054 goto out_free_dentry;
1055 }
1056
Alexey Dobriyancc338012019-05-14 15:43:39 -07001057 if (interpreter) {
Andi Kleend20894a2008-02-08 04:21:54 -08001058 elf_entry = load_elf_interp(&loc->interp_elf_ex,
1059 interpreter,
Paul Burtona9d9ef12014-09-11 08:30:15 +01001060 load_bias, interp_elf_phdata);
Andi Kleend20894a2008-02-08 04:21:54 -08001061 if (!IS_ERR((void *)elf_entry)) {
1062 /*
1063 * load_elf_interp() returns relocation
1064 * adjustment
1065 */
1066 interp_load_addr = elf_entry;
1067 elf_entry += loc->interp_elf_ex.e_entry;
Jiri Kosinacc503c12008-01-30 13:31:07 +01001068 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001069 if (BAD_ADDR(elf_entry)) {
Chuck Ebbertce510592006-07-03 00:24:14 -07001070 retval = IS_ERR((void *)elf_entry) ?
1071 (int)elf_entry : -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001072 goto out_free_dentry;
1073 }
1074 reloc_func_desc = interp_load_addr;
1075
1076 allow_write_access(interpreter);
1077 fput(interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001078 } else {
Alexey Dobriyana62c5b12020-01-30 22:16:55 -08001079 elf_entry = e_entry;
Suresh Siddha5342fba2006-02-26 04:18:28 +01001080 if (BAD_ADDR(elf_entry)) {
Chuck Ebbertce510592006-07-03 00:24:14 -07001081 retval = -EINVAL;
Suresh Siddha5342fba2006-02-26 04:18:28 +01001082 goto out_free_dentry;
1083 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001084 }
1085
Paul Burton774c1052014-09-11 08:30:16 +01001086 kfree(interp_elf_phdata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001087 kfree(elf_phdata);
1088
Linus Torvalds1da177e2005-04-16 15:20:36 -07001089 set_binfmt(&elf_format);
1090
Benjamin Herrenschmidt547ee842005-04-16 15:24:35 -07001091#ifdef ARCH_HAS_SETUP_ADDITIONAL_PAGES
Alexey Dobriyancc338012019-05-14 15:43:39 -07001092 retval = arch_setup_additional_pages(bprm, !!interpreter);
Al Viro19d860a2014-05-04 20:11:36 -04001093 if (retval < 0)
Roland McGrath18c8baff2005-04-28 15:17:19 -07001094 goto out;
Benjamin Herrenschmidt547ee842005-04-16 15:24:35 -07001095#endif /* ARCH_HAS_SETUP_ADDITIONAL_PAGES */
1096
Alexey Dobriyana62c5b12020-01-30 22:16:55 -08001097 retval = create_elf_tables(bprm, elf_ex,
1098 load_addr, interp_load_addr, e_entry);
Al Viro19d860a2014-05-04 20:11:36 -04001099 if (retval < 0)
Ollie Wildb6a2fea2007-07-19 01:48:16 -07001100 goto out;
Alexey Dobriyan03c6d722020-01-30 22:16:58 -08001101
1102 mm = current->mm;
1103 mm->end_code = end_code;
1104 mm->start_code = start_code;
1105 mm->start_data = start_data;
1106 mm->end_data = end_data;
1107 mm->start_stack = bprm->p;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001108
Jiri Kosina4471a672011-04-14 15:22:09 -07001109 if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1)) {
Kees Cookbbdc6072019-05-14 15:43:57 -07001110 /*
1111 * For architectures with ELF randomization, when executing
1112 * a loader directly (i.e. no interpreter listed in ELF
1113 * headers), move the brk area out of the mmap region
1114 * (since it grows up, and may collide early with the stack
1115 * growing down), and into the unused ELF_ET_DYN_BASE region.
1116 */
Kees Cook7be3cb02019-09-26 10:15:25 -07001117 if (IS_ENABLED(CONFIG_ARCH_HAS_ELF_RANDOMIZE) &&
Alexey Dobriyan03c6d722020-01-30 22:16:58 -08001118 elf_ex->e_type == ET_DYN && !interpreter) {
1119 mm->brk = mm->start_brk = ELF_ET_DYN_BASE;
1120 }
Kees Cookbbdc6072019-05-14 15:43:57 -07001121
Alexey Dobriyan03c6d722020-01-30 22:16:58 -08001122 mm->brk = mm->start_brk = arch_randomize_brk(mm);
Kees Cook204db6e2015-04-14 15:48:12 -07001123#ifdef compat_brk_randomized
Jiri Kosina4471a672011-04-14 15:22:09 -07001124 current->brk_randomized = 1;
1125#endif
1126 }
Jiri Kosinac1d171a2008-01-30 13:30:40 +01001127
Linus Torvalds1da177e2005-04-16 15:20:36 -07001128 if (current->personality & MMAP_PAGE_ZERO) {
1129 /* Why this, you ask??? Well SVr4 maps page 0 as read-only,
1130 and some applications "depend" upon this behavior.
1131 Since we do not have the power to recompile these, we
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001132 emulate the SVr4 behavior. Sigh. */
Linus Torvalds6be5ceb2012-04-20 17:13:58 -07001133 error = vm_mmap(NULL, 0, PAGE_SIZE, PROT_READ | PROT_EXEC,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001134 MAP_FIXED | MAP_PRIVATE, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001135 }
1136
Alexey Dobriyan249b08e2019-05-14 15:43:54 -07001137 regs = current_pt_regs();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001138#ifdef ELF_PLAT_INIT
1139 /*
1140 * The ABI may specify that certain registers be set up in special
1141 * ways (on i386 %edx is the address of a DT_FINI function, for
1142 * example. In addition, it may also specify (eg, PowerPC64 ELF)
1143 * that the e_entry field is the address of the function descriptor
1144 * for the startup routine, rather than the address of the startup
1145 * routine itself. This macro performs whatever initialization to
1146 * the regs structure is required as well as any relocations to the
1147 * function descriptor entries when executing dynamically links apps.
1148 */
1149 ELF_PLAT_INIT(regs, reloc_func_desc);
1150#endif
1151
Kees Cookb8383832018-04-10 16:34:57 -07001152 finalize_exec(bprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001153 start_thread(regs, elf_entry, bprm->p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001154 retval = 0;
1155out:
1156 kfree(loc);
1157out_ret:
1158 return retval;
1159
1160 /* error cleanup */
1161out_free_dentry:
Paul Burtona9d9ef12014-09-11 08:30:15 +01001162 kfree(interp_elf_phdata);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163 allow_write_access(interpreter);
1164 if (interpreter)
1165 fput(interpreter);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001166out_free_ph:
1167 kfree(elf_phdata);
1168 goto out;
1169}
1170
Josh Triplett69369a72014-04-03 14:48:27 -07001171#ifdef CONFIG_USELIB
Linus Torvalds1da177e2005-04-16 15:20:36 -07001172/* This is really simpleminded and specialized - we are loading an
1173 a.out library that is given an ELF header. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001174static int load_elf_library(struct file *file)
1175{
1176 struct elf_phdr *elf_phdata;
1177 struct elf_phdr *eppnt;
1178 unsigned long elf_bss, bss, len;
1179 int retval, error, i, j;
1180 struct elfhdr elf_ex;
1181
1182 error = -ENOEXEC;
Alexey Dobriyan658c0332019-12-04 16:52:25 -08001183 retval = elf_read(file, &elf_ex, sizeof(elf_ex), 0);
1184 if (retval < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001185 goto out;
1186
1187 if (memcmp(elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
1188 goto out;
1189
1190 /* First of all, some simple consistency checks */
1191 if (elf_ex.e_type != ET_EXEC || elf_ex.e_phnum > 2 ||
Al Viro72c2d532013-09-22 16:27:52 -04001192 !elf_check_arch(&elf_ex) || !file->f_op->mmap)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001193 goto out;
Nicolas Pitre47552002017-08-16 16:05:13 -04001194 if (elf_check_fdpic(&elf_ex))
1195 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001196
1197 /* Now read in all of the header information */
1198
1199 j = sizeof(struct elf_phdr) * elf_ex.e_phnum;
1200 /* j < ELF_MIN_ALIGN because elf_ex.e_phnum <= 2 */
1201
1202 error = -ENOMEM;
1203 elf_phdata = kmalloc(j, GFP_KERNEL);
1204 if (!elf_phdata)
1205 goto out;
1206
1207 eppnt = elf_phdata;
1208 error = -ENOEXEC;
Alexey Dobriyan658c0332019-12-04 16:52:25 -08001209 retval = elf_read(file, eppnt, j, elf_ex.e_phoff);
1210 if (retval < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001211 goto out_free_ph;
1212
1213 for (j = 0, i = 0; i<elf_ex.e_phnum; i++)
1214 if ((eppnt + i)->p_type == PT_LOAD)
1215 j++;
1216 if (j != 1)
1217 goto out_free_ph;
1218
1219 while (eppnt->p_type != PT_LOAD)
1220 eppnt++;
1221
1222 /* Now use mmap to map the library into memory. */
Linus Torvalds6be5ceb2012-04-20 17:13:58 -07001223 error = vm_mmap(file,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001224 ELF_PAGESTART(eppnt->p_vaddr),
1225 (eppnt->p_filesz +
1226 ELF_PAGEOFFSET(eppnt->p_vaddr)),
1227 PROT_READ | PROT_WRITE | PROT_EXEC,
Michal Hocko4ed28632018-04-10 16:36:01 -07001228 MAP_FIXED_NOREPLACE | MAP_PRIVATE | MAP_DENYWRITE,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001229 (eppnt->p_offset -
1230 ELF_PAGEOFFSET(eppnt->p_vaddr)));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001231 if (error != ELF_PAGESTART(eppnt->p_vaddr))
1232 goto out_free_ph;
1233
1234 elf_bss = eppnt->p_vaddr + eppnt->p_filesz;
1235 if (padzero(elf_bss)) {
1236 error = -EFAULT;
1237 goto out_free_ph;
1238 }
1239
Oscar Salvador24962af2018-07-13 16:59:13 -07001240 len = ELF_PAGEALIGN(eppnt->p_filesz + eppnt->p_vaddr);
1241 bss = ELF_PAGEALIGN(eppnt->p_memsz + eppnt->p_vaddr);
Michal Hockoecc2bc82016-05-23 16:25:39 -07001242 if (bss > len) {
1243 error = vm_brk(len, bss - len);
Linus Torvalds5d22fc22016-05-27 15:57:31 -07001244 if (error)
Michal Hockoecc2bc82016-05-23 16:25:39 -07001245 goto out_free_ph;
1246 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001247 error = 0;
1248
1249out_free_ph:
1250 kfree(elf_phdata);
1251out:
1252 return error;
1253}
Josh Triplett69369a72014-04-03 14:48:27 -07001254#endif /* #ifdef CONFIG_USELIB */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001255
Christoph Hellwig698ba7b2009-12-15 16:47:37 -08001256#ifdef CONFIG_ELF_CORE
Linus Torvalds1da177e2005-04-16 15:20:36 -07001257/*
1258 * ELF core dumper
1259 *
1260 * Modelled on fs/exec.c:aout_core_dump()
1261 * Jeremy Fitzhardinge <jeremy@sw.oz.au>
1262 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001263
1264/*
Jason Baron909af762012-03-23 15:02:51 -07001265 * The purpose of always_dump_vma() is to make sure that special kernel mappings
1266 * that are useful for post-mortem analysis are included in every core dump.
1267 * In that way we ensure that the core dump is fully interpretable later
1268 * without matching up the same kernel and hardware config to see what PC values
1269 * meant. These special mappings include - vDSO, vsyscall, and other
1270 * architecture specific mappings
1271 */
1272static bool always_dump_vma(struct vm_area_struct *vma)
1273{
1274 /* Any vsyscall mappings? */
1275 if (vma == get_gate_vma(vma->vm_mm))
1276 return true;
Andy Lutomirski78d683e2014-05-19 15:58:32 -07001277
1278 /*
1279 * Assume that all vmas with a .name op should always be dumped.
1280 * If this changes, a new vm_ops field can easily be added.
1281 */
1282 if (vma->vm_ops && vma->vm_ops->name && vma->vm_ops->name(vma))
1283 return true;
1284
Jason Baron909af762012-03-23 15:02:51 -07001285 /*
1286 * arch_vma_name() returns non-NULL for special architecture mappings,
1287 * such as vDSO sections.
1288 */
1289 if (arch_vma_name(vma))
1290 return true;
1291
1292 return false;
1293}
1294
1295/*
Roland McGrath82df3972007-10-16 23:27:02 -07001296 * Decide what to dump of a segment, part, all or none.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001297 */
Roland McGrath82df3972007-10-16 23:27:02 -07001298static unsigned long vma_dump_size(struct vm_area_struct *vma,
1299 unsigned long mm_flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001300{
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001301#define FILTER(type) (mm_flags & (1UL << MMF_DUMP_##type))
1302
Jason Baron909af762012-03-23 15:02:51 -07001303 /* always dump the vdso and vsyscall sections */
1304 if (always_dump_vma(vma))
Roland McGrath82df3972007-10-16 23:27:02 -07001305 goto whole;
Roland McGrathe5b97dd2007-01-26 00:56:48 -08001306
Konstantin Khlebnikov0103bd12012-10-08 16:28:59 -07001307 if (vma->vm_flags & VM_DONTDUMP)
Jason Baronaccb61f2012-03-23 15:02:51 -07001308 return 0;
1309
Ross Zwisler50378352015-10-05 16:33:36 -06001310 /* support for DAX */
1311 if (vma_is_dax(vma)) {
1312 if ((vma->vm_flags & VM_SHARED) && FILTER(DAX_SHARED))
1313 goto whole;
1314 if (!(vma->vm_flags & VM_SHARED) && FILTER(DAX_PRIVATE))
1315 goto whole;
1316 return 0;
1317 }
1318
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001319 /* Hugetlb memory check */
1320 if (vma->vm_flags & VM_HUGETLB) {
1321 if ((vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_SHARED))
1322 goto whole;
1323 if (!(vma->vm_flags & VM_SHARED) && FILTER(HUGETLB_PRIVATE))
1324 goto whole;
Naoya Horiguchi23d9e482013-04-17 15:58:28 -07001325 return 0;
KOSAKI Motohiroe575f112008-10-18 20:27:08 -07001326 }
1327
Linus Torvalds1da177e2005-04-16 15:20:36 -07001328 /* Do not dump I/O mapped devices or special mappings */
Konstantin Khlebnikov314e51b2012-10-08 16:29:02 -07001329 if (vma->vm_flags & VM_IO)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001330 return 0;
1331
Kawai, Hidehiroa1b59e82007-07-19 01:48:29 -07001332 /* By default, dump shared memory if mapped from an anonymous file. */
1333 if (vma->vm_flags & VM_SHARED) {
Al Viro496ad9a2013-01-23 17:07:38 -05001334 if (file_inode(vma->vm_file)->i_nlink == 0 ?
Roland McGrath82df3972007-10-16 23:27:02 -07001335 FILTER(ANON_SHARED) : FILTER(MAPPED_SHARED))
1336 goto whole;
1337 return 0;
Kawai, Hidehiroa1b59e82007-07-19 01:48:29 -07001338 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001339
Roland McGrath82df3972007-10-16 23:27:02 -07001340 /* Dump segments that have been written to. */
1341 if (vma->anon_vma && FILTER(ANON_PRIVATE))
1342 goto whole;
1343 if (vma->vm_file == NULL)
1344 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001345
Roland McGrath82df3972007-10-16 23:27:02 -07001346 if (FILTER(MAPPED_PRIVATE))
1347 goto whole;
1348
1349 /*
1350 * If this looks like the beginning of a DSO or executable mapping,
1351 * check for an ELF header. If we find one, dump the first page to
1352 * aid in determining what was mapped here.
1353 */
Roland McGrath92dc07b2009-02-06 17:34:07 -08001354 if (FILTER(ELF_HEADERS) &&
1355 vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) {
Roland McGrath82df3972007-10-16 23:27:02 -07001356 u32 __user *header = (u32 __user *) vma->vm_start;
1357 u32 word;
Roland McGrath92dc07b2009-02-06 17:34:07 -08001358 mm_segment_t fs = get_fs();
Roland McGrath82df3972007-10-16 23:27:02 -07001359 /*
1360 * Doing it this way gets the constant folded by GCC.
1361 */
1362 union {
1363 u32 cmp;
1364 char elfmag[SELFMAG];
1365 } magic;
1366 BUILD_BUG_ON(SELFMAG != sizeof word);
1367 magic.elfmag[EI_MAG0] = ELFMAG0;
1368 magic.elfmag[EI_MAG1] = ELFMAG1;
1369 magic.elfmag[EI_MAG2] = ELFMAG2;
1370 magic.elfmag[EI_MAG3] = ELFMAG3;
Roland McGrath92dc07b2009-02-06 17:34:07 -08001371 /*
1372 * Switch to the user "segment" for get_user(),
1373 * then put back what elf_core_dump() had in place.
1374 */
1375 set_fs(USER_DS);
1376 if (unlikely(get_user(word, header)))
1377 word = 0;
1378 set_fs(fs);
1379 if (word == magic.cmp)
Roland McGrath82df3972007-10-16 23:27:02 -07001380 return PAGE_SIZE;
1381 }
1382
1383#undef FILTER
1384
1385 return 0;
1386
1387whole:
1388 return vma->vm_end - vma->vm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001389}
1390
Linus Torvalds1da177e2005-04-16 15:20:36 -07001391/* An ELF note in memory */
1392struct memelfnote
1393{
1394 const char *name;
1395 int type;
1396 unsigned int datasz;
1397 void *data;
1398};
1399
1400static int notesize(struct memelfnote *en)
1401{
1402 int sz;
1403
1404 sz = sizeof(struct elf_note);
1405 sz += roundup(strlen(en->name) + 1, 4);
1406 sz += roundup(en->datasz, 4);
1407
1408 return sz;
1409}
1410
Al Viroecc8c772013-10-05 15:32:35 -04001411static int writenote(struct memelfnote *men, struct coredump_params *cprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001412{
1413 struct elf_note en;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001414 en.n_namesz = strlen(men->name) + 1;
1415 en.n_descsz = men->datasz;
1416 en.n_type = men->type;
1417
Al Viroecc8c772013-10-05 15:32:35 -04001418 return dump_emit(cprm, &en, sizeof(en)) &&
Al Viro22a8cb82013-10-08 11:05:01 -04001419 dump_emit(cprm, men->name, en.n_namesz) && dump_align(cprm, 4) &&
1420 dump_emit(cprm, men->data, men->datasz) && dump_align(cprm, 4);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001421}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001422
Roland McGrath3aba4812008-01-30 13:31:44 +01001423static void fill_elf_header(struct elfhdr *elf, int segs,
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001424 u16 machine, u32 flags)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001425{
Cyrill Gorcunov6970c8e2008-04-29 01:01:18 -07001426 memset(elf, 0, sizeof(*elf));
1427
Linus Torvalds1da177e2005-04-16 15:20:36 -07001428 memcpy(elf->e_ident, ELFMAG, SELFMAG);
1429 elf->e_ident[EI_CLASS] = ELF_CLASS;
1430 elf->e_ident[EI_DATA] = ELF_DATA;
1431 elf->e_ident[EI_VERSION] = EV_CURRENT;
1432 elf->e_ident[EI_OSABI] = ELF_OSABI;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001433
1434 elf->e_type = ET_CORE;
Roland McGrath3aba4812008-01-30 13:31:44 +01001435 elf->e_machine = machine;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001436 elf->e_version = EV_CURRENT;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001437 elf->e_phoff = sizeof(struct elfhdr);
Roland McGrath3aba4812008-01-30 13:31:44 +01001438 elf->e_flags = flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001439 elf->e_ehsize = sizeof(struct elfhdr);
1440 elf->e_phentsize = sizeof(struct elf_phdr);
1441 elf->e_phnum = segs;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001442}
1443
Andrew Morton8d6b5eee2006-09-25 23:32:04 -07001444static void fill_elf_note_phdr(struct elf_phdr *phdr, int sz, loff_t offset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001445{
1446 phdr->p_type = PT_NOTE;
1447 phdr->p_offset = offset;
1448 phdr->p_vaddr = 0;
1449 phdr->p_paddr = 0;
1450 phdr->p_filesz = sz;
1451 phdr->p_memsz = 0;
1452 phdr->p_flags = 0;
1453 phdr->p_align = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001454}
1455
1456static void fill_note(struct memelfnote *note, const char *name, int type,
1457 unsigned int sz, void *data)
1458{
1459 note->name = name;
1460 note->type = type;
1461 note->datasz = sz;
1462 note->data = data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001463}
1464
1465/*
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001466 * fill up all the fields in prstatus from the given task struct, except
1467 * registers which need to be filled up separately.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001468 */
1469static void fill_prstatus(struct elf_prstatus *prstatus,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001470 struct task_struct *p, long signr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001471{
1472 prstatus->pr_info.si_signo = prstatus->pr_cursig = signr;
1473 prstatus->pr_sigpend = p->pending.signal.sig[0];
1474 prstatus->pr_sighold = p->blocked.sig[0];
Oleg Nesterov3b34fc52009-06-17 16:27:38 -07001475 rcu_read_lock();
1476 prstatus->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1477 rcu_read_unlock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001478 prstatus->pr_pid = task_pid_vnr(p);
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001479 prstatus->pr_pgrp = task_pgrp_vnr(p);
1480 prstatus->pr_sid = task_session_vnr(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001481 if (thread_group_leader(p)) {
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001482 struct task_cputime cputime;
Frank Mayharf06febc2008-09-12 09:54:39 -07001483
Linus Torvalds1da177e2005-04-16 15:20:36 -07001484 /*
Frank Mayharf06febc2008-09-12 09:54:39 -07001485 * This is the record for the group leader. It shows the
1486 * group-wide total, not its individual thread total.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001487 */
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001488 thread_group_cputime(p, &cputime);
Arnd Bergmanne2bb80d2017-11-23 13:46:33 +01001489 prstatus->pr_utime = ns_to_kernel_old_timeval(cputime.utime);
1490 prstatus->pr_stime = ns_to_kernel_old_timeval(cputime.stime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001491 } else {
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001492 u64 utime, stime;
Frederic Weisbecker6fac4822012-11-13 14:20:55 +01001493
Frederic Weisbeckercd19c362017-01-31 04:09:27 +01001494 task_cputime(p, &utime, &stime);
Arnd Bergmanne2bb80d2017-11-23 13:46:33 +01001495 prstatus->pr_utime = ns_to_kernel_old_timeval(utime);
1496 prstatus->pr_stime = ns_to_kernel_old_timeval(stime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001497 }
Frederic Weisbecker5613fda2017-01-31 04:09:23 +01001498
Arnd Bergmanne2bb80d2017-11-23 13:46:33 +01001499 prstatus->pr_cutime = ns_to_kernel_old_timeval(p->signal->cutime);
1500 prstatus->pr_cstime = ns_to_kernel_old_timeval(p->signal->cstime);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001501}
1502
1503static int fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p,
1504 struct mm_struct *mm)
1505{
David Howellsc69e8d92008-11-14 10:39:19 +11001506 const struct cred *cred;
Greg Kroah-Hartmana84a5052005-05-11 00:10:44 -07001507 unsigned int i, len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001508
1509 /* first copy the parameters from user space */
1510 memset(psinfo, 0, sizeof(struct elf_prpsinfo));
1511
1512 len = mm->arg_end - mm->arg_start;
1513 if (len >= ELF_PRARGSZ)
1514 len = ELF_PRARGSZ-1;
1515 if (copy_from_user(&psinfo->pr_psargs,
1516 (const char __user *)mm->arg_start, len))
1517 return -EFAULT;
1518 for(i = 0; i < len; i++)
1519 if (psinfo->pr_psargs[i] == 0)
1520 psinfo->pr_psargs[i] = ' ';
1521 psinfo->pr_psargs[len] = 0;
1522
Oleg Nesterov3b34fc52009-06-17 16:27:38 -07001523 rcu_read_lock();
1524 psinfo->pr_ppid = task_pid_vnr(rcu_dereference(p->real_parent));
1525 rcu_read_unlock();
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001526 psinfo->pr_pid = task_pid_vnr(p);
Pavel Emelyanovb4888932007-10-18 23:40:14 -07001527 psinfo->pr_pgrp = task_pgrp_vnr(p);
1528 psinfo->pr_sid = task_session_vnr(p);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001529
1530 i = p->state ? ffz(~p->state) + 1 : 0;
1531 psinfo->pr_state = i;
Carsten Otte55148542006-03-25 03:08:22 -08001532 psinfo->pr_sname = (i > 5) ? '.' : "RSDTZW"[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001533 psinfo->pr_zomb = psinfo->pr_sname == 'Z';
1534 psinfo->pr_nice = task_nice(p);
1535 psinfo->pr_flag = p->flags;
David Howellsc69e8d92008-11-14 10:39:19 +11001536 rcu_read_lock();
1537 cred = __task_cred(p);
Eric W. Biedermanebc887b2012-02-07 18:36:10 -08001538 SET_UID(psinfo->pr_uid, from_kuid_munged(cred->user_ns, cred->uid));
1539 SET_GID(psinfo->pr_gid, from_kgid_munged(cred->user_ns, cred->gid));
David Howellsc69e8d92008-11-14 10:39:19 +11001540 rcu_read_unlock();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001541 strncpy(psinfo->pr_fname, p->comm, sizeof(psinfo->pr_fname));
1542
1543 return 0;
1544}
1545
Roland McGrath3aba4812008-01-30 13:31:44 +01001546static void fill_auxv_note(struct memelfnote *note, struct mm_struct *mm)
1547{
1548 elf_addr_t *auxv = (elf_addr_t *) mm->saved_auxv;
1549 int i = 0;
1550 do
1551 i += 2;
1552 while (auxv[i - 2] != AT_NULL);
1553 fill_note(note, "CORE", NT_AUXV, i * sizeof(elf_addr_t), auxv);
1554}
1555
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001556static void fill_siginfo_note(struct memelfnote *note, user_siginfo_t *csigdata,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02001557 const kernel_siginfo_t *siginfo)
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001558{
1559 mm_segment_t old_fs = get_fs();
1560 set_fs(KERNEL_DS);
1561 copy_siginfo_to_user((user_siginfo_t __user *) csigdata, siginfo);
1562 set_fs(old_fs);
1563 fill_note(note, "CORE", NT_SIGINFO, sizeof(*csigdata), csigdata);
1564}
1565
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001566#define MAX_FILE_NOTE_SIZE (4*1024*1024)
1567/*
1568 * Format of NT_FILE note:
1569 *
1570 * long count -- how many files are mapped
1571 * long page_size -- units for file_ofs
1572 * array of [COUNT] elements of
1573 * long start
1574 * long end
1575 * long file_ofs
1576 * followed by COUNT filenames in ASCII: "FILE1" NUL "FILE2" NUL...
1577 */
Dan Aloni72023652013-09-30 13:45:02 -07001578static int fill_files_note(struct memelfnote *note)
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001579{
Alexey Dobriyan03c6d722020-01-30 22:16:58 -08001580 struct mm_struct *mm = current->mm;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001581 struct vm_area_struct *vma;
1582 unsigned count, size, names_ofs, remaining, n;
1583 user_long_t *data;
1584 user_long_t *start_end_ofs;
1585 char *name_base, *name_curpos;
1586
1587 /* *Estimated* file count and total data size needed */
Alexey Dobriyan03c6d722020-01-30 22:16:58 -08001588 count = mm->map_count;
Alexey Dobriyan60c9d922018-02-06 15:39:13 -08001589 if (count > UINT_MAX / 64)
1590 return -EINVAL;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001591 size = count * 64;
1592
1593 names_ofs = (2 + 3 * count) * sizeof(data[0]);
1594 alloc:
1595 if (size >= MAX_FILE_NOTE_SIZE) /* paranoia check */
Dan Aloni72023652013-09-30 13:45:02 -07001596 return -EINVAL;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001597 size = round_up(size, PAGE_SIZE);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001598 data = kvmalloc(size, GFP_KERNEL);
1599 if (ZERO_OR_NULL_PTR(data))
Dan Aloni72023652013-09-30 13:45:02 -07001600 return -ENOMEM;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001601
1602 start_end_ofs = data + 2;
1603 name_base = name_curpos = ((char *)data) + names_ofs;
1604 remaining = size - names_ofs;
1605 count = 0;
Alexey Dobriyan03c6d722020-01-30 22:16:58 -08001606 for (vma = mm->mmap; vma != NULL; vma = vma->vm_next) {
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001607 struct file *file;
1608 const char *filename;
1609
1610 file = vma->vm_file;
1611 if (!file)
1612 continue;
Miklos Szeredi9bf39ab2015-06-19 10:29:13 +02001613 filename = file_path(file, name_curpos, remaining);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001614 if (IS_ERR(filename)) {
1615 if (PTR_ERR(filename) == -ENAMETOOLONG) {
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001616 kvfree(data);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001617 size = size * 5 / 4;
1618 goto alloc;
1619 }
1620 continue;
1621 }
1622
Miklos Szeredi9bf39ab2015-06-19 10:29:13 +02001623 /* file_path() fills at the end, move name down */
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001624 /* n = strlen(filename) + 1: */
1625 n = (name_curpos + remaining) - filename;
1626 remaining = filename - name_curpos;
1627 memmove(name_curpos, filename, n);
1628 name_curpos += n;
1629
1630 *start_end_ofs++ = vma->vm_start;
1631 *start_end_ofs++ = vma->vm_end;
1632 *start_end_ofs++ = vma->vm_pgoff;
1633 count++;
1634 }
1635
1636 /* Now we know exact count of files, can store it */
1637 data[0] = count;
1638 data[1] = PAGE_SIZE;
1639 /*
Alexey Dobriyan03c6d722020-01-30 22:16:58 -08001640 * Count usually is less than mm->map_count,
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001641 * we need to move filenames down.
1642 */
Alexey Dobriyan03c6d722020-01-30 22:16:58 -08001643 n = mm->map_count - count;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001644 if (n != 0) {
1645 unsigned shift_bytes = n * 3 * sizeof(data[0]);
1646 memmove(name_base - shift_bytes, name_base,
1647 name_curpos - name_base);
1648 name_curpos -= shift_bytes;
1649 }
1650
1651 size = name_curpos - (char *)data;
1652 fill_note(note, "CORE", NT_FILE, size, data);
Dan Aloni72023652013-09-30 13:45:02 -07001653 return 0;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001654}
1655
Roland McGrath4206d3a2008-01-30 13:31:45 +01001656#ifdef CORE_DUMP_USE_REGSET
1657#include <linux/regset.h>
1658
1659struct elf_thread_core_info {
1660 struct elf_thread_core_info *next;
1661 struct task_struct *task;
1662 struct elf_prstatus prstatus;
1663 struct memelfnote notes[0];
1664};
1665
1666struct elf_note_info {
1667 struct elf_thread_core_info *thread;
1668 struct memelfnote psinfo;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001669 struct memelfnote signote;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001670 struct memelfnote auxv;
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001671 struct memelfnote files;
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001672 user_siginfo_t csigdata;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001673 size_t size;
1674 int thread_notes;
1675};
1676
Roland McGrathd31472b2008-03-04 14:28:30 -08001677/*
1678 * When a regset has a writeback hook, we call it on each thread before
1679 * dumping user memory. On register window machines, this makes sure the
1680 * user memory backing the register data is up to date before we read it.
1681 */
1682static void do_thread_regset_writeback(struct task_struct *task,
1683 const struct user_regset *regset)
1684{
1685 if (regset->writeback)
1686 regset->writeback(task, regset, 1);
1687}
1688
H. J. Lu0953f65d2012-02-14 13:34:52 -08001689#ifndef PRSTATUS_SIZE
Dmitry Safonov90954e72016-09-05 16:33:06 +03001690#define PRSTATUS_SIZE(S, R) sizeof(S)
H. J. Lu0953f65d2012-02-14 13:34:52 -08001691#endif
1692
1693#ifndef SET_PR_FPVALID
Dmitry Safonov90954e72016-09-05 16:33:06 +03001694#define SET_PR_FPVALID(S, V, R) ((S)->pr_fpvalid = (V))
H. J. Lu0953f65d2012-02-14 13:34:52 -08001695#endif
1696
Roland McGrath4206d3a2008-01-30 13:31:45 +01001697static int fill_thread_core_info(struct elf_thread_core_info *t,
1698 const struct user_regset_view *view,
1699 long signr, size_t *total)
1700{
1701 unsigned int i;
Dave Martin27e64b42017-10-31 15:50:53 +00001702 unsigned int regset0_size = regset_size(t->task, &view->regsets[0]);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001703
1704 /*
1705 * NT_PRSTATUS is the one special case, because the regset data
1706 * goes into the pr_reg field inside the note contents, rather
1707 * than being the whole note contents. We fill the reset in here.
1708 * We assume that regset 0 is NT_PRSTATUS.
1709 */
1710 fill_prstatus(&t->prstatus, t->task, signr);
Dave Martin27e64b42017-10-31 15:50:53 +00001711 (void) view->regsets[0].get(t->task, &view->regsets[0], 0, regset0_size,
Dmitry Safonov90954e72016-09-05 16:33:06 +03001712 &t->prstatus.pr_reg, NULL);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001713
1714 fill_note(&t->notes[0], "CORE", NT_PRSTATUS,
Dave Martin27e64b42017-10-31 15:50:53 +00001715 PRSTATUS_SIZE(t->prstatus, regset0_size), &t->prstatus);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001716 *total += notesize(&t->notes[0]);
1717
Roland McGrathd31472b2008-03-04 14:28:30 -08001718 do_thread_regset_writeback(t->task, &view->regsets[0]);
1719
Roland McGrath4206d3a2008-01-30 13:31:45 +01001720 /*
1721 * Each other regset might generate a note too. For each regset
1722 * that has no core_note_type or is inactive, we leave t->notes[i]
1723 * all zero and we'll know to skip writing it later.
1724 */
1725 for (i = 1; i < view->n; ++i) {
1726 const struct user_regset *regset = &view->regsets[i];
Roland McGrathd31472b2008-03-04 14:28:30 -08001727 do_thread_regset_writeback(t->task, regset);
H. Peter Anvinc8e25252012-03-02 10:43:48 -08001728 if (regset->core_note_type && regset->get &&
Maciej W. Rozycki2f819db2018-05-15 23:32:45 +01001729 (!regset->active || regset->active(t->task, regset) > 0)) {
Roland McGrath4206d3a2008-01-30 13:31:45 +01001730 int ret;
Dave Martin27e64b42017-10-31 15:50:53 +00001731 size_t size = regset_size(t->task, regset);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001732 void *data = kmalloc(size, GFP_KERNEL);
1733 if (unlikely(!data))
1734 return 0;
1735 ret = regset->get(t->task, regset,
1736 0, size, data, NULL);
1737 if (unlikely(ret))
1738 kfree(data);
1739 else {
1740 if (regset->core_note_type != NT_PRFPREG)
1741 fill_note(&t->notes[i], "LINUX",
1742 regset->core_note_type,
1743 size, data);
1744 else {
Dmitry Safonov90954e72016-09-05 16:33:06 +03001745 SET_PR_FPVALID(&t->prstatus,
Dave Martin27e64b42017-10-31 15:50:53 +00001746 1, regset0_size);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001747 fill_note(&t->notes[i], "CORE",
1748 NT_PRFPREG, size, data);
1749 }
1750 *total += notesize(&t->notes[i]);
1751 }
1752 }
1753 }
1754
1755 return 1;
1756}
1757
1758static int fill_note_info(struct elfhdr *elf, int phdrs,
1759 struct elf_note_info *info,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02001760 const kernel_siginfo_t *siginfo, struct pt_regs *regs)
Roland McGrath4206d3a2008-01-30 13:31:45 +01001761{
1762 struct task_struct *dump_task = current;
1763 const struct user_regset_view *view = task_user_regset_view(dump_task);
1764 struct elf_thread_core_info *t;
1765 struct elf_prpsinfo *psinfo;
Oleg Nesterov83914442008-07-25 01:47:45 -07001766 struct core_thread *ct;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001767 unsigned int i;
1768
1769 info->size = 0;
1770 info->thread = NULL;
1771
1772 psinfo = kmalloc(sizeof(*psinfo), GFP_KERNEL);
Alan Cox6899e922012-12-17 16:02:09 -08001773 if (psinfo == NULL) {
1774 info->psinfo.data = NULL; /* So we don't free this wrongly */
Roland McGrath4206d3a2008-01-30 13:31:45 +01001775 return 0;
Alan Cox6899e922012-12-17 16:02:09 -08001776 }
Roland McGrath4206d3a2008-01-30 13:31:45 +01001777
Amerigo Wange2dbe122009-07-01 01:06:26 -04001778 fill_note(&info->psinfo, "CORE", NT_PRPSINFO, sizeof(*psinfo), psinfo);
1779
Roland McGrath4206d3a2008-01-30 13:31:45 +01001780 /*
1781 * Figure out how many notes we're going to need for each thread.
1782 */
1783 info->thread_notes = 0;
1784 for (i = 0; i < view->n; ++i)
1785 if (view->regsets[i].core_note_type != 0)
1786 ++info->thread_notes;
1787
1788 /*
1789 * Sanity check. We rely on regset 0 being in NT_PRSTATUS,
1790 * since it is our one special case.
1791 */
1792 if (unlikely(info->thread_notes == 0) ||
1793 unlikely(view->regsets[0].core_note_type != NT_PRSTATUS)) {
1794 WARN_ON(1);
1795 return 0;
1796 }
1797
1798 /*
1799 * Initialize the ELF file header.
1800 */
1801 fill_elf_header(elf, phdrs,
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08001802 view->e_machine, view->e_flags);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001803
1804 /*
1805 * Allocate a structure for each thread.
1806 */
Oleg Nesterov83914442008-07-25 01:47:45 -07001807 for (ct = &dump_task->mm->core_state->dumper; ct; ct = ct->next) {
1808 t = kzalloc(offsetof(struct elf_thread_core_info,
1809 notes[info->thread_notes]),
1810 GFP_KERNEL);
1811 if (unlikely(!t))
1812 return 0;
Oleg Nesterov24d52882008-07-25 01:47:40 -07001813
Oleg Nesterov83914442008-07-25 01:47:45 -07001814 t->task = ct->task;
1815 if (ct->task == dump_task || !info->thread) {
1816 t->next = info->thread;
1817 info->thread = t;
1818 } else {
1819 /*
1820 * Make sure to keep the original task at
1821 * the head of the list.
1822 */
1823 t->next = info->thread->next;
1824 info->thread->next = t;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001825 }
Oleg Nesterov83914442008-07-25 01:47:45 -07001826 }
Roland McGrath4206d3a2008-01-30 13:31:45 +01001827
1828 /*
1829 * Now fill in each thread's information.
1830 */
1831 for (t = info->thread; t != NULL; t = t->next)
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07001832 if (!fill_thread_core_info(t, view, siginfo->si_signo, &info->size))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001833 return 0;
1834
1835 /*
1836 * Fill in the two process-wide notes.
1837 */
1838 fill_psinfo(psinfo, dump_task->group_leader, dump_task->mm);
1839 info->size += notesize(&info->psinfo);
1840
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001841 fill_siginfo_note(&info->signote, &info->csigdata, siginfo);
1842 info->size += notesize(&info->signote);
1843
Roland McGrath4206d3a2008-01-30 13:31:45 +01001844 fill_auxv_note(&info->auxv, current->mm);
1845 info->size += notesize(&info->auxv);
1846
Dan Aloni72023652013-09-30 13:45:02 -07001847 if (fill_files_note(&info->files) == 0)
1848 info->size += notesize(&info->files);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001849
Roland McGrath4206d3a2008-01-30 13:31:45 +01001850 return 1;
1851}
1852
1853static size_t get_note_info_size(struct elf_note_info *info)
1854{
1855 return info->size;
1856}
1857
1858/*
1859 * Write all the notes for each thread. When writing the first thread, the
1860 * process-wide notes are interleaved after the first thread-specific note.
1861 */
1862static int write_note_info(struct elf_note_info *info,
Al Viroecc8c772013-10-05 15:32:35 -04001863 struct coredump_params *cprm)
Roland McGrath4206d3a2008-01-30 13:31:45 +01001864{
Fabian Frederickb219e252014-06-04 16:12:14 -07001865 bool first = true;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001866 struct elf_thread_core_info *t = info->thread;
1867
1868 do {
1869 int i;
1870
Al Viroecc8c772013-10-05 15:32:35 -04001871 if (!writenote(&t->notes[0], cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001872 return 0;
1873
Al Viroecc8c772013-10-05 15:32:35 -04001874 if (first && !writenote(&info->psinfo, cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001875 return 0;
Al Viroecc8c772013-10-05 15:32:35 -04001876 if (first && !writenote(&info->signote, cprm))
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001877 return 0;
Al Viroecc8c772013-10-05 15:32:35 -04001878 if (first && !writenote(&info->auxv, cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001879 return 0;
Dan Aloni72023652013-09-30 13:45:02 -07001880 if (first && info->files.data &&
Al Viroecc8c772013-10-05 15:32:35 -04001881 !writenote(&info->files, cprm))
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07001882 return 0;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001883
1884 for (i = 1; i < info->thread_notes; ++i)
1885 if (t->notes[i].data &&
Al Viroecc8c772013-10-05 15:32:35 -04001886 !writenote(&t->notes[i], cprm))
Roland McGrath4206d3a2008-01-30 13:31:45 +01001887 return 0;
1888
Fabian Frederickb219e252014-06-04 16:12:14 -07001889 first = false;
Roland McGrath4206d3a2008-01-30 13:31:45 +01001890 t = t->next;
1891 } while (t);
1892
1893 return 1;
1894}
1895
1896static void free_note_info(struct elf_note_info *info)
1897{
1898 struct elf_thread_core_info *threads = info->thread;
1899 while (threads) {
1900 unsigned int i;
1901 struct elf_thread_core_info *t = threads;
1902 threads = t->next;
1903 WARN_ON(t->notes[0].data && t->notes[0].data != &t->prstatus);
1904 for (i = 1; i < info->thread_notes; ++i)
1905 kfree(t->notes[i].data);
1906 kfree(t);
1907 }
1908 kfree(info->psinfo.data);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07001909 kvfree(info->files.data);
Roland McGrath4206d3a2008-01-30 13:31:45 +01001910}
1911
1912#else
1913
Linus Torvalds1da177e2005-04-16 15:20:36 -07001914/* Here is the structure in which status of each thread is captured. */
1915struct elf_thread_status
1916{
1917 struct list_head list;
1918 struct elf_prstatus prstatus; /* NT_PRSTATUS */
1919 elf_fpregset_t fpu; /* NT_PRFPREG */
1920 struct task_struct *thread;
1921#ifdef ELF_CORE_COPY_XFPREGS
Mark Nelson5b20cd82007-10-16 23:25:39 -07001922 elf_fpxregset_t xfpu; /* ELF_CORE_XFPREG_TYPE */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001923#endif
1924 struct memelfnote notes[3];
1925 int num_notes;
1926};
1927
1928/*
1929 * In order to add the specific thread information for the elf file format,
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001930 * we need to keep a linked list of every threads pr_status and then create
1931 * a single section for them in the final core file.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001932 */
1933static int elf_dump_thread_status(long signr, struct elf_thread_status *t)
1934{
1935 int sz = 0;
1936 struct task_struct *p = t->thread;
1937 t->num_notes = 0;
1938
1939 fill_prstatus(&t->prstatus, p, signr);
1940 elf_core_copy_task_regs(p, &t->prstatus.pr_reg);
1941
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001942 fill_note(&t->notes[0], "CORE", NT_PRSTATUS, sizeof(t->prstatus),
1943 &(t->prstatus));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001944 t->num_notes++;
1945 sz += notesize(&t->notes[0]);
1946
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07001947 if ((t->prstatus.pr_fpvalid = elf_core_copy_task_fpregs(p, NULL,
1948 &t->fpu))) {
1949 fill_note(&t->notes[1], "CORE", NT_PRFPREG, sizeof(t->fpu),
1950 &(t->fpu));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001951 t->num_notes++;
1952 sz += notesize(&t->notes[1]);
1953 }
1954
1955#ifdef ELF_CORE_COPY_XFPREGS
1956 if (elf_core_copy_task_xfpregs(p, &t->xfpu)) {
Mark Nelson5b20cd82007-10-16 23:25:39 -07001957 fill_note(&t->notes[2], "LINUX", ELF_CORE_XFPREG_TYPE,
1958 sizeof(t->xfpu), &t->xfpu);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001959 t->num_notes++;
1960 sz += notesize(&t->notes[2]);
1961 }
1962#endif
1963 return sz;
1964}
1965
Roland McGrath3aba4812008-01-30 13:31:44 +01001966struct elf_note_info {
1967 struct memelfnote *notes;
Dan Aloni72023652013-09-30 13:45:02 -07001968 struct memelfnote *notes_files;
Roland McGrath3aba4812008-01-30 13:31:44 +01001969 struct elf_prstatus *prstatus; /* NT_PRSTATUS */
1970 struct elf_prpsinfo *psinfo; /* NT_PRPSINFO */
1971 struct list_head thread_list;
1972 elf_fpregset_t *fpu;
1973#ifdef ELF_CORE_COPY_XFPREGS
1974 elf_fpxregset_t *xfpu;
1975#endif
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001976 user_siginfo_t csigdata;
Roland McGrath3aba4812008-01-30 13:31:44 +01001977 int thread_status_size;
1978 int numnote;
1979};
1980
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001981static int elf_note_info_init(struct elf_note_info *info)
Roland McGrath3aba4812008-01-30 13:31:44 +01001982{
Amerigo Wang0cf062d2009-09-23 15:57:05 -07001983 memset(info, 0, sizeof(*info));
Roland McGrath3aba4812008-01-30 13:31:44 +01001984 INIT_LIST_HEAD(&info->thread_list);
1985
Denys Vlasenko49ae4d42012-10-04 17:15:35 -07001986 /* Allocate space for ELF notes */
Kees Cook6da2ec52018-06-12 13:55:00 -07001987 info->notes = kmalloc_array(8, sizeof(struct memelfnote), GFP_KERNEL);
Roland McGrath3aba4812008-01-30 13:31:44 +01001988 if (!info->notes)
1989 return 0;
1990 info->psinfo = kmalloc(sizeof(*info->psinfo), GFP_KERNEL);
1991 if (!info->psinfo)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10001992 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01001993 info->prstatus = kmalloc(sizeof(*info->prstatus), GFP_KERNEL);
1994 if (!info->prstatus)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10001995 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01001996 info->fpu = kmalloc(sizeof(*info->fpu), GFP_KERNEL);
1997 if (!info->fpu)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10001998 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01001999#ifdef ELF_CORE_COPY_XFPREGS
2000 info->xfpu = kmalloc(sizeof(*info->xfpu), GFP_KERNEL);
2001 if (!info->xfpu)
Denys Vlasenkof34f9d12012-09-26 11:34:50 +10002002 return 0;
Roland McGrath3aba4812008-01-30 13:31:44 +01002003#endif
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002004 return 1;
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002005}
Roland McGrath3aba4812008-01-30 13:31:44 +01002006
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002007static int fill_note_info(struct elfhdr *elf, int phdrs,
2008 struct elf_note_info *info,
Eric W. Biedermanae7795b2018-09-25 11:27:20 +02002009 const kernel_siginfo_t *siginfo, struct pt_regs *regs)
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002010{
Al Viroafabada2013-10-14 07:39:56 -04002011 struct core_thread *ct;
2012 struct elf_thread_status *ets;
Amerigo Wang0cf062d2009-09-23 15:57:05 -07002013
2014 if (!elf_note_info_init(info))
2015 return 0;
2016
Al Viroafabada2013-10-14 07:39:56 -04002017 for (ct = current->mm->core_state->dumper.next;
2018 ct; ct = ct->next) {
2019 ets = kzalloc(sizeof(*ets), GFP_KERNEL);
2020 if (!ets)
2021 return 0;
Oleg Nesterov24d52882008-07-25 01:47:40 -07002022
Al Viroafabada2013-10-14 07:39:56 -04002023 ets->thread = ct->task;
2024 list_add(&ets->list, &info->thread_list);
2025 }
Oleg Nesterov83914442008-07-25 01:47:45 -07002026
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002027 list_for_each_entry(ets, &info->thread_list, list) {
Al Viroafabada2013-10-14 07:39:56 -04002028 int sz;
Oleg Nesterov83914442008-07-25 01:47:45 -07002029
Al Viroafabada2013-10-14 07:39:56 -04002030 sz = elf_dump_thread_status(siginfo->si_signo, ets);
2031 info->thread_status_size += sz;
Roland McGrath3aba4812008-01-30 13:31:44 +01002032 }
2033 /* now collect the dump for the current */
2034 memset(info->prstatus, 0, sizeof(*info->prstatus));
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07002035 fill_prstatus(info->prstatus, current, siginfo->si_signo);
Roland McGrath3aba4812008-01-30 13:31:44 +01002036 elf_core_copy_regs(&info->prstatus->pr_reg, regs);
2037
2038 /* Set up header */
Zhang Yanfeid3330cf2013-02-21 16:44:20 -08002039 fill_elf_header(elf, phdrs, ELF_ARCH, ELF_CORE_EFLAGS);
Roland McGrath3aba4812008-01-30 13:31:44 +01002040
2041 /*
2042 * Set up the notes in similar form to SVR4 core dumps made
2043 * with info from their /proc.
2044 */
2045
2046 fill_note(info->notes + 0, "CORE", NT_PRSTATUS,
2047 sizeof(*info->prstatus), info->prstatus);
2048 fill_psinfo(info->psinfo, current->group_leader, current->mm);
2049 fill_note(info->notes + 1, "CORE", NT_PRPSINFO,
2050 sizeof(*info->psinfo), info->psinfo);
2051
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07002052 fill_siginfo_note(info->notes + 2, &info->csigdata, siginfo);
2053 fill_auxv_note(info->notes + 3, current->mm);
Dan Aloni72023652013-09-30 13:45:02 -07002054 info->numnote = 4;
Roland McGrath3aba4812008-01-30 13:31:44 +01002055
Dan Aloni72023652013-09-30 13:45:02 -07002056 if (fill_files_note(info->notes + info->numnote) == 0) {
2057 info->notes_files = info->notes + info->numnote;
2058 info->numnote++;
2059 }
Roland McGrath3aba4812008-01-30 13:31:44 +01002060
2061 /* Try to dump the FPU. */
2062 info->prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, regs,
2063 info->fpu);
2064 if (info->prstatus->pr_fpvalid)
2065 fill_note(info->notes + info->numnote++,
2066 "CORE", NT_PRFPREG, sizeof(*info->fpu), info->fpu);
2067#ifdef ELF_CORE_COPY_XFPREGS
2068 if (elf_core_copy_task_xfpregs(current, info->xfpu))
2069 fill_note(info->notes + info->numnote++,
2070 "LINUX", ELF_CORE_XFPREG_TYPE,
2071 sizeof(*info->xfpu), info->xfpu);
2072#endif
2073
2074 return 1;
Roland McGrath3aba4812008-01-30 13:31:44 +01002075}
2076
2077static size_t get_note_info_size(struct elf_note_info *info)
2078{
2079 int sz = 0;
2080 int i;
2081
2082 for (i = 0; i < info->numnote; i++)
2083 sz += notesize(info->notes + i);
2084
2085 sz += info->thread_status_size;
2086
2087 return sz;
2088}
2089
2090static int write_note_info(struct elf_note_info *info,
Al Viroecc8c772013-10-05 15:32:35 -04002091 struct coredump_params *cprm)
Roland McGrath3aba4812008-01-30 13:31:44 +01002092{
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002093 struct elf_thread_status *ets;
Roland McGrath3aba4812008-01-30 13:31:44 +01002094 int i;
Roland McGrath3aba4812008-01-30 13:31:44 +01002095
2096 for (i = 0; i < info->numnote; i++)
Al Viroecc8c772013-10-05 15:32:35 -04002097 if (!writenote(info->notes + i, cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002098 return 0;
2099
2100 /* write out the thread status notes section */
Alexey Dobriyan93f044e2019-03-07 16:28:59 -08002101 list_for_each_entry(ets, &info->thread_list, list) {
2102 for (i = 0; i < ets->num_notes; i++)
2103 if (!writenote(&ets->notes[i], cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002104 return 0;
2105 }
2106
2107 return 1;
2108}
2109
2110static void free_note_info(struct elf_note_info *info)
2111{
2112 while (!list_empty(&info->thread_list)) {
2113 struct list_head *tmp = info->thread_list.next;
2114 list_del(tmp);
2115 kfree(list_entry(tmp, struct elf_thread_status, list));
2116 }
2117
Dan Aloni72023652013-09-30 13:45:02 -07002118 /* Free data possibly allocated by fill_files_note(): */
2119 if (info->notes_files)
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002120 kvfree(info->notes_files->data);
Denys Vlasenko2aa362c2012-10-04 17:15:36 -07002121
Roland McGrath3aba4812008-01-30 13:31:44 +01002122 kfree(info->prstatus);
2123 kfree(info->psinfo);
2124 kfree(info->notes);
2125 kfree(info->fpu);
2126#ifdef ELF_CORE_COPY_XFPREGS
2127 kfree(info->xfpu);
2128#endif
2129}
2130
Roland McGrath4206d3a2008-01-30 13:31:45 +01002131#endif
2132
Roland McGrathf47aef52007-01-26 00:56:49 -08002133static struct vm_area_struct *first_vma(struct task_struct *tsk,
2134 struct vm_area_struct *gate_vma)
2135{
2136 struct vm_area_struct *ret = tsk->mm->mmap;
2137
2138 if (ret)
2139 return ret;
2140 return gate_vma;
2141}
2142/*
2143 * Helper function for iterating across a vma list. It ensures that the caller
2144 * will visit `gate_vma' prior to terminating the search.
2145 */
2146static struct vm_area_struct *next_vma(struct vm_area_struct *this_vma,
2147 struct vm_area_struct *gate_vma)
2148{
2149 struct vm_area_struct *ret;
2150
2151 ret = this_vma->vm_next;
2152 if (ret)
2153 return ret;
2154 if (this_vma == gate_vma)
2155 return NULL;
2156 return gate_vma;
2157}
2158
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002159static void fill_extnum_info(struct elfhdr *elf, struct elf_shdr *shdr4extnum,
2160 elf_addr_t e_shoff, int segs)
2161{
2162 elf->e_shoff = e_shoff;
2163 elf->e_shentsize = sizeof(*shdr4extnum);
2164 elf->e_shnum = 1;
2165 elf->e_shstrndx = SHN_UNDEF;
2166
2167 memset(shdr4extnum, 0, sizeof(*shdr4extnum));
2168
2169 shdr4extnum->sh_type = SHT_NULL;
2170 shdr4extnum->sh_size = elf->e_shnum;
2171 shdr4extnum->sh_link = elf->e_shstrndx;
2172 shdr4extnum->sh_info = segs;
2173}
2174
Linus Torvalds1da177e2005-04-16 15:20:36 -07002175/*
2176 * Actual dumper
2177 *
2178 * This is a two-pass process; first we find the offsets of the bits,
2179 * and then they are actually written out. If we run out of core limit
2180 * we just truncate.
2181 */
Masami Hiramatsuf6151df2009-12-17 15:27:16 -08002182static int elf_core_dump(struct coredump_params *cprm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002183{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002184 int has_dumped = 0;
2185 mm_segment_t fs;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002186 int segs, i;
2187 size_t vma_data_size = 0;
Roland McGrathf47aef52007-01-26 00:56:49 -08002188 struct vm_area_struct *vma, *gate_vma;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002189 struct elfhdr *elf = NULL;
Al Virocdc3d562013-10-05 22:24:29 -04002190 loff_t offset = 0, dataoff;
Dan Aloni72023652013-09-30 13:45:02 -07002191 struct elf_note_info info = { };
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002192 struct elf_phdr *phdr4note = NULL;
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002193 struct elf_shdr *shdr4extnum = NULL;
2194 Elf_Half e_phnum;
2195 elf_addr_t e_shoff;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002196 elf_addr_t *vma_filesz = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002197
2198 /*
2199 * We no longer stop all VM operations.
2200 *
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002201 * This is because those proceses that could possibly change map_count
2202 * or the mmap / vma pages are now blocked in do_exit on current
2203 * finishing this core dump.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002204 *
2205 * Only ptrace can touch these memory addresses, but it doesn't change
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002206 * the map_count or the pages allocated. So no possibility of crashing
Linus Torvalds1da177e2005-04-16 15:20:36 -07002207 * exists while dumping the mm->vm_next areas to the core file.
2208 */
2209
2210 /* alloc memory for large data structures: too large to be on stack */
2211 elf = kmalloc(sizeof(*elf), GFP_KERNEL);
2212 if (!elf)
WANG Cong5f719552008-05-06 12:45:35 +08002213 goto out;
KAMEZAWA Hiroyuki341c87b2009-06-30 11:41:23 -07002214 /*
2215 * The number of segs are recored into ELF header as 16bit value.
2216 * Please check DEFAULT_MAX_MAP_COUNT definition when you modify here.
2217 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002218 segs = current->mm->map_count;
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002219 segs += elf_core_extra_phdrs();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002220
Stephen Wilson31db58b2011-03-13 15:49:15 -04002221 gate_vma = get_gate_vma(current->mm);
Roland McGrathf47aef52007-01-26 00:56:49 -08002222 if (gate_vma != NULL)
2223 segs++;
2224
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002225 /* for notes section */
2226 segs++;
2227
2228 /* If segs > PN_XNUM(0xffff), then e_phnum overflows. To avoid
2229 * this, kernel supports extended numbering. Have a look at
2230 * include/linux/elf.h for further information. */
2231 e_phnum = segs > PN_XNUM ? PN_XNUM : segs;
2232
Roland McGrath3aba4812008-01-30 13:31:44 +01002233 /*
2234 * Collect all the non-memory information about the process for the
2235 * notes. This also sets up the file header.
2236 */
Denys Vlasenko5ab1c302012-10-04 17:15:29 -07002237 if (!fill_note_info(elf, e_phnum, &info, cprm->siginfo, cprm->regs))
Roland McGrath3aba4812008-01-30 13:31:44 +01002238 goto cleanup;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002239
2240 has_dumped = 1;
Oleg Nesterov079148b2013-04-30 15:28:16 -07002241
Linus Torvalds1da177e2005-04-16 15:20:36 -07002242 fs = get_fs();
2243 set_fs(KERNEL_DS);
2244
Linus Torvalds1da177e2005-04-16 15:20:36 -07002245 offset += sizeof(*elf); /* Elf header */
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002246 offset += segs * sizeof(struct elf_phdr); /* Program headers */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002247
2248 /* Write notes phdr entry */
2249 {
Roland McGrath3aba4812008-01-30 13:31:44 +01002250 size_t sz = get_note_info_size(&info);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002251
Michael Ellermane5501492007-09-19 14:38:12 +10002252 sz += elf_coredump_extra_notes_size();
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +01002253
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002254 phdr4note = kmalloc(sizeof(*phdr4note), GFP_KERNEL);
2255 if (!phdr4note)
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -08002256 goto end_coredump;
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002257
2258 fill_elf_note_phdr(phdr4note, sz, offset);
2259 offset += sz;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002260 }
2261
Linus Torvalds1da177e2005-04-16 15:20:36 -07002262 dataoff = offset = roundup(offset, ELF_EXEC_PAGESIZE);
2263
Jason Baron30f74aa2016-12-12 16:46:40 -08002264 if (segs - 1 > ULONG_MAX / sizeof(*vma_filesz))
2265 goto end_coredump;
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002266 vma_filesz = kvmalloc(array_size(sizeof(*vma_filesz), (segs - 1)),
2267 GFP_KERNEL);
2268 if (ZERO_OR_NULL_PTR(vma_filesz))
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002269 goto end_coredump;
2270
2271 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
2272 vma = next_vma(vma, gate_vma)) {
2273 unsigned long dump_size;
2274
2275 dump_size = vma_dump_size(vma, cprm->mm_flags);
2276 vma_filesz[i++] = dump_size;
2277 vma_data_size += dump_size;
2278 }
2279
2280 offset += vma_data_size;
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002281 offset += elf_core_extra_data_size();
2282 e_shoff = offset;
2283
2284 if (e_phnum == PN_XNUM) {
2285 shdr4extnum = kmalloc(sizeof(*shdr4extnum), GFP_KERNEL);
2286 if (!shdr4extnum)
2287 goto end_coredump;
2288 fill_extnum_info(elf, shdr4extnum, e_shoff, segs);
2289 }
2290
2291 offset = dataoff;
2292
Al Viroecc8c772013-10-05 15:32:35 -04002293 if (!dump_emit(cprm, elf, sizeof(*elf)))
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002294 goto end_coredump;
2295
Al Viroecc8c772013-10-05 15:32:35 -04002296 if (!dump_emit(cprm, phdr4note, sizeof(*phdr4note)))
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002297 goto end_coredump;
2298
Linus Torvalds1da177e2005-04-16 15:20:36 -07002299 /* Write program headers for segments dump */
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002300 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
Roland McGrathf47aef52007-01-26 00:56:49 -08002301 vma = next_vma(vma, gate_vma)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002302 struct elf_phdr phdr;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002303
2304 phdr.p_type = PT_LOAD;
2305 phdr.p_offset = offset;
2306 phdr.p_vaddr = vma->vm_start;
2307 phdr.p_paddr = 0;
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002308 phdr.p_filesz = vma_filesz[i++];
Roland McGrath82df3972007-10-16 23:27:02 -07002309 phdr.p_memsz = vma->vm_end - vma->vm_start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002310 offset += phdr.p_filesz;
2311 phdr.p_flags = vma->vm_flags & VM_READ ? PF_R : 0;
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002312 if (vma->vm_flags & VM_WRITE)
2313 phdr.p_flags |= PF_W;
2314 if (vma->vm_flags & VM_EXEC)
2315 phdr.p_flags |= PF_X;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002316 phdr.p_align = ELF_EXEC_PAGESIZE;
2317
Al Viroecc8c772013-10-05 15:32:35 -04002318 if (!dump_emit(cprm, &phdr, sizeof(phdr)))
Daisuke HATAYAMA088e7af2010-03-05 13:44:06 -08002319 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002320 }
2321
Al Viro506f21c2013-10-05 17:22:57 -04002322 if (!elf_core_write_extra_phdrs(cprm, offset))
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002323 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002324
2325 /* write out the notes section */
Al Viroecc8c772013-10-05 15:32:35 -04002326 if (!write_note_info(&info, cprm))
Roland McGrath3aba4812008-01-30 13:31:44 +01002327 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002328
Al Virocdc3d562013-10-05 22:24:29 -04002329 if (elf_coredump_extra_notes_write(cprm))
Michael Ellermane5501492007-09-19 14:38:12 +10002330 goto end_coredump;
Dwayne Grant McConnellbf1ab972006-11-23 00:46:37 +01002331
Andi Kleend025c9d2006-09-30 23:29:28 -07002332 /* Align to page */
Mateusz Guzik1607f092016-06-05 23:14:14 +02002333 if (!dump_skip(cprm, dataoff - cprm->pos))
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002334 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002335
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002336 for (i = 0, vma = first_vma(current, gate_vma); vma != NULL;
Roland McGrathf47aef52007-01-26 00:56:49 -08002337 vma = next_vma(vma, gate_vma)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002338 unsigned long addr;
Roland McGrath82df3972007-10-16 23:27:02 -07002339 unsigned long end;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002340
Jungseung Lee52f5592e2014-12-10 15:52:16 -08002341 end = vma->vm_start + vma_filesz[i++];
Linus Torvalds1da177e2005-04-16 15:20:36 -07002342
Roland McGrath82df3972007-10-16 23:27:02 -07002343 for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) {
Jesper Juhlf4e5cc22006-06-23 02:05:35 -07002344 struct page *page;
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002345 int stop;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002346
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002347 page = get_dump_page(addr);
2348 if (page) {
2349 void *kaddr = kmap(page);
Al Viro13046ec2013-10-05 18:08:47 -04002350 stop = !dump_emit(cprm, kaddr, PAGE_SIZE);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002351 kunmap(page);
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03002352 put_page(page);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002353 } else
Al Viro9b56d542013-10-08 09:26:08 -04002354 stop = !dump_skip(cprm, PAGE_SIZE);
Hugh Dickinsf3e8fcc2009-09-21 17:03:25 -07002355 if (stop)
2356 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002357 }
2358 }
Dave Kleikamp4d22c752017-01-11 13:25:00 -06002359 dump_truncate(cprm);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002360
Al Viroaa3e7ea2013-10-05 17:50:15 -04002361 if (!elf_core_write_extra_data(cprm))
Daisuke HATAYAMA1fcccba2010-03-05 13:44:07 -08002362 goto end_coredump;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002363
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002364 if (e_phnum == PN_XNUM) {
Al Viro13046ec2013-10-05 18:08:47 -04002365 if (!dump_emit(cprm, shdr4extnum, sizeof(*shdr4extnum)))
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002366 goto end_coredump;
2367 }
2368
Linus Torvalds1da177e2005-04-16 15:20:36 -07002369end_coredump:
2370 set_fs(fs);
2371
2372cleanup:
Roland McGrath3aba4812008-01-30 13:31:44 +01002373 free_note_info(&info);
Daisuke HATAYAMA8d9032b2010-03-05 13:44:10 -08002374 kfree(shdr4extnum);
Alexey Dobriyan86a2bb52018-06-14 15:27:24 -07002375 kvfree(vma_filesz);
Daisuke HATAYAMA93eb2112010-03-05 13:44:09 -08002376 kfree(phdr4note);
WANG Cong5f719552008-05-06 12:45:35 +08002377 kfree(elf);
2378out:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002379 return has_dumped;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002380}
2381
Christoph Hellwig698ba7b2009-12-15 16:47:37 -08002382#endif /* CONFIG_ELF_CORE */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002383
2384static int __init init_elf_binfmt(void)
2385{
Al Viro8fc3dc52012-03-17 03:05:16 -04002386 register_binfmt(&elf_format);
2387 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002388}
2389
2390static void __exit exit_elf_binfmt(void)
2391{
2392 /* Remove the COFF and ELF loaders. */
2393 unregister_binfmt(&elf_format);
2394}
2395
2396core_initcall(init_elf_binfmt);
2397module_exit(exit_elf_binfmt);
2398MODULE_LICENSE("GPL");