Lines Matching refs:bprm

170 static void acct_arg_size(struct linux_binprm *bprm, unsigned long pages)  in acct_arg_size()  argument
173 long diff = (long)(pages - bprm->vma_pages); in acct_arg_size()
178 bprm->vma_pages = pages; in acct_arg_size()
182 static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos, in get_arg_page() argument
190 ret = expand_downwards(bprm->vma, pos); in get_arg_page()
195 ret = get_user_pages(current, bprm->mm, pos, in get_arg_page()
201 unsigned long size = bprm->vma->vm_end - bprm->vma->vm_start; in get_arg_page()
204 acct_arg_size(bprm, size / PAGE_SIZE); in get_arg_page()
235 static void free_arg_page(struct linux_binprm *bprm, int i) in free_arg_page() argument
239 static void free_arg_pages(struct linux_binprm *bprm) in free_arg_pages() argument
243 static void flush_arg_page(struct linux_binprm *bprm, unsigned long pos, in flush_arg_page() argument
246 flush_cache_page(bprm->vma, pos, page_to_pfn(page)); in flush_arg_page()
249 static int __bprm_mm_init(struct linux_binprm *bprm) in __bprm_mm_init() argument
253 struct mm_struct *mm = bprm->mm; in __bprm_mm_init()
255 bprm->vma = vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL); in __bprm_mm_init()
282 bprm->p = vma->vm_end - sizeof(void *); in __bprm_mm_init()
286 bprm->vma = NULL; in __bprm_mm_init()
291 static bool valid_arg_len(struct linux_binprm *bprm, long len) in valid_arg_len() argument
298 static inline void acct_arg_size(struct linux_binprm *bprm, unsigned long pages) in acct_arg_size() argument
302 static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos, in get_arg_page() argument
307 page = bprm->page[pos / PAGE_SIZE]; in get_arg_page()
312 bprm->page[pos / PAGE_SIZE] = page; in get_arg_page()
322 static void free_arg_page(struct linux_binprm *bprm, int i) in free_arg_page() argument
324 if (bprm->page[i]) { in free_arg_page()
325 __free_page(bprm->page[i]); in free_arg_page()
326 bprm->page[i] = NULL; in free_arg_page()
330 static void free_arg_pages(struct linux_binprm *bprm) in free_arg_pages() argument
335 free_arg_page(bprm, i); in free_arg_pages()
338 static void flush_arg_page(struct linux_binprm *bprm, unsigned long pos, in flush_arg_page() argument
343 static int __bprm_mm_init(struct linux_binprm *bprm) in __bprm_mm_init() argument
345 bprm->p = PAGE_SIZE * MAX_ARG_PAGES - sizeof(void *); in __bprm_mm_init()
349 static bool valid_arg_len(struct linux_binprm *bprm, long len) in valid_arg_len() argument
351 return len <= bprm->p; in valid_arg_len()
362 static int bprm_mm_init(struct linux_binprm *bprm) in bprm_mm_init() argument
367 bprm->mm = mm = mm_alloc(); in bprm_mm_init()
372 err = __bprm_mm_init(bprm); in bprm_mm_init()
380 bprm->mm = NULL; in bprm_mm_init()
455 struct linux_binprm *bprm) in copy_strings() argument
477 if (!valid_arg_len(bprm, len)) in copy_strings()
481 pos = bprm->p; in copy_strings()
483 bprm->p -= len; in copy_strings()
510 page = get_arg_page(bprm, pos, 1); in copy_strings()
524 flush_arg_page(bprm, kpos, kmapped_page); in copy_strings()
546 struct linux_binprm *bprm) in copy_strings_kernel() argument
555 r = copy_strings(argc, argv, bprm); in copy_strings_kernel()
641 int setup_arg_pages(struct linux_binprm *bprm, in setup_arg_pages() argument
648 struct vm_area_struct *vma = bprm->vma; in setup_arg_pages()
672 mm->arg_start = bprm->p - stack_shift; in setup_arg_pages()
673 bprm->p = vma->vm_end - stack_shift; in setup_arg_pages()
684 bprm->p -= stack_shift; in setup_arg_pages()
685 mm->arg_start = bprm->p; in setup_arg_pages()
688 if (bprm->loader) in setup_arg_pages()
689 bprm->loader -= stack_shift; in setup_arg_pages()
690 bprm->exec -= stack_shift; in setup_arg_pages()
741 current->mm->start_stack = bprm->p; in setup_arg_pages()
1076 int flush_old_exec(struct linux_binprm * bprm) in flush_old_exec() argument
1093 set_mm_exe_file(bprm->mm, bprm->file); in flush_old_exec()
1098 acct_arg_size(bprm, 0); in flush_old_exec()
1099 retval = exec_mmap(bprm->mm); in flush_old_exec()
1103 bprm->mm = NULL; /* We're using it now */ in flush_old_exec()
1109 current->personality &= ~bprm->per_clear; in flush_old_exec()
1118 void would_dump(struct linux_binprm *bprm, struct file *file) in would_dump() argument
1121 bprm->interp_flags |= BINPRM_FLAGS_ENFORCE_NONDUMP; in would_dump()
1125 void setup_new_exec(struct linux_binprm * bprm) in setup_new_exec() argument
1138 __set_task_comm(current, kbasename(bprm->filename), true); in setup_new_exec()
1147 if (!uid_eq(bprm->cred->uid, current_euid()) || in setup_new_exec()
1148 !gid_eq(bprm->cred->gid, current_egid())) { in setup_new_exec()
1151 would_dump(bprm, bprm->file); in setup_new_exec()
1152 if (bprm->interp_flags & BINPRM_FLAGS_ENFORCE_NONDUMP) in setup_new_exec()
1170 int prepare_bprm_creds(struct linux_binprm *bprm) in prepare_bprm_creds() argument
1175 bprm->cred = prepare_exec_creds(); in prepare_bprm_creds()
1176 if (likely(bprm->cred)) in prepare_bprm_creds()
1183 static void free_bprm(struct linux_binprm *bprm) in free_bprm() argument
1185 free_arg_pages(bprm); in free_bprm()
1186 if (bprm->cred) { in free_bprm()
1188 abort_creds(bprm->cred); in free_bprm()
1190 if (bprm->file) { in free_bprm()
1191 allow_write_access(bprm->file); in free_bprm()
1192 fput(bprm->file); in free_bprm()
1195 if (bprm->interp != bprm->filename) in free_bprm()
1196 kfree(bprm->interp); in free_bprm()
1197 kfree(bprm); in free_bprm()
1200 int bprm_change_interp(char *interp, struct linux_binprm *bprm) in bprm_change_interp() argument
1203 if (bprm->interp != bprm->filename) in bprm_change_interp()
1204 kfree(bprm->interp); in bprm_change_interp()
1205 bprm->interp = kstrdup(interp, GFP_KERNEL); in bprm_change_interp()
1206 if (!bprm->interp) in bprm_change_interp()
1215 void install_exec_creds(struct linux_binprm *bprm) in install_exec_creds() argument
1217 security_bprm_committing_creds(bprm); in install_exec_creds()
1219 commit_creds(bprm->cred); in install_exec_creds()
1220 bprm->cred = NULL; in install_exec_creds()
1235 security_bprm_committed_creds(bprm); in install_exec_creds()
1245 static void check_unsafe_exec(struct linux_binprm *bprm) in check_unsafe_exec() argument
1252 bprm->unsafe |= LSM_UNSAFE_PTRACE_CAP; in check_unsafe_exec()
1254 bprm->unsafe |= LSM_UNSAFE_PTRACE; in check_unsafe_exec()
1262 bprm->unsafe |= LSM_UNSAFE_NO_NEW_PRIVS; in check_unsafe_exec()
1275 bprm->unsafe |= LSM_UNSAFE_SHARE; in check_unsafe_exec()
1281 static void bprm_fill_uid(struct linux_binprm *bprm) in bprm_fill_uid() argument
1289 bprm->cred->euid = current_euid(); in bprm_fill_uid()
1290 bprm->cred->egid = current_egid(); in bprm_fill_uid()
1292 if (bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID) in bprm_fill_uid()
1298 inode = file_inode(bprm->file); in bprm_fill_uid()
1313 if (!kuid_has_mapping(bprm->cred->user_ns, uid) || in bprm_fill_uid()
1314 !kgid_has_mapping(bprm->cred->user_ns, gid)) in bprm_fill_uid()
1318 bprm->per_clear |= PER_CLEAR_ON_SETID; in bprm_fill_uid()
1319 bprm->cred->euid = uid; in bprm_fill_uid()
1323 bprm->per_clear |= PER_CLEAR_ON_SETID; in bprm_fill_uid()
1324 bprm->cred->egid = gid; in bprm_fill_uid()
1334 int prepare_binprm(struct linux_binprm *bprm) in prepare_binprm() argument
1338 bprm_fill_uid(bprm); in prepare_binprm()
1341 retval = security_bprm_set_creds(bprm); in prepare_binprm()
1344 bprm->cred_prepared = 1; in prepare_binprm()
1346 memset(bprm->buf, 0, BINPRM_BUF_SIZE); in prepare_binprm()
1347 return kernel_read(bprm->file, 0, bprm->buf, BINPRM_BUF_SIZE); in prepare_binprm()
1357 int remove_arg_zero(struct linux_binprm *bprm) in remove_arg_zero() argument
1364 if (!bprm->argc) in remove_arg_zero()
1368 offset = bprm->p & ~PAGE_MASK; in remove_arg_zero()
1369 page = get_arg_page(bprm, bprm->p, 0); in remove_arg_zero()
1377 offset++, bprm->p++) in remove_arg_zero()
1384 free_arg_page(bprm, (bprm->p >> PAGE_SHIFT) - 1); in remove_arg_zero()
1387 bprm->p++; in remove_arg_zero()
1388 bprm->argc--; in remove_arg_zero()
1400 int search_binary_handler(struct linux_binprm *bprm) in search_binary_handler() argument
1407 if (bprm->recursion_depth > 5) in search_binary_handler()
1410 retval = security_bprm_check(bprm); in search_binary_handler()
1421 bprm->recursion_depth++; in search_binary_handler()
1422 retval = fmt->load_binary(bprm); in search_binary_handler()
1425 bprm->recursion_depth--; in search_binary_handler()
1426 if (retval < 0 && !bprm->mm) { in search_binary_handler()
1432 if (retval != -ENOEXEC || !bprm->file) { in search_binary_handler()
1440 if (printable(bprm->buf[0]) && printable(bprm->buf[1]) && in search_binary_handler()
1441 printable(bprm->buf[2]) && printable(bprm->buf[3])) in search_binary_handler()
1443 if (request_module("binfmt-%04x", *(ushort *)(bprm->buf + 2)) < 0) in search_binary_handler()
1453 static int exec_binprm(struct linux_binprm *bprm) in exec_binprm() argument
1464 ret = search_binary_handler(bprm); in exec_binprm()
1466 audit_bprm(bprm); in exec_binprm()
1467 trace_sched_process_exec(current, old_pid, bprm); in exec_binprm()
1484 struct linux_binprm *bprm; in do_execveat_common() local
1513 bprm = kzalloc(sizeof(*bprm), GFP_KERNEL); in do_execveat_common()
1514 if (!bprm) in do_execveat_common()
1517 retval = prepare_bprm_creds(bprm); in do_execveat_common()
1521 check_unsafe_exec(bprm); in do_execveat_common()
1531 bprm->file = file; in do_execveat_common()
1533 bprm->filename = filename->name; in do_execveat_common()
1550 bprm->interp_flags |= BINPRM_FLAGS_PATH_INACCESSIBLE; in do_execveat_common()
1551 bprm->filename = pathbuf; in do_execveat_common()
1553 bprm->interp = bprm->filename; in do_execveat_common()
1555 retval = bprm_mm_init(bprm); in do_execveat_common()
1559 bprm->argc = count(argv, MAX_ARG_STRINGS); in do_execveat_common()
1560 if ((retval = bprm->argc) < 0) in do_execveat_common()
1563 bprm->envc = count(envp, MAX_ARG_STRINGS); in do_execveat_common()
1564 if ((retval = bprm->envc) < 0) in do_execveat_common()
1567 retval = prepare_binprm(bprm); in do_execveat_common()
1571 retval = copy_strings_kernel(1, &bprm->filename, bprm); in do_execveat_common()
1575 bprm->exec = bprm->p; in do_execveat_common()
1576 retval = copy_strings(bprm->envc, envp, bprm); in do_execveat_common()
1580 retval = copy_strings(bprm->argc, argv, bprm); in do_execveat_common()
1584 retval = exec_binprm(bprm); in do_execveat_common()
1593 free_bprm(bprm); in do_execveat_common()
1601 if (bprm->mm) { in do_execveat_common()
1602 acct_arg_size(bprm, 0); in do_execveat_common()
1603 mmput(bprm->mm); in do_execveat_common()
1611 free_bprm(bprm); in do_execveat_common()