1*5c2921b0SApple OSS Distributions #include <darwintest.h>
2*5c2921b0SApple OSS Distributions #include <stdio.h>
3*5c2921b0SApple OSS Distributions #include <stdlib.h>
4*5c2921b0SApple OSS Distributions #include <stdbool.h>
5*5c2921b0SApple OSS Distributions #include <errno.h>
6*5c2921b0SApple OSS Distributions #include <libproc.h>
7*5c2921b0SApple OSS Distributions #include <bsm/libbsm.h>
8*5c2921b0SApple OSS Distributions
9*5c2921b0SApple OSS Distributions #undef USE_AUDIT_TOKEN_FOR_PID
10*5c2921b0SApple OSS Distributions
11*5c2921b0SApple OSS Distributions #ifdef USE_AUDIT_TOKEN_FOR_PID
12*5c2921b0SApple OSS Distributions static bool
audit_token_for_pid(pid_t pid,audit_token_t * token)13*5c2921b0SApple OSS Distributions audit_token_for_pid(pid_t pid, audit_token_t *token)
14*5c2921b0SApple OSS Distributions {
15*5c2921b0SApple OSS Distributions kern_return_t err;
16*5c2921b0SApple OSS Distributions task_t task;
17*5c2921b0SApple OSS Distributions mach_msg_type_number_t info_size = TASK_AUDIT_TOKEN_COUNT;
18*5c2921b0SApple OSS Distributions
19*5c2921b0SApple OSS Distributions err = task_for_pid(mach_task_self(), pid, &task);
20*5c2921b0SApple OSS Distributions if (err != KERN_SUCCESS) {
21*5c2921b0SApple OSS Distributions printf("task_for_pid returned %d\n", err);
22*5c2921b0SApple OSS Distributions return false;
23*5c2921b0SApple OSS Distributions }
24*5c2921b0SApple OSS Distributions
25*5c2921b0SApple OSS Distributions err = task_info(task, TASK_AUDIT_TOKEN, (integer_t *)token, &info_size);
26*5c2921b0SApple OSS Distributions if (err != KERN_SUCCESS) {
27*5c2921b0SApple OSS Distributions printf("task_info returned %d\n", err);
28*5c2921b0SApple OSS Distributions return false;
29*5c2921b0SApple OSS Distributions }
30*5c2921b0SApple OSS Distributions
31*5c2921b0SApple OSS Distributions return true;
32*5c2921b0SApple OSS Distributions }
33*5c2921b0SApple OSS Distributions
34*5c2921b0SApple OSS Distributions #else
35*5c2921b0SApple OSS Distributions
36*5c2921b0SApple OSS Distributions static int
idversion_for_pid(pid_t pid)37*5c2921b0SApple OSS Distributions idversion_for_pid(pid_t pid)
38*5c2921b0SApple OSS Distributions {
39*5c2921b0SApple OSS Distributions struct proc_uniqidentifierinfo uniqidinfo = {0};
40*5c2921b0SApple OSS Distributions
41*5c2921b0SApple OSS Distributions int ret = proc_pidinfo(pid, PROC_PIDUNIQIDENTIFIERINFO, 0, &uniqidinfo, sizeof(uniqidinfo));
42*5c2921b0SApple OSS Distributions if (ret <= 0) {
43*5c2921b0SApple OSS Distributions perror("proc_pidinfo(PROC_PIDUNIQIDENTIFIERINFO)");
44*5c2921b0SApple OSS Distributions T_ASSERT_FAIL("proc_pidinfo(%d, PROC_PIDUNIQIDENTIFIERINFO) failed unexpectedly with errno %d", pid, errno);
45*5c2921b0SApple OSS Distributions }
46*5c2921b0SApple OSS Distributions
47*5c2921b0SApple OSS Distributions #ifdef NOTDEF
48*5c2921b0SApple OSS Distributions printf("%s>pid = %d, p_uniqueid = %lld\n", __FUNCTION__, pid, uniqidinfo.p_uniqueid);
49*5c2921b0SApple OSS Distributions printf("%s>pid = %d, p_idversion = %d\n", __FUNCTION__, pid, uniqidinfo.p_idversion);
50*5c2921b0SApple OSS Distributions #endif
51*5c2921b0SApple OSS Distributions
52*5c2921b0SApple OSS Distributions return uniqidinfo.p_idversion;
53*5c2921b0SApple OSS Distributions }
54*5c2921b0SApple OSS Distributions #endif
55*5c2921b0SApple OSS Distributions
56*5c2921b0SApple OSS Distributions static void
show_pidpaths(void)57*5c2921b0SApple OSS Distributions show_pidpaths(void)
58*5c2921b0SApple OSS Distributions {
59*5c2921b0SApple OSS Distributions char buffer[PROC_PIDPATHINFO_MAXSIZE] = {};
60*5c2921b0SApple OSS Distributions int count = 0;
61*5c2921b0SApple OSS Distributions
62*5c2921b0SApple OSS Distributions for (pid_t pid = 1; ((pid < 1000) && (count <= 25)); pid++) {
63*5c2921b0SApple OSS Distributions int ret = proc_pidpath(pid, buffer, sizeof(buffer));
64*5c2921b0SApple OSS Distributions if (ret <= 0) {
65*5c2921b0SApple OSS Distributions if (errno == ESRCH) {
66*5c2921b0SApple OSS Distributions continue;
67*5c2921b0SApple OSS Distributions }
68*5c2921b0SApple OSS Distributions T_ASSERT_FAIL("proc_pidpath(%d) failed unexpectedly with errno %d", pid, errno);
69*5c2921b0SApple OSS Distributions }
70*5c2921b0SApple OSS Distributions count++;
71*5c2921b0SApple OSS Distributions
72*5c2921b0SApple OSS Distributions memset(buffer, 0, sizeof(buffer));
73*5c2921b0SApple OSS Distributions
74*5c2921b0SApple OSS Distributions audit_token_t token = { 0 };
75*5c2921b0SApple OSS Distributions #ifdef USE_AUDIT_TOKEN_FOR_PID
76*5c2921b0SApple OSS Distributions if (!audit_token_for_pid(pid, &token)) {
77*5c2921b0SApple OSS Distributions T_ASSERT_FAIL("audit_token_for_pid(%d) failed", pid);
78*5c2921b0SApple OSS Distributions continue;
79*5c2921b0SApple OSS Distributions }
80*5c2921b0SApple OSS Distributions #else
81*5c2921b0SApple OSS Distributions token.val[5] = (unsigned int)pid;
82*5c2921b0SApple OSS Distributions token.val[7] = (unsigned int)idversion_for_pid(pid);
83*5c2921b0SApple OSS Distributions #endif
84*5c2921b0SApple OSS Distributions ret = proc_pidpath_audittoken(&token, buffer, sizeof(buffer));
85*5c2921b0SApple OSS Distributions if (ret <= 0) {
86*5c2921b0SApple OSS Distributions if (errno == ESRCH) {
87*5c2921b0SApple OSS Distributions continue;
88*5c2921b0SApple OSS Distributions }
89*5c2921b0SApple OSS Distributions T_ASSERT_FAIL("proc_pidpath_audittoken(%d) failed unexpectedly with errno %d", pid, errno);
90*5c2921b0SApple OSS Distributions }
91*5c2921b0SApple OSS Distributions T_PASS("%5d %s\n", pid, buffer);
92*5c2921b0SApple OSS Distributions
93*5c2921b0SApple OSS Distributions token.val[7]--; /* Change to idversion so the next call fails */
94*5c2921b0SApple OSS Distributions ret = proc_pidpath_audittoken(&token, buffer, sizeof(buffer));
95*5c2921b0SApple OSS Distributions T_ASSERT_LE(ret, 0, "proc_pidpath_audittoken() failed as expected due to incorrect idversion");
96*5c2921b0SApple OSS Distributions T_ASSERT_EQ(errno, ESRCH, "errno is ESRCH as expected");
97*5c2921b0SApple OSS Distributions }
98*5c2921b0SApple OSS Distributions }
99*5c2921b0SApple OSS Distributions
100*5c2921b0SApple OSS Distributions T_DECL(proc_pidpath_audittoken, "Test proc_pidpath_audittoken()", T_META_ASROOT(false))
101*5c2921b0SApple OSS Distributions {
102*5c2921b0SApple OSS Distributions show_pidpaths();
103*5c2921b0SApple OSS Distributions T_PASS("Successfully tested prod_pidpath_audittoken()");
104*5c2921b0SApple OSS Distributions T_END;
105*5c2921b0SApple OSS Distributions }
106