Lines Matching defs:bprm
84 static int bprm_creds_from_file(struct linux_binprm *bprm);
126 * The nascent bprm->mm is not visible until exec_mmap() but it can
131 static void acct_arg_size(struct linux_binprm *bprm, unsigned long pages)
134 long diff = (long)(pages - bprm->vma_pages);
139 bprm->vma_pages = pages;
143 static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos,
147 struct vm_area_struct *vma = bprm->vma;
148 struct mm_struct *mm = bprm->mm;
171 acct_arg_size(bprm, vma_pages(vma));
181 static void free_arg_pages(struct linux_binprm *bprm)
185 static void flush_arg_page(struct linux_binprm *bprm, unsigned long pos,
188 flush_cache_page(bprm->vma, pos, page_to_pfn(page));
191 static bool valid_arg_len(struct linux_binprm *bprm, long len)
198 static inline void acct_arg_size(struct linux_binprm *bprm, unsigned long pages)
202 static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos,
207 page = bprm->page[pos / PAGE_SIZE];
212 bprm->page[pos / PAGE_SIZE] = page;
222 static void free_arg_page(struct linux_binprm *bprm, int i)
224 if (bprm->page[i]) {
225 __free_page(bprm->page[i]);
226 bprm->page[i] = NULL;
230 static void free_arg_pages(struct linux_binprm *bprm)
235 free_arg_page(bprm, i);
238 static void flush_arg_page(struct linux_binprm *bprm, unsigned long pos,
243 static bool valid_arg_len(struct linux_binprm *bprm, long len)
245 return len <= bprm->p;
256 static int bprm_mm_init(struct linux_binprm *bprm)
261 bprm->mm = mm = mm_alloc();
268 bprm->rlim_stack = current->signal->rlim[RLIMIT_STACK];
272 bprm->p = PAGE_SIZE * MAX_ARG_PAGES - sizeof(void *);
274 err = create_init_stack_vma(bprm->mm, &bprm->vma, &bprm->p);
283 bprm->mm = NULL;
369 static inline int bprm_set_stack_limit(struct linux_binprm *bprm,
373 /* Avoid a pathological bprm->p. */
374 if (bprm->p < limit)
376 bprm->argmin = bprm->p - limit;
380 static inline bool bprm_hit_stack_limit(struct linux_binprm *bprm)
383 return bprm->p < bprm->argmin;
390 * Calculate bprm->argmin from:
393 * - bprm->rlim_stack.rlim_cur
394 * - bprm->argc
395 * - bprm->envc
396 * - bprm->p
398 static int bprm_stack_limits(struct linux_binprm *bprm)
411 limit = min(limit, bprm->rlim_stack.rlim_cur / 4);
418 if (bprm->argc < 0 || bprm->envc < 0)
433 if (check_add_overflow(max(bprm->argc, 1), bprm->envc, &ptr_size) ||
440 return bprm_set_stack_limit(bprm, limit);
449 struct linux_binprm *bprm)
471 if (!valid_arg_len(bprm, len))
475 pos = bprm->p;
477 bprm->p -= len;
478 if (bprm_hit_stack_limit(bprm))
506 page = get_arg_page(bprm, pos, 1);
520 flush_arg_page(bprm, kpos, kmapped_page);
541 int copy_string_kernel(const char *arg, struct linux_binprm *bprm)
544 unsigned long pos = bprm->p;
548 if (!valid_arg_len(bprm, len))
553 bprm->p -= len;
554 if (bprm_hit_stack_limit(bprm))
566 page = get_arg_page(bprm, pos, 1);
569 flush_arg_page(bprm, pos & PAGE_MASK, page);
579 struct linux_binprm *bprm)
582 int ret = copy_string_kernel(argv[argc], bprm);
598 int setup_arg_pages(struct linux_binprm *bprm,
605 struct vm_area_struct *vma = bprm->vma;
617 stack_base = bprm->rlim_stack.rlim_max;
632 mm->arg_start = bprm->p - stack_shift;
633 bprm->p = vma->vm_end - stack_shift;
644 bprm->p -= stack_shift;
645 mm->arg_start = bprm->p;
648 bprm->exec -= stack_shift;
680 bprm->file);
704 rlim_stack = bprm->rlim_stack.rlim_cur & PAGE_MASK;
713 current->mm->start_stack = bprm->p;
730 int transfer_args_to_stack(struct linux_binprm *bprm,
736 stop = bprm->p >> PAGE_SHIFT;
740 unsigned int offset = index == stop ? bprm->p & ~PAGE_MASK : 0;
741 char *src = kmap_local_page(bprm->page[index]) + offset;
750 bprm->exec += *sp_location - MAX_ARG_PAGES * PAGE_SIZE;
1091 int begin_new_exec(struct linux_binprm * bprm)
1097 retval = bprm_creds_from_file(bprm);
1107 trace_sched_prepare_exec(current, bprm);
1112 bprm->point_of_no_return = true;
1131 * Must be called _before_ exec_mmap() as bprm->mm is
1135 retval = set_mm_exe_file(bprm->mm, bprm->file);
1140 would_dump(bprm, bprm->file);
1141 if (bprm->have_execfd)
1142 would_dump(bprm, bprm->executable);
1147 acct_arg_size(bprm, 0);
1148 retval = exec_mmap(bprm->mm);
1152 bprm->mm = NULL;
1176 me->personality &= ~bprm->per_clear;
1188 if (bprm->secureexec) {
1199 if (bprm->rlim_stack.rlim_cur > _STK_LIM)
1200 bprm->rlim_stack.rlim_cur = _STK_LIM;
1208 * bprm->secureexec instead.
1210 if (bprm->interp_flags & BINPRM_FLAGS_ENFORCE_NONDUMP ||
1224 if (bprm->comm_from_dentry) {
1234 __set_task_comm(me, smp_load_acquire(&bprm->file->f_path.dentry->d_name.name),
1238 __set_task_comm(me, kbasename(bprm->filename), true);
1246 retval = set_cred_ucounts(bprm->cred);
1253 security_bprm_committing_creds(bprm);
1255 commit_creds(bprm->cred);
1256 bprm->cred = NULL;
1271 security_bprm_committed_creds(bprm);
1274 if (bprm->have_execfd) {
1275 retval = FD_ADD(0, bprm->executable);
1278 bprm->executable = NULL;
1279 bprm->execfd = retval;
1285 if (!bprm->cred)
1293 void would_dump(struct linux_binprm *bprm, struct file *file)
1299 bprm->interp_flags |= BINPRM_FLAGS_ENFORCE_NONDUMP;
1302 user_ns = old = bprm->mm->user_ns;
1308 bprm->mm->user_ns = get_user_ns(user_ns);
1315 void setup_new_exec(struct linux_binprm * bprm)
1320 arch_pick_mmap_layout(me->mm, &bprm->rlim_stack);
1335 void finalize_exec(struct linux_binprm *bprm)
1339 current->signal->rlim[RLIMIT_STACK] = bprm->rlim_stack;
1350 static int prepare_bprm_creds(struct linux_binprm *bprm)
1355 bprm->cred = prepare_exec_creds();
1356 if (likely(bprm->cred))
1372 static void free_bprm(struct linux_binprm *bprm)
1374 if (bprm->mm) {
1375 acct_arg_size(bprm, 0);
1376 mmput(bprm->mm);
1378 free_arg_pages(bprm);
1379 if (bprm->cred) {
1383 abort_creds(bprm->cred);
1385 do_close_execat(bprm->file);
1386 if (bprm->executable)
1387 fput(bprm->executable);
1389 if (bprm->interp != bprm->filename)
1390 kfree(bprm->interp);
1391 kfree(bprm->fdpath);
1392 kfree(bprm);
1397 struct linux_binprm *bprm;
1405 bprm = kzalloc_obj(*bprm);
1406 if (!bprm) {
1411 bprm->file = file;
1414 bprm->filename = filename->name;
1417 bprm->fdpath = kasprintf(GFP_KERNEL, "/dev/fd/%d", fd);
1418 bprm->comm_from_dentry = 1;
1420 bprm->fdpath = kasprintf(GFP_KERNEL, "/dev/fd/%d/%s",
1423 if (!bprm->fdpath)
1436 bprm->interp_flags |= BINPRM_FLAGS_PATH_INACCESSIBLE;
1438 bprm->filename = bprm->fdpath;
1440 bprm->interp = bprm->filename;
1455 bprm->is_check = !!(flags & AT_EXECVE_CHECK);
1457 retval = bprm_mm_init(bprm);
1459 return bprm;
1462 free_bprm(bprm);
1466 DEFINE_CLASS(bprm, struct linux_binprm *, if (!IS_ERR(_T)) free_bprm(_T),
1469 int bprm_change_interp(const char *interp, struct linux_binprm *bprm)
1472 if (bprm->interp != bprm->filename)
1473 kfree(bprm->interp);
1474 bprm->interp = kstrdup(interp, GFP_KERNEL);
1475 if (!bprm->interp)
1486 static void check_unsafe_exec(struct linux_binprm *bprm)
1492 bprm->unsafe |= LSM_UNSAFE_PTRACE;
1499 bprm->unsafe |= LSM_UNSAFE_NO_NEW_PRIVS;
1522 bprm->unsafe |= LSM_UNSAFE_SHARE;
1528 static void bprm_fill_uid(struct linux_binprm *bprm, struct file *file)
1565 if (!vfsuid_has_mapping(bprm->cred->user_ns, vfsuid) ||
1566 !vfsgid_has_mapping(bprm->cred->user_ns, vfsgid))
1570 bprm->per_clear |= PER_CLEAR_ON_SETID;
1571 bprm->cred->euid = vfsuid_into_kuid(vfsuid);
1575 bprm->per_clear |= PER_CLEAR_ON_SETID;
1576 bprm->cred->egid = vfsgid_into_kgid(vfsgid);
1583 static int bprm_creds_from_file(struct linux_binprm *bprm)
1586 struct file *file = bprm->execfd_creds ? bprm->executable : bprm->file;
1588 bprm_fill_uid(bprm, file);
1589 return security_bprm_creds_from_file(bprm, file);
1598 static int prepare_binprm(struct linux_binprm *bprm)
1602 memset(bprm->buf, 0, BINPRM_BUF_SIZE);
1603 return kernel_read(bprm->file, bprm->buf, BINPRM_BUF_SIZE, &pos);
1607 * Arguments are '\0' separated strings found at the location bprm->p
1611 int remove_arg_zero(struct linux_binprm *bprm)
1617 if (!bprm->argc)
1621 offset = bprm->p & ~PAGE_MASK;
1622 page = get_arg_page(bprm, bprm->p, 0);
1628 offset++, bprm->p++)
1635 bprm->p++;
1636 bprm->argc--;
1645 static int search_binary_handler(struct linux_binprm *bprm)
1650 retval = prepare_binprm(bprm);
1654 retval = security_bprm_check(bprm);
1664 retval = fmt->load_binary(bprm);
1668 if (bprm->point_of_no_return || (retval != -ENOEXEC)) {
1679 static int exec_binprm(struct linux_binprm *bprm)
1696 ret = search_binary_handler(bprm);
1699 if (!bprm->interpreter)
1702 exec = bprm->file;
1703 bprm->file = bprm->interpreter;
1704 bprm->interpreter = NULL;
1707 if (unlikely(bprm->have_execfd)) {
1708 if (bprm->executable) {
1712 bprm->executable = exec;
1717 audit_bprm(bprm);
1718 trace_sched_process_exec(current, old_pid, bprm);
1724 static int bprm_execve(struct linux_binprm *bprm)
1728 retval = prepare_bprm_creds(bprm);
1737 check_unsafe_exec(bprm);
1743 /* Set the unchanging part of bprm->cred */
1744 retval = security_bprm_creds_for_exec(bprm);
1745 if (retval || bprm->is_check)
1748 retval = exec_binprm(bprm);
1768 if (bprm->point_of_no_return && !fatal_signal_pending(current))
1799 CLASS(bprm, bprm)(fd, filename, flags);
1800 if (IS_ERR(bprm))
1801 return PTR_ERR(bprm);
1806 bprm->argc = retval;
1811 bprm->envc = retval;
1813 retval = bprm_stack_limits(bprm);
1817 retval = copy_string_kernel(bprm->filename, bprm);
1820 bprm->exec = bprm->p;
1822 retval = copy_strings(bprm->envc, envp, bprm);
1826 retval = copy_strings(bprm->argc, argv, bprm);
1836 if (bprm->argc == 0) {
1837 retval = copy_string_kernel("", bprm);
1840 bprm->argc = 1;
1843 current->comm, bprm->filename);
1846 return bprm_execve(bprm);
1859 CLASS(bprm, bprm)(AT_FDCWD, filename, 0);
1860 if (IS_ERR(bprm))
1861 return PTR_ERR(bprm);
1868 bprm->argc = retval;
1873 bprm->envc = retval;
1875 retval = bprm_stack_limits(bprm);
1879 retval = copy_string_kernel(bprm->filename, bprm);
1882 bprm->exec = bprm->p;
1884 retval = copy_strings_kernel(bprm->envc, envp, bprm);
1888 retval = copy_strings_kernel(bprm->argc, argv, bprm);
1892 return bprm_execve(bprm);