Lines Matching defs:epp
124 #define MD_TOPDOWN_INIT(epp) (epp)->ep_flags |= EXEC_TOPDOWN_VM
126 #define MD_TOPDOWN_INIT(epp)
321 exec_resolvename(struct lwp *l, struct exec_package *epp, struct vnode *vp,
333 __func__, epp->ep_kname, error));
338 epp->ep_resolvedname = *rpath;
340 epp->ep_kname = p + 1;
372 check_exec(struct lwp *l, struct exec_package *epp, struct pathbuf *pb,
379 if (epp->ep_resolvedname) {
383 pathbuf_copystring(pb, epp->ep_resolvedname, PATH_MAX);
390 epp->ep_vp = vp = nd.ni_vp;
398 if ((error = fd_getvnode(epp->ep_xfd, &fp)) != 0)
400 epp->ep_vp = vp = fp->f_vnode;
402 fd_putfile(epp->ep_xfd);
403 if ((error = exec_resolvename(l, epp, vp, rpath)) != 0)
418 if ((error = VOP_GETATTR(vp, epp->ep_vap, l->l_cred)) != 0)
427 epp->ep_vap->va_mode &= ~(S_ISUID | S_ISGID);
434 error = vn_rdwr(UIO_READ, vp, epp->ep_hdr, epp->ep_hdrlen, 0,
444 epp->ep_resolvedname ? epp->ep_resolvedname : epp->ep_kname,
445 epp->ep_flags & EXEC_INDIR ? VERIEXEC_INDIRECT : VERIEXEC_DIRECT,
452 error = pax_segvguard(l, vp, epp->ep_resolvedname, false);
457 epp->ep_hdrvalid = epp->ep_hdrlen - resid;
463 epp->ep_vm_minaddr = exec_vm_minaddr(VM_MIN_ADDRESS);
464 epp->ep_vm_maxaddr = VM_MAXUSER_ADDRESS;
474 epp->ep_esch = execsw[i];
475 newerror = (*execsw[i]->es_makecmds)(l, epp);
479 if (epp->ep_entry >= epp->ep_vm_maxaddr) {
483 __func__, (void *)epp->ep_entry,
484 (void *)epp->ep_vm_maxaddr);
490 if (epp->ep_entry < epp->ep_vm_minaddr) {
494 __func__, (void *)epp->ep_entry,
495 (void *)epp->ep_vm_minaddr);
506 if (epp->ep_tsize > MAXTSIZ) {
509 (uintmax_t)epp->ep_tsize,
518 if (epp->ep_dsize > dlimit) {
521 (uintmax_t)epp->ep_dsize,
534 KASSERT(epp->ep_emul_arg == NULL);
535 if (epp->ep_emul_root != NULL) {
536 vrele(epp->ep_emul_root);
537 epp->ep_emul_root = NULL;
539 if (epp->ep_interp != NULL) {
540 vrele(epp->ep_interp);
541 epp->ep_interp = NULL;
543 epp->ep_pax_flags = 0;
549 if (epp->ep_flags & EXEC_DESTR)
560 kill_vmcmds(&epp->ep_vmcmds);
752 struct exec_package * const epp = &data->ed_pack;
812 epp->ep_kname = data->ed_pathstring + offs;
814 epp->ep_resolvedname = data->ed_resolvedname;
815 epp->ep_xfd = -1;
819 epp->ep_kname = "*fexecve*";
821 epp->ep_resolvedname = NULL;
822 epp->ep_xfd = fd;
829 epp->ep_hdr = kmem_alloc(exec_maxhdrsz, KM_SLEEP);
830 epp->ep_hdrlen = exec_maxhdrsz;
831 epp->ep_hdrvalid = 0;
832 epp->ep_emul_arg = NULL;
833 epp->ep_emul_arg_free = NULL;
834 memset(&epp->ep_vmcmds, 0, sizeof(epp->ep_vmcmds));
835 epp->ep_vap = &data->ed_attr;
836 epp->ep_flags = (p->p_flag & PK_32) ? EXEC_FROM32 : 0;
837 MD_TOPDOWN_INIT(epp);
838 epp->ep_emul_root = NULL;
839 epp->ep_interp = NULL;
840 epp->ep_esch = NULL;
841 epp->ep_pax_flags = 0;
842 memset(epp->ep_machine_arch, 0, sizeof(epp->ep_machine_arch));
847 if ((error = check_exec(l, epp, data->ed_pathbuf,
851 __func__, epp->ep_kname, error));
884 const size_t len = calcstack(data, pax_aslr_stack_gap(epp) + RTLD_GAP);
886 if (len > epp->ep_ssize) {
893 epp->ep_ssize = len;
899 kill_vmcmds(&epp->ep_vmcmds);
901 if (epp->ep_flags & EXEC_HASFD) {
902 epp->ep_flags &= ~EXEC_HASFD;
903 fd_close(epp->ep_fd);
906 vn_lock(epp->ep_vp, LK_EXCLUSIVE | LK_RETRY);
907 VOP_CLOSE(epp->ep_vp, FREAD, l->l_cred);
908 vput(epp->ep_vp);
912 kmem_free(epp->ep_hdr, epp->ep_hdrlen);
913 if (epp->ep_emul_root != NULL)
914 vrele(epp->ep_emul_root);
915 if (epp->ep_interp != NULL)
916 vrele(epp->ep_interp);
938 struct exec_package * const epp = &data->ed_pack;
947 vref(epp->ep_vp);
948 p->p_textvp = epp->ep_vp;
951 KASSERTMSG(epp->ep_vmcmds.evs_used != 0, "%s: no vmcmds", __func__);
954 DUMPVMCMDS(epp, 0, 0);
959 for (i = 0; i < epp->ep_vmcmds.evs_used && !error; i++) {
962 vcp = &epp->ep_vmcmds.evs_cmds[i];
972 DUMPVMCMDS(epp, i, error);
978 kill_vmcmds(&epp->ep_vmcmds);
980 vn_lock(epp->ep_vp, LK_EXCLUSIVE | LK_RETRY);
981 VOP_CLOSE(epp->ep_vp, FREAD, l->l_cred);
982 vput(epp->ep_vp);
994 struct exec_package * const epp = &data->ed_pack;
997 kill_vmcmds(&epp->ep_vmcmds);
999 if (epp->ep_flags & EXEC_HASFD) {
1000 epp->ep_flags &= ~EXEC_HASFD;
1001 fd_close(epp->ep_fd);
1005 vn_lock(epp->ep_vp, LK_EXCLUSIVE | LK_RETRY);
1006 VOP_CLOSE(epp->ep_vp, FREAD, curlwp->l_cred);
1007 vput(epp->ep_vp);
1010 kmem_free(epp->ep_hdr, epp->ep_hdrlen);
1011 if (epp->ep_emul_root != NULL)
1012 vrele(epp->ep_emul_root);
1013 if (epp->ep_interp != NULL)
1014 vrele(epp->ep_interp);
1134 emulexec(struct lwp *l, struct exec_package *epp)
1140 if (epp->ep_esch->es_emul->e_path != NULL &&
1141 epp->ep_emul_root == NULL)
1142 emul_find_root(l, epp);
1146 p->p_cwdi->cwdi_edir = epp->ep_emul_root;
1148 epp->ep_emul_root = NULL;
1149 if (epp->ep_interp != NULL)
1150 vrele(epp->ep_interp);
1163 && p->p_emul != epp->ep_esch->es_emul)
1170 if (epp->ep_esch->es_emul->e_proc_exec)
1171 (*epp->ep_esch->es_emul->e_proc_exec)(p, epp);
1174 p->p_emul = epp->ep_esch->es_emul;
1177 p->p_execsw = epp->ep_esch;
1189 struct exec_package * const epp = &data->ed_pack;
1236 pax_set_flags(epp, p);
1248 uvmspace_spawn(l, epp->ep_vm_minaddr,
1249 epp->ep_vm_maxaddr,
1250 epp->ep_flags & EXEC_TOPDOWN_VM);
1252 uvmspace_exec(l, epp->ep_vm_minaddr,
1253 epp->ep_vm_maxaddr,
1254 epp->ep_flags & EXEC_TOPDOWN_VM);
1257 vm->vm_taddr = (void *)epp->ep_taddr;
1258 vm->vm_tsize = btoc(epp->ep_tsize);
1259 vm->vm_daddr = (void*)epp->ep_daddr;
1260 vm->vm_dsize = btoc(epp->ep_dsize);
1261 vm->vm_ssize = btoc(epp->ep_ssize);
1263 vm->vm_maxsaddr = (void *)epp->ep_maxsaddr;
1264 vm->vm_minsaddr = (void *)epp->ep_minsaddr;
1266 pax_aslr_init_vm(l, vm, epp);
1338 pathexec(p, epp->ep_resolvedname);
1340 char * const newstack = STACK_GROW(vm->vm_minsaddr, epp->ep_ssize);
1357 (*epp->ep_esch->es_emul->e_setregs)(l, epp, (vaddr_t)newstack);
1358 if (epp->ep_esch->es_setregs)
1359 (*epp->ep_esch->es_setregs)(l, epp, (vaddr_t)newstack);
1368 if ((error = exec_sigcode_map(p, epp->ep_esch->es_emul)) != 0) {
1387 kmem_free(epp->ep_hdr, epp->ep_hdrlen);
1389 SDT_PROBE(proc, kernel, , exec__success, epp->ep_kname, 0, 0, 0, 0);
1391 emulexec(l, epp);
1455 exec_free_emul_arg(epp);
1457 kmem_free(epp->ep_hdr, epp->ep_hdrlen);
1458 if (epp->ep_emul_root != NULL)
1459 vrele(epp->ep_emul_root);
1460 if (epp->ep_interp != NULL)
1461 vrele(epp->ep_interp);
1489 fromptrsz(const struct exec_package *epp)
1491 return (epp->ep_flags & EXEC_FROM32) ? sizeof(int) : sizeof(char *);
1495 ptrsz(const struct exec_package *epp)
1497 return (epp->ep_flags & EXEC_32) ? sizeof(int) : sizeof(char *);
1503 struct exec_package * const epp = &data->ed_pack;
1512 return (nargenvptrs * ptrsz(epp)) /* pointers */
1514 + epp->ep_esch->es_arglen; /* auxinfo */
1520 struct exec_package * const epp = &data->ed_pack;
1522 data->ed_szsigcode = epp->ep_esch->es_emul->e_esigcode -
1523 epp->ep_esch->es_emul->e_sigcode;
1525 data->ed_ps_strings_sz = (epp->ep_flags & EXEC_32) ?
1546 struct exec_package * const epp = &data->ed_pack;
1566 error = (*epp->ep_esch->es_copyargs)(l, epp,
1584 struct exec_package * const epp = &data->ed_pack;
1590 p->p_psstrp = (vaddr_t)STACK_ALLOC(STACK_GROW(epp->ep_minsaddr,
1593 if (epp->ep_flags & EXEC_32) {
1617 struct exec_package * const epp = &data->ed_pack;
1627 if (epp->ep_flags & EXEC_HASARGL) {
1628 struct exec_fakearg *fa = epp->ep_fa;
1643 kmem_free(epp->ep_fa, epp->ep_fa_len);
1644 epp->ep_flags &= ~EXEC_HASARGL;
1654 kmem_free(epp->ep_fa, epp->ep_fa_len);
1655 epp->ep_flags &= ~EXEC_HASARGL;
1666 if (epp->ep_flags & EXEC_SKIPARG)
1667 args = (const void *)((const char *)args + fromptrsz(epp));
2935 exec_free_emul_arg(struct exec_package *epp)
2937 if (epp->ep_emul_arg_free != NULL) {
2938 KASSERT(epp->ep_emul_arg != NULL);
2939 (*epp->ep_emul_arg_free)(epp->ep_emul_arg);
2940 epp->ep_emul_arg_free = NULL;
2941 epp->ep_emul_arg = NULL;
2943 KASSERT(epp->ep_emul_arg == NULL);
2949 dump_vmcmds(const struct exec_package * const epp, size_t x, int error)
2951 struct exec_vmcmd *vp = &epp->ep_vmcmds.evs_cmds[0];
2955 DPRINTF(("vmcmds %u\n", epp->ep_vmcmds.evs_used));
2958 epp->ep_vmcmds.evs_used, error));
2960 for (j = 0; j < epp->ep_vmcmds.evs_used; j++) {