- LIST_FOREACH(l, &alllctx, lc_list) {
- LCTX_LOCK(l);
- kil.id = l->lc_id;
- kil.mc = l->lc_mc;
- LCTX_UNLOCK(l);
- error = SYSCTL_OUT(req, (caddr_t)&kil, sizeof(kil));
- if (error)
- break;
- }
-out:
- ALLLCTX_UNLOCK;
-
- return (error);
-}
-
-SYSCTL_NODE(_kern, KERN_LCTX, lctx, CTLFLAG_RW|CTLFLAG_LOCKED, 0, "Login Context");
-
-SYSCTL_PROC(_kern_lctx, KERN_LCTX_ALL, all, CTLFLAG_RD|CTLTYPE_STRUCT | CTLFLAG_LOCKED,
- 0, 0, sysctl_kern_lctx, "S,lctx",
- "Return entire login context table");
-SYSCTL_NODE(_kern_lctx, KERN_LCTX_LCID, lcid, CTLFLAG_RD | CTLFLAG_LOCKED,
- sysctl_kern_lctx, "Login Context Table");
-SYSCTL_INT(_kern_lctx, OID_AUTO, last, CTLFLAG_RD | CTLFLAG_LOCKED, &lastlcid, 0, "");
-SYSCTL_INT(_kern_lctx, OID_AUTO, count, CTLFLAG_RD | CTLFLAG_LOCKED, &alllctx_cnt, 0, "");
-SYSCTL_INT(_kern_lctx, OID_AUTO, max, CTLFLAG_RW | CTLFLAG_LOCKED, &maxlcid, 0, "");
-
-#endif /* LCTX */
-
-/* Code Signing related routines */
-
-int
-csops(__unused proc_t p, struct csops_args *uap, __unused int32_t *retval)
-{
- return(csops_internal(uap->pid, uap->ops, uap->useraddr,
- uap->usersize, USER_ADDR_NULL));
-}
-
-int
-csops_audittoken(__unused proc_t p, struct csops_audittoken_args *uap, __unused int32_t *retval)
-{
- if (uap->uaudittoken == USER_ADDR_NULL)
- return(EINVAL);
- return(csops_internal(uap->pid, uap->ops, uap->useraddr,
- uap->usersize, uap->uaudittoken));
-}
-
-static int
-csops_copy_token(void *start, size_t length, user_size_t usize, user_addr_t uaddr)
-{
- char fakeheader[8] = { 0 };
- int error;
-
- if (usize < sizeof(fakeheader))
- return ERANGE;
-
- /* if no blob, fill in zero header */
- if (NULL == start) {
- start = fakeheader;
- length = sizeof(fakeheader);
- } else if (usize < length) {
- /* ... if input too short, copy out length of entitlement */
- uint32_t length32 = htonl((uint32_t)length);
- memcpy(&fakeheader[4], &length32, sizeof(length32));
-
- error = copyout(fakeheader, uaddr, sizeof(fakeheader));
- if (error == 0)
- return ERANGE; /* input buffer to short, ERANGE signals that */
- return error;
- }
- return copyout(start, uaddr, length);
-}
-
-static int
-csops_internal(pid_t pid, int ops, user_addr_t uaddr, user_size_t usersize, user_addr_t uaudittoken)
-{
- size_t usize = (size_t)CAST_DOWN(size_t, usersize);
- proc_t pt;
- int forself;
- int error;
- vnode_t tvp;
- off_t toff;
- unsigned char cdhash[SHA1_RESULTLEN];
- audit_token_t token;
- unsigned int upid=0, uidversion = 0;
-
- forself = error = 0;
-
- if (pid == 0)
- pid = proc_selfpid();
- if (pid == proc_selfpid())
- forself = 1;
-
-
- switch (ops) {
- case CS_OPS_STATUS:
- case CS_OPS_CDHASH:
- case CS_OPS_PIDOFFSET:
- case CS_OPS_ENTITLEMENTS_BLOB:
- case CS_OPS_BLOB:
- break; /* unrestricted */
- default:
- if (forself == 0 && kauth_cred_issuser(kauth_cred_get()) != TRUE)
- return(EPERM);
- break;
- }
-
- pt = proc_find(pid);
- if (pt == PROC_NULL)
- return(ESRCH);
-