xref: /xnu-8019.80.24/tools/cred_dump_backtraces.c (revision a325d9c4a84054e40bbe985afedcb50ab80993ea)
1*a325d9c4SApple OSS Distributions /* quick and dirty hack to grab credential backtrace info from kernel via sysctl.
2*a325d9c4SApple OSS Distributions  * sysctl is only defined if xnu is built with DEBUG_CRED defined.
3*a325d9c4SApple OSS Distributions  * The current version of this is used to target a specific credential and gather
4*a325d9c4SApple OSS Distributions  * backtrace info on all references and unreferences.
5*a325d9c4SApple OSS Distributions  */
6*a325d9c4SApple OSS Distributions 
7*a325d9c4SApple OSS Distributions #include <stdio.h>
8*a325d9c4SApple OSS Distributions #include <stdlib.h>
9*a325d9c4SApple OSS Distributions #include <fcntl.h>
10*a325d9c4SApple OSS Distributions #include <limits.h>
11*a325d9c4SApple OSS Distributions #include <string.h>
12*a325d9c4SApple OSS Distributions #include <errno.h>
13*a325d9c4SApple OSS Distributions #include <unistd.h>
14*a325d9c4SApple OSS Distributions #include <sys/stat.h>
15*a325d9c4SApple OSS Distributions #include <sys/types.h>
16*a325d9c4SApple OSS Distributions #include <sys/sysctl.h>
17*a325d9c4SApple OSS Distributions #include <bsm/audit.h>
18*a325d9c4SApple OSS Distributions 
19*a325d9c4SApple OSS Distributions /* bad!  this is replicated in kern_credential.c.  make sure they stay in sync!
20*a325d9c4SApple OSS Distributions  * Or better yet have commone header file?
21*a325d9c4SApple OSS Distributions  */
22*a325d9c4SApple OSS Distributions #define MAX_STACK_DEPTH 8
23*a325d9c4SApple OSS Distributions struct cred_backtrace {
24*a325d9c4SApple OSS Distributions 	int                             depth;
25*a325d9c4SApple OSS Distributions 	uint32_t                stack[MAX_STACK_DEPTH];
26*a325d9c4SApple OSS Distributions };
27*a325d9c4SApple OSS Distributions typedef struct cred_backtrace cred_backtrace;
28*a325d9c4SApple OSS Distributions 
29*a325d9c4SApple OSS Distributions struct cred_debug_buffer {
30*a325d9c4SApple OSS Distributions 	int                             next_slot;
31*a325d9c4SApple OSS Distributions 	cred_backtrace  stack_buffer[1];
32*a325d9c4SApple OSS Distributions };
33*a325d9c4SApple OSS Distributions typedef struct cred_debug_buffer cred_debug_buffer;
34*a325d9c4SApple OSS Distributions 
35*a325d9c4SApple OSS Distributions 
main(int argc,char * argv[])36*a325d9c4SApple OSS Distributions main( int argc, char *argv[] )
37*a325d9c4SApple OSS Distributions {
38*a325d9c4SApple OSS Distributions 	int                             err, i, j;
39*a325d9c4SApple OSS Distributions 	size_t                  len;
40*a325d9c4SApple OSS Distributions 	char                        *my_bufferp = NULL;
41*a325d9c4SApple OSS Distributions 	cred_debug_buffer       *bt_buffp;
42*a325d9c4SApple OSS Distributions 	cred_backtrace          *btp;
43*a325d9c4SApple OSS Distributions 
44*a325d9c4SApple OSS Distributions 	/* get size of buffer we will need */
45*a325d9c4SApple OSS Distributions 	len = 0;
46*a325d9c4SApple OSS Distributions 	err = sysctlbyname( "kern.cred_bt", NULL, &len, NULL, 0 );
47*a325d9c4SApple OSS Distributions 	if (err != 0) {
48*a325d9c4SApple OSS Distributions 		printf( "sysctl failed  \n" );
49*a325d9c4SApple OSS Distributions 		printf( "\terrno %d - \"%s\" \n", errno, strerror( errno ));
50*a325d9c4SApple OSS Distributions 		return;
51*a325d9c4SApple OSS Distributions 	}
52*a325d9c4SApple OSS Distributions 
53*a325d9c4SApple OSS Distributions 	/* get a buffer for our back traces */
54*a325d9c4SApple OSS Distributions 	my_bufferp = malloc( len );
55*a325d9c4SApple OSS Distributions 	if (my_bufferp == NULL) {
56*a325d9c4SApple OSS Distributions 		printf( "malloc error %d - \"%s\" \n", errno, strerror( errno ));
57*a325d9c4SApple OSS Distributions 		return;
58*a325d9c4SApple OSS Distributions 	}
59*a325d9c4SApple OSS Distributions 	err = sysctlbyname( "kern.cred_bt", my_bufferp, &len, NULL, 0 );
60*a325d9c4SApple OSS Distributions 	if (err != 0) {
61*a325d9c4SApple OSS Distributions 		printf( "sysctl 2 failed  \n" );
62*a325d9c4SApple OSS Distributions 		printf( "\terrno %d - \"%s\" \n", errno, strerror( errno ));
63*a325d9c4SApple OSS Distributions 		return;
64*a325d9c4SApple OSS Distributions 	}
65*a325d9c4SApple OSS Distributions 
66*a325d9c4SApple OSS Distributions 	bt_buffp = (cred_debug_buffer *) my_bufferp;
67*a325d9c4SApple OSS Distributions 	btp = &bt_buffp->stack_buffer[0];
68*a325d9c4SApple OSS Distributions 
69*a325d9c4SApple OSS Distributions 	printf("number of traces %d \n", bt_buffp->next_slot);
70*a325d9c4SApple OSS Distributions 	for (i = 0; i < bt_buffp->next_slot; i++, btp++) {
71*a325d9c4SApple OSS Distributions 		printf("[%d] ", i);
72*a325d9c4SApple OSS Distributions 		for (j = 0; j < btp->depth; j++) {
73*a325d9c4SApple OSS Distributions 			printf("%p ", btp->stack[j]);
74*a325d9c4SApple OSS Distributions 		}
75*a325d9c4SApple OSS Distributions 		printf("\n");
76*a325d9c4SApple OSS Distributions 	}
77*a325d9c4SApple OSS Distributions 
78*a325d9c4SApple OSS Distributions 	return;
79*a325d9c4SApple OSS Distributions }
80