xref: /aosp_15_r20/external/selinux/libselinux/src/callbacks.c (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker /*
2*2d543d20SAndroid Build Coastguard Worker  * User-supplied callbacks and default implementations.
3*2d543d20SAndroid Build Coastguard Worker  * Class and permission mappings.
4*2d543d20SAndroid Build Coastguard Worker  */
5*2d543d20SAndroid Build Coastguard Worker 
6*2d543d20SAndroid Build Coastguard Worker #include <stdio.h>
7*2d543d20SAndroid Build Coastguard Worker #include <stdlib.h>
8*2d543d20SAndroid Build Coastguard Worker #include <stdarg.h>
9*2d543d20SAndroid Build Coastguard Worker #include <errno.h>
10*2d543d20SAndroid Build Coastguard Worker #include <selinux/selinux.h>
11*2d543d20SAndroid Build Coastguard Worker #include "callbacks.h"
12*2d543d20SAndroid Build Coastguard Worker 
13*2d543d20SAndroid Build Coastguard Worker pthread_mutex_t log_mutex = PTHREAD_MUTEX_INITIALIZER;
14*2d543d20SAndroid Build Coastguard Worker 
15*2d543d20SAndroid Build Coastguard Worker /* default implementations */
16*2d543d20SAndroid Build Coastguard Worker static int __attribute__ ((format(printf, 2, 3)))
default_selinux_log(int type,const char * fmt,...)17*2d543d20SAndroid Build Coastguard Worker default_selinux_log(int type __attribute__((unused)), const char *fmt, ...)
18*2d543d20SAndroid Build Coastguard Worker {
19*2d543d20SAndroid Build Coastguard Worker 	int rc;
20*2d543d20SAndroid Build Coastguard Worker 	va_list ap;
21*2d543d20SAndroid Build Coastguard Worker 	va_start(ap, fmt);
22*2d543d20SAndroid Build Coastguard Worker 	rc = vfprintf(stderr, fmt, ap);
23*2d543d20SAndroid Build Coastguard Worker 	va_end(ap);
24*2d543d20SAndroid Build Coastguard Worker 	return rc;
25*2d543d20SAndroid Build Coastguard Worker }
26*2d543d20SAndroid Build Coastguard Worker 
27*2d543d20SAndroid Build Coastguard Worker static int
default_selinux_audit(void * ptr,security_class_t cls,char * buf,size_t len)28*2d543d20SAndroid Build Coastguard Worker default_selinux_audit(void *ptr __attribute__((unused)),
29*2d543d20SAndroid Build Coastguard Worker 		      security_class_t cls __attribute__((unused)),
30*2d543d20SAndroid Build Coastguard Worker 		      char *buf __attribute__((unused)),
31*2d543d20SAndroid Build Coastguard Worker 		      size_t len __attribute__((unused)))
32*2d543d20SAndroid Build Coastguard Worker {
33*2d543d20SAndroid Build Coastguard Worker 	return 0;
34*2d543d20SAndroid Build Coastguard Worker }
35*2d543d20SAndroid Build Coastguard Worker 
36*2d543d20SAndroid Build Coastguard Worker static int
default_selinux_validate(char ** ctx)37*2d543d20SAndroid Build Coastguard Worker default_selinux_validate(char **ctx)
38*2d543d20SAndroid Build Coastguard Worker {
39*2d543d20SAndroid Build Coastguard Worker #ifndef BUILD_HOST
40*2d543d20SAndroid Build Coastguard Worker 	return security_check_context(*ctx);
41*2d543d20SAndroid Build Coastguard Worker #else
42*2d543d20SAndroid Build Coastguard Worker 	(void) ctx;
43*2d543d20SAndroid Build Coastguard Worker 	return 0;
44*2d543d20SAndroid Build Coastguard Worker #endif
45*2d543d20SAndroid Build Coastguard Worker }
46*2d543d20SAndroid Build Coastguard Worker 
47*2d543d20SAndroid Build Coastguard Worker static int
default_selinux_setenforce(int enforcing)48*2d543d20SAndroid Build Coastguard Worker default_selinux_setenforce(int enforcing __attribute__((unused)))
49*2d543d20SAndroid Build Coastguard Worker {
50*2d543d20SAndroid Build Coastguard Worker 	return 0;
51*2d543d20SAndroid Build Coastguard Worker }
52*2d543d20SAndroid Build Coastguard Worker 
53*2d543d20SAndroid Build Coastguard Worker static int
default_selinux_policyload(int seqno)54*2d543d20SAndroid Build Coastguard Worker default_selinux_policyload(int seqno __attribute__((unused)))
55*2d543d20SAndroid Build Coastguard Worker {
56*2d543d20SAndroid Build Coastguard Worker 	return 0;
57*2d543d20SAndroid Build Coastguard Worker }
58*2d543d20SAndroid Build Coastguard Worker 
59*2d543d20SAndroid Build Coastguard Worker /* callback pointers */
60*2d543d20SAndroid Build Coastguard Worker int __attribute__ ((format(printf, 2, 3)))
61*2d543d20SAndroid Build Coastguard Worker (*selinux_log_direct)(int, const char *, ...) =
62*2d543d20SAndroid Build Coastguard Worker 	default_selinux_log;
63*2d543d20SAndroid Build Coastguard Worker 
64*2d543d20SAndroid Build Coastguard Worker int
65*2d543d20SAndroid Build Coastguard Worker (*selinux_audit) (void *, security_class_t, char *, size_t) =
66*2d543d20SAndroid Build Coastguard Worker 	default_selinux_audit;
67*2d543d20SAndroid Build Coastguard Worker 
68*2d543d20SAndroid Build Coastguard Worker int
69*2d543d20SAndroid Build Coastguard Worker (*selinux_validate)(char **ctx) =
70*2d543d20SAndroid Build Coastguard Worker 	default_selinux_validate;
71*2d543d20SAndroid Build Coastguard Worker 
72*2d543d20SAndroid Build Coastguard Worker int
73*2d543d20SAndroid Build Coastguard Worker (*selinux_netlink_setenforce) (int enforcing) =
74*2d543d20SAndroid Build Coastguard Worker 	default_selinux_setenforce;
75*2d543d20SAndroid Build Coastguard Worker 
76*2d543d20SAndroid Build Coastguard Worker int
77*2d543d20SAndroid Build Coastguard Worker (*selinux_netlink_policyload) (int seqno) =
78*2d543d20SAndroid Build Coastguard Worker 	default_selinux_policyload;
79*2d543d20SAndroid Build Coastguard Worker 
80*2d543d20SAndroid Build Coastguard Worker /* callback setting function */
81*2d543d20SAndroid Build Coastguard Worker void
selinux_set_callback(int type,union selinux_callback cb)82*2d543d20SAndroid Build Coastguard Worker selinux_set_callback(int type, union selinux_callback cb)
83*2d543d20SAndroid Build Coastguard Worker {
84*2d543d20SAndroid Build Coastguard Worker 	switch (type) {
85*2d543d20SAndroid Build Coastguard Worker 	case SELINUX_CB_LOG:
86*2d543d20SAndroid Build Coastguard Worker 		selinux_log_direct = cb.func_log;
87*2d543d20SAndroid Build Coastguard Worker 		break;
88*2d543d20SAndroid Build Coastguard Worker 	case SELINUX_CB_AUDIT:
89*2d543d20SAndroid Build Coastguard Worker 		selinux_audit = cb.func_audit;
90*2d543d20SAndroid Build Coastguard Worker 		break;
91*2d543d20SAndroid Build Coastguard Worker 	case SELINUX_CB_VALIDATE:
92*2d543d20SAndroid Build Coastguard Worker 		selinux_validate = cb.func_validate;
93*2d543d20SAndroid Build Coastguard Worker 		break;
94*2d543d20SAndroid Build Coastguard Worker 	case SELINUX_CB_SETENFORCE:
95*2d543d20SAndroid Build Coastguard Worker 		selinux_netlink_setenforce = cb.func_setenforce;
96*2d543d20SAndroid Build Coastguard Worker 		break;
97*2d543d20SAndroid Build Coastguard Worker 	case SELINUX_CB_POLICYLOAD:
98*2d543d20SAndroid Build Coastguard Worker 		selinux_netlink_policyload = cb.func_policyload;
99*2d543d20SAndroid Build Coastguard Worker 		break;
100*2d543d20SAndroid Build Coastguard Worker 	}
101*2d543d20SAndroid Build Coastguard Worker }
102*2d543d20SAndroid Build Coastguard Worker 
103*2d543d20SAndroid Build Coastguard Worker /* callback getting function */
104*2d543d20SAndroid Build Coastguard Worker union selinux_callback
selinux_get_callback(int type)105*2d543d20SAndroid Build Coastguard Worker selinux_get_callback(int type)
106*2d543d20SAndroid Build Coastguard Worker {
107*2d543d20SAndroid Build Coastguard Worker 	union selinux_callback cb;
108*2d543d20SAndroid Build Coastguard Worker 
109*2d543d20SAndroid Build Coastguard Worker 	switch (type) {
110*2d543d20SAndroid Build Coastguard Worker 	case SELINUX_CB_LOG:
111*2d543d20SAndroid Build Coastguard Worker 		cb.func_log = selinux_log_direct;
112*2d543d20SAndroid Build Coastguard Worker 		break;
113*2d543d20SAndroid Build Coastguard Worker 	case SELINUX_CB_AUDIT:
114*2d543d20SAndroid Build Coastguard Worker 		cb.func_audit = selinux_audit;
115*2d543d20SAndroid Build Coastguard Worker 		break;
116*2d543d20SAndroid Build Coastguard Worker 	case SELINUX_CB_VALIDATE:
117*2d543d20SAndroid Build Coastguard Worker 		cb.func_validate = selinux_validate;
118*2d543d20SAndroid Build Coastguard Worker 		break;
119*2d543d20SAndroid Build Coastguard Worker 	case SELINUX_CB_SETENFORCE:
120*2d543d20SAndroid Build Coastguard Worker 		cb.func_setenforce = selinux_netlink_setenforce;
121*2d543d20SAndroid Build Coastguard Worker 		break;
122*2d543d20SAndroid Build Coastguard Worker 	case SELINUX_CB_POLICYLOAD:
123*2d543d20SAndroid Build Coastguard Worker 		cb.func_policyload = selinux_netlink_policyload;
124*2d543d20SAndroid Build Coastguard Worker 		break;
125*2d543d20SAndroid Build Coastguard Worker 	default:
126*2d543d20SAndroid Build Coastguard Worker 		memset(&cb, 0, sizeof(cb));
127*2d543d20SAndroid Build Coastguard Worker 		errno = EINVAL;
128*2d543d20SAndroid Build Coastguard Worker 		break;
129*2d543d20SAndroid Build Coastguard Worker 	}
130*2d543d20SAndroid Build Coastguard Worker 	return cb;
131*2d543d20SAndroid Build Coastguard Worker }
132