strp 278 dev/systrace.c struct str_process *strp; strp 338 dev/systrace.c strp = systrace_findpid(fst, pid); strp 339 dev/systrace.c if (strp == NULL) { strp 355 dev/systrace.c ret = systrace_detach(strp); strp 358 dev/systrace.c SET(strp->flags, STR_PROC_REPORT); strp 361 dev/systrace.c ret = systrace_answer(strp, (struct systrace_answer *)data); strp 364 dev/systrace.c ret = systrace_io(strp, (struct systrace_io *)data); strp 367 dev/systrace.c ret = systrace_setscriptname(strp, strp 371 dev/systrace.c ret = systrace_prepinject(strp, (struct systrace_inject *)data); strp 377 dev/systrace.c ret = systrace_preprepl(strp, (struct systrace_replace *)data); strp 399 dev/systrace.c ret = systrace_getcwd(fst, strp); strp 462 dev/systrace.c struct str_process *strp; strp 470 dev/systrace.c for (strp = TAILQ_FIRST(&fst->processes); strp; strp 471 dev/systrace.c strp = TAILQ_FIRST(&fst->processes)) { strp 472 dev/systrace.c struct proc *q = strp->proc; strp 474 dev/systrace.c systrace_detach(strp); strp 479 dev/systrace.c for (strp = TAILQ_FIRST(&fst->messages); strp; strp 480 dev/systrace.c strp = TAILQ_FIRST(&fst->messages)) { strp 481 dev/systrace.c TAILQ_REMOVE(&fst->messages, strp, msg_next); strp 482 dev/systrace.c pool_put(&systr_proc_pl, strp); strp 615 dev/systrace.c systrace_find(struct str_process *strp) strp 619 dev/systrace.c if ((proc = pfind(strp->pid)) == NULL) strp 622 dev/systrace.c if (proc != strp->proc) strp 634 dev/systrace.c struct str_process *strp; strp 638 dev/systrace.c strp = proc->p_systrace; strp 639 dev/systrace.c if (strp != NULL) { strp 640 dev/systrace.c fst = strp->parent; strp 645 dev/systrace.c systrace_msg_child(fst, strp, -1); strp 647 dev/systrace.c systrace_detach(strp); strp 657 dev/systrace.c struct str_process *oldstrp, *strp; strp 673 dev/systrace.c if ((strp = systrace_findpid(fst, p->p_pid)) == NULL) strp 677 dev/systrace.c if ((strp->policy = oldstrp->policy) != NULL) strp 678 dev/systrace.c strp->policy->refcount++; strp 688 dev/systrace.c strp = p->p_systrace; \ strp 689 dev/systrace.c if (strp == NULL) { \ strp 693 dev/systrace.c fst = strp->parent; \ strp 702 dev/systrace.c struct str_process *strp; strp 712 dev/systrace.c strp = p->p_systrace; strp 713 dev/systrace.c if (strp == NULL) { strp 723 dev/systrace.c KASSERT(strp->proc == p); strp 725 dev/systrace.c fst = strp->parent; strp 750 dev/systrace.c if ((strpolicy = strp->policy) == NULL) strp 770 dev/systrace.c systrace_replacefree(strp); strp 782 dev/systrace.c systrace_inject(strp, 0 /* Just reset internal state */); strp 783 dev/systrace.c strp->sg = stackgap_init(p->p_emul); strp 786 dev/systrace.c error = systrace_msg_ask(fst, strp, code, callp->sy_argsize, v); strp 794 dev/systrace.c if ((strp = p->p_systrace) == NULL) { strp 799 dev/systrace.c fst = strp->parent; strp 803 dev/systrace.c if (strp->answer == SYSTR_POLICY_NEVER) { strp 804 dev/systrace.c error = strp->error; strp 805 dev/systrace.c systrace_replacefree(strp); strp 809 dev/systrace.c if (ISSET(strp->flags, STR_PROC_SYSCALLRES)) { strp 810 dev/systrace.c CLR(strp->flags, STR_PROC_SYSCALLRES); strp 814 dev/systrace.c error = systrace_inject(strp, 1/* Perform copies */); strp 816 dev/systrace.c if (!error && strp->replace != NULL) strp 817 dev/systrace.c error = systrace_replace(strp, callp->sy_argsize, v); strp 828 dev/systrace.c if (ISSET(strp->flags, STR_PROC_SETEUID)) strp 829 dev/systrace.c strp->saveuid = systrace_seteuid(p, strp->seteuid); strp 830 dev/systrace.c if (ISSET(strp->flags, STR_PROC_SETEGID)) strp 831 dev/systrace.c strp->savegid = systrace_setegid(p, strp->setegid); strp 833 dev/systrace.c CLR(strp->flags, STR_PROC_SETEUID|STR_PROC_SETEGID); strp 841 dev/systrace.c if ((strp = p->p_systrace) == NULL) { strp 847 dev/systrace.c if (ISSET(strp->flags, STR_PROC_SETEUID)) { strp 848 dev/systrace.c if (pc->pc_ucred->cr_uid == strp->seteuid) strp 849 dev/systrace.c systrace_seteuid(p, strp->saveuid); strp 850 dev/systrace.c CLR(strp->flags, STR_PROC_SETEUID); strp 852 dev/systrace.c if (ISSET(strp->flags, STR_PROC_SETEGID)) { strp 853 dev/systrace.c if (pc->pc_ucred->cr_gid == strp->setegid) strp 854 dev/systrace.c systrace_setegid(p, strp->savegid); strp 855 dev/systrace.c CLR(strp->flags, STR_PROC_SETEGID); strp 859 dev/systrace.c systrace_replacefree(strp); strp 862 dev/systrace.c if ((fst = strp->parent) == NULL || !fst->issuser) { strp 871 dev/systrace.c if (ISSET(strp->flags, STR_PROC_REPORT)) { strp 872 dev/systrace.c CLR(strp->flags, STR_PROC_REPORT); strp 877 dev/systrace.c fst = strp->parent; strp 883 dev/systrace.c if (strp->policy) { strp 884 dev/systrace.c systrace_closepolicy(fst, strp->policy); strp 885 dev/systrace.c strp->policy = NULL; strp 887 dev/systrace.c systrace_msg_emul(fst, strp); strp 895 dev/systrace.c systrace_msg_ugid(fst, strp); strp 902 dev/systrace.c systrace_msg_result(fst, strp, error, code, strp 956 dev/systrace.c systrace_answer(struct str_process *strp, struct systrace_answer *ans) strp 969 dev/systrace.c if (ans->stra_seqnr != strp->seqnr) { strp 974 dev/systrace.c if ((error = systrace_processready(strp)) != 0) strp 977 dev/systrace.c strp->answer = ans->stra_policy; strp 978 dev/systrace.c strp->error = ans->stra_error; strp 979 dev/systrace.c if (!strp->error) strp 980 dev/systrace.c strp->error = EPERM; strp 982 dev/systrace.c SET(strp->flags, STR_PROC_SYSCALLRES); strp 986 dev/systrace.c SET(strp->flags, STR_PROC_SETEUID); strp 987 dev/systrace.c strp->seteuid = ans->stra_seteuid; strp 990 dev/systrace.c SET(strp->flags, STR_PROC_SETEGID); strp 991 dev/systrace.c strp->setegid = ans->stra_setegid; strp 995 dev/systrace.c CLR(strp->flags, STR_PROC_WAITANSWER); strp 996 dev/systrace.c wakeup(strp); strp 1003 dev/systrace.c systrace_setscriptname(struct str_process *strp, struct systrace_scriptname *ans) strp 1005 dev/systrace.c strlcpy(strp->scriptname, strp 1006 dev/systrace.c ans->sn_scriptname, sizeof(strp->scriptname)); strp 1012 dev/systrace.c systrace_inject(struct str_process *strp, int docopy) strp 1016 dev/systrace.c for (ind = 0; ind < strp->injectind; ind++) { strp 1017 dev/systrace.c struct str_inject *inject = &strp->injects[ind]; strp 1024 dev/systrace.c strp->injectind = 0; strp 1029 dev/systrace.c systrace_prepinject(struct str_process *strp, struct systrace_inject *inj) strp 1035 dev/systrace.c if (strp->injectind >= SYSTR_MAXINJECTS) strp 1038 dev/systrace.c udata = stackgap_alloc(&strp->sg, inj->stri_len); strp 1054 dev/systrace.c inject = &strp->injects[strp->injectind++]; strp 1066 dev/systrace.c struct str_process *strp; strp 1090 dev/systrace.c strp = systrace_findpid(fst, pol->strp_pid); strp 1091 dev/systrace.c if (strp == NULL) strp 1095 dev/systrace.c if (strpol->emul && strpol->emul != strp->proc->p_emul) strp 1098 dev/systrace.c if (strp->policy) strp 1099 dev/systrace.c systrace_closepolicy(fst, strp->policy); strp 1100 dev/systrace.c strp->policy = strpol; strp 1109 dev/systrace.c strpol->emul = strp->proc->p_emul; strp 1134 dev/systrace.c systrace_processready(struct str_process *strp) strp 1136 dev/systrace.c if (ISSET(strp->flags, STR_PROC_ONQUEUE)) strp 1139 dev/systrace.c if (!ISSET(strp->flags, STR_PROC_WAITANSWER)) strp 1142 dev/systrace.c if (strp->proc->p_stat != SSLEEP) strp 1149 dev/systrace.c systrace_getcwd(struct fsystrace *fst, struct str_process *strp) strp 1154 dev/systrace.c DPRINTF(("%s: %d\n", __func__, strp->pid)); strp 1156 dev/systrace.c error = systrace_processready(strp); strp 1161 dev/systrace.c fdp = strp->proc->p_fd; strp 1166 dev/systrace.c fst->fd_pid = strp->pid; strp 1179 dev/systrace.c systrace_io(struct str_process *strp, struct systrace_io *io) strp 1181 dev/systrace.c struct proc *p = curproc, *t = strp->proc; strp 1200 dev/systrace.c error = systrace_processready(strp); strp 1298 dev/systrace.c struct str_process *strp; strp 1301 dev/systrace.c strp = p->p_systrace; strp 1302 dev/systrace.c strp->isscript = 0; strp 1309 dev/systrace.c struct str_process *strp; strp 1315 dev/systrace.c strp = p->p_systrace; strp 1316 dev/systrace.c if (strp == NULL) { strp 1321 dev/systrace.c msg_execve = &strp->msg.msg_data.msg_execve; strp 1322 dev/systrace.c fst = strp->parent; strp 1338 dev/systrace.c } while (systrace_make_msg(strp, SYSTR_MSG_EXECVE) != 0); strp 1344 dev/systrace.c systrace_preprepl(struct str_process *strp, struct systrace_replace *repl) strp 1349 dev/systrace.c ret = systrace_processready(strp); strp 1353 dev/systrace.c if (strp->replace != NULL) { strp 1354 dev/systrace.c free(strp->replace, M_XDATA); strp 1355 dev/systrace.c strp->replace = NULL; strp 1384 dev/systrace.c strp->replace = (struct systrace_replace *) strp 1387 dev/systrace.c memcpy(strp->replace, repl, sizeof(struct systrace_replace)); strp 1388 dev/systrace.c ret = copyin(repl->strr_base, strp->replace + 1, len); strp 1390 dev/systrace.c free(strp->replace, M_XDATA); strp 1391 dev/systrace.c strp->replace = NULL; strp 1396 dev/systrace.c repl = strp->replace; strp 1407 dev/systrace.c systrace_replace(struct str_process *strp, size_t argsize, register_t args[]) strp 1409 dev/systrace.c struct systrace_replace *repl = strp->replace; strp 1415 dev/systrace.c ubase = stackgap_alloc(&strp->sg, repl->strr_len); strp 1434 dev/systrace.c ret = systrace_fname(strp, kdata, repl->strr_offlen[i]); strp 1453 dev/systrace.c systrace_fname(struct str_process *strp, caddr_t kdata, size_t len) strp 1455 dev/systrace.c if (strp->nfname >= SYSTR_MAXFNAME || len < 1) strp 1458 dev/systrace.c strp->fname[strp->nfname] = kdata; strp 1459 dev/systrace.c strp->fname[strp->nfname][len - 1] = '\0'; strp 1460 dev/systrace.c strp->nfname++; strp 1466 dev/systrace.c systrace_replacefree(struct str_process *strp) strp 1468 dev/systrace.c if (strp->replace != NULL) { strp 1469 dev/systrace.c free(strp->replace, M_XDATA); strp 1470 dev/systrace.c strp->replace = NULL; strp 1472 dev/systrace.c while (strp->nfname > 0) { strp 1473 dev/systrace.c strp->nfname--; strp 1474 dev/systrace.c strp->fname[strp->nfname] = NULL; strp 1480 dev/systrace.c struct str_process *strp; strp 1485 dev/systrace.c strp = p->p_systrace; strp 1486 dev/systrace.c fst = strp->parent; strp 1499 dev/systrace.c if (strp != NULL) { strp 1500 dev/systrace.c if (strp->scriptname[0] == '\0') { strp 1505 dev/systrace.c strlcpy(dst, strp->scriptname, MAXPATHLEN); strp 1506 dev/systrace.c strp->isscript = 1; strp 1510 dev/systrace.c strp->scriptname[0] = '\0'; strp 1519 dev/systrace.c struct str_process *strp; strp 1526 dev/systrace.c strp = cnp->cn_proc->p_systrace; strp 1527 dev/systrace.c if (strp != NULL) { strp 1528 dev/systrace.c fst = strp->parent; strp 1532 dev/systrace.c for (i = 0; i < strp->nfname; i++) strp 1533 dev/systrace.c if (strcmp(cnp->cn_pnbuf, strp->fname[i]) == 0) { strp 1538 dev/systrace.c if (!hamper && strp->isscript && strp 1539 dev/systrace.c strcmp(cnp->cn_pnbuf, strp->scriptname) == 0) strp 1557 dev/systrace.c struct str_process *strp; strp 1560 dev/systrace.c TAILQ_FOREACH(strp, &fst->processes, next) strp 1561 dev/systrace.c if (strp->pid == pid) strp 1564 dev/systrace.c if (strp == NULL) strp 1567 dev/systrace.c proc = systrace_find(strp); strp 1569 dev/systrace.c return (proc ? strp : NULL); strp 1573 dev/systrace.c systrace_detach(struct str_process *strp) strp 1579 dev/systrace.c DPRINTF(("%s: Trying to detach from %d\n", __func__, strp->pid)); strp 1581 dev/systrace.c if ((proc = systrace_find(strp)) != NULL) { strp 1587 dev/systrace.c if (ISSET(strp->flags, STR_PROC_WAITANSWER)) { strp 1588 dev/systrace.c CLR(strp->flags, STR_PROC_WAITANSWER); strp 1589 dev/systrace.c wakeup(strp); strp 1592 dev/systrace.c fst = strp->parent; strp 1595 dev/systrace.c if (ISSET(strp->flags, STR_PROC_ONQUEUE)) strp 1596 dev/systrace.c TAILQ_REMOVE(&fst->messages, strp, msg_next); strp 1598 dev/systrace.c TAILQ_REMOVE(&fst->processes, strp, next); strp 1601 dev/systrace.c if (strp->policy) strp 1602 dev/systrace.c systrace_closepolicy(fst, strp->policy); strp 1603 dev/systrace.c systrace_replacefree(strp); strp 1604 dev/systrace.c pool_put(&systr_proc_pl, strp); strp 1629 dev/systrace.c struct str_process *strp; strp 1631 dev/systrace.c strp = pool_get(&systr_proc_pl, PR_NOWAIT); strp 1632 dev/systrace.c if (strp == NULL) strp 1635 dev/systrace.c memset((caddr_t)strp, 0, sizeof(struct str_process)); strp 1636 dev/systrace.c strp->pid = proc->p_pid; strp 1637 dev/systrace.c strp->proc = proc; strp 1638 dev/systrace.c strp->parent = fst; strp 1640 dev/systrace.c TAILQ_INSERT_TAIL(&fst->processes, strp, next); strp 1643 dev/systrace.c proc->p_systrace = strp; strp 1698 dev/systrace.c systrace_msg_ask(struct fsystrace *fst, struct str_process *strp, strp 1701 dev/systrace.c struct str_msg_ask *msg_ask = &strp->msg.msg_data.msg_ask; strp 1709 dev/systrace.c return (systrace_make_msg(strp, SYSTR_MSG_ASK)); strp 1713 dev/systrace.c systrace_msg_result(struct fsystrace *fst, struct str_process *strp, strp 1716 dev/systrace.c struct str_msg_ask *msg_ask = &strp->msg.msg_data.msg_ask; strp 1728 dev/systrace.c return (systrace_make_msg(strp, SYSTR_MSG_RES)); strp 1732 dev/systrace.c systrace_msg_emul(struct fsystrace *fst, struct str_process *strp) strp 1734 dev/systrace.c struct str_msg_emul *msg_emul = &strp->msg.msg_data.msg_emul; strp 1735 dev/systrace.c struct proc *p = strp->proc; strp 1739 dev/systrace.c return (systrace_make_msg(strp, SYSTR_MSG_EMUL)); strp 1743 dev/systrace.c systrace_msg_ugid(struct fsystrace *fst, struct str_process *strp) strp 1745 dev/systrace.c struct str_msg_ugid *msg_ugid = &strp->msg.msg_data.msg_ugid; strp 1746 dev/systrace.c struct proc *p = strp->proc; strp 1751 dev/systrace.c return (systrace_make_msg(strp, SYSTR_MSG_UGID)); strp 1755 dev/systrace.c systrace_make_msg(struct str_process *strp, int type) strp 1757 dev/systrace.c struct str_message *msg = &strp->msg; strp 1758 dev/systrace.c struct fsystrace *fst = strp->parent; strp 1765 dev/systrace.c msg->msg_seqnr = ++strp->seqnr; strp 1767 dev/systrace.c msg->msg_pid = strp->pid; strp 1768 dev/systrace.c if (strp->policy) strp 1769 dev/systrace.c msg->msg_policy = strp->policy->nr; strp 1773 dev/systrace.c SET(strp->flags, STR_PROC_WAITANSWER); strp 1774 dev/systrace.c if (ISSET(strp->flags, STR_PROC_ONQUEUE)) strp 1777 dev/systrace.c TAILQ_INSERT_TAIL(&fst->messages, strp, msg_next); strp 1778 dev/systrace.c SET(strp->flags, STR_PROC_ONQUEUE); strp 1787 dev/systrace.c st = tsleep(strp, pri, "systrmsg", 0); strp 1791 dev/systrace.c if ((strp = curproc->p_systrace) == NULL) strp 1793 dev/systrace.c if (!ISSET(strp->flags, STR_PROC_WAITANSWER)) strp 1801 dev/systrace.c systrace_msg_child(struct fsystrace *fst, struct str_process *strp, pid_t npid) strp 1811 dev/systrace.c nstrp, strp->pid, npid)); strp 1817 dev/systrace.c msg->msg_pid = strp->pid; strp 1818 dev/systrace.c if (strp->policy) strp 1819 dev/systrace.c msg->msg_policy = strp->policy->nr;