xref: /aosp_15_r20/external/selinux/libselinux/src/selinux_internal.h (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker #ifndef SELINUX_INTERNAL_H_
2*2d543d20SAndroid Build Coastguard Worker #define SELINUX_INTERNAL_H_
3*2d543d20SAndroid Build Coastguard Worker 
4*2d543d20SAndroid Build Coastguard Worker #include <selinux/selinux.h>
5*2d543d20SAndroid Build Coastguard Worker #include <errno.h>
6*2d543d20SAndroid Build Coastguard Worker #include <pthread.h>
7*2d543d20SAndroid Build Coastguard Worker #include <stdio.h>
8*2d543d20SAndroid Build Coastguard Worker 
9*2d543d20SAndroid Build Coastguard Worker 
10*2d543d20SAndroid Build Coastguard Worker extern int require_seusers ;
11*2d543d20SAndroid Build Coastguard Worker extern int selinux_page_size ;
12*2d543d20SAndroid Build Coastguard Worker 
13*2d543d20SAndroid Build Coastguard Worker /* Make pthread_once optional */
14*2d543d20SAndroid Build Coastguard Worker #pragma weak pthread_once
15*2d543d20SAndroid Build Coastguard Worker #pragma weak pthread_key_create
16*2d543d20SAndroid Build Coastguard Worker #pragma weak pthread_key_delete
17*2d543d20SAndroid Build Coastguard Worker #pragma weak pthread_setspecific
18*2d543d20SAndroid Build Coastguard Worker #pragma weak pthread_getspecific
19*2d543d20SAndroid Build Coastguard Worker 
20*2d543d20SAndroid Build Coastguard Worker /* Call handler iff the first call.  */
21*2d543d20SAndroid Build Coastguard Worker #define __selinux_once(ONCE_CONTROL, INIT_FUNCTION)	\
22*2d543d20SAndroid Build Coastguard Worker 	do {						\
23*2d543d20SAndroid Build Coastguard Worker 		if (pthread_once != NULL)		\
24*2d543d20SAndroid Build Coastguard Worker 			pthread_once (&(ONCE_CONTROL), (INIT_FUNCTION));  \
25*2d543d20SAndroid Build Coastguard Worker 		else if ((ONCE_CONTROL) == PTHREAD_ONCE_INIT) {		  \
26*2d543d20SAndroid Build Coastguard Worker 			INIT_FUNCTION ();		\
27*2d543d20SAndroid Build Coastguard Worker 			(ONCE_CONTROL) = 2;		\
28*2d543d20SAndroid Build Coastguard Worker 		}					\
29*2d543d20SAndroid Build Coastguard Worker 	} while (0)
30*2d543d20SAndroid Build Coastguard Worker 
31*2d543d20SAndroid Build Coastguard Worker /* Pthread key macros */
32*2d543d20SAndroid Build Coastguard Worker #define __selinux_key_create(KEY, DESTRUCTOR)			\
33*2d543d20SAndroid Build Coastguard Worker 	(pthread_key_create != NULL ? pthread_key_create(KEY, DESTRUCTOR) : -1)
34*2d543d20SAndroid Build Coastguard Worker 
35*2d543d20SAndroid Build Coastguard Worker #define __selinux_key_delete(KEY)				\
36*2d543d20SAndroid Build Coastguard Worker 	do {							\
37*2d543d20SAndroid Build Coastguard Worker 		if (pthread_key_delete != NULL)			\
38*2d543d20SAndroid Build Coastguard Worker 			pthread_key_delete(KEY);		\
39*2d543d20SAndroid Build Coastguard Worker 	} while (0)
40*2d543d20SAndroid Build Coastguard Worker 
41*2d543d20SAndroid Build Coastguard Worker #define __selinux_setspecific(KEY, VALUE)			\
42*2d543d20SAndroid Build Coastguard Worker 	do {							\
43*2d543d20SAndroid Build Coastguard Worker 		if (pthread_setspecific != NULL)		\
44*2d543d20SAndroid Build Coastguard Worker 			pthread_setspecific(KEY, VALUE);	\
45*2d543d20SAndroid Build Coastguard Worker 	} while (0)
46*2d543d20SAndroid Build Coastguard Worker 
47*2d543d20SAndroid Build Coastguard Worker #define __selinux_getspecific(KEY)				\
48*2d543d20SAndroid Build Coastguard Worker 	(pthread_getspecific != NULL ? pthread_getspecific(KEY) : NULL)
49*2d543d20SAndroid Build Coastguard Worker 
50*2d543d20SAndroid Build Coastguard Worker /* selabel_lookup() is only thread safe if we're compiled with pthreads */
51*2d543d20SAndroid Build Coastguard Worker 
52*2d543d20SAndroid Build Coastguard Worker #pragma weak pthread_mutex_init
53*2d543d20SAndroid Build Coastguard Worker #pragma weak pthread_mutex_destroy
54*2d543d20SAndroid Build Coastguard Worker #pragma weak pthread_mutex_lock
55*2d543d20SAndroid Build Coastguard Worker #pragma weak pthread_mutex_unlock
56*2d543d20SAndroid Build Coastguard Worker 
57*2d543d20SAndroid Build Coastguard Worker #define __pthread_mutex_init(LOCK, ATTR) 			\
58*2d543d20SAndroid Build Coastguard Worker 	do {							\
59*2d543d20SAndroid Build Coastguard Worker 		if (pthread_mutex_init != NULL)			\
60*2d543d20SAndroid Build Coastguard Worker 			pthread_mutex_init(LOCK, ATTR);		\
61*2d543d20SAndroid Build Coastguard Worker 	} while (0)
62*2d543d20SAndroid Build Coastguard Worker 
63*2d543d20SAndroid Build Coastguard Worker #define __pthread_mutex_destroy(LOCK) 				\
64*2d543d20SAndroid Build Coastguard Worker 	do {							\
65*2d543d20SAndroid Build Coastguard Worker 		if (pthread_mutex_destroy != NULL)		\
66*2d543d20SAndroid Build Coastguard Worker 			pthread_mutex_destroy(LOCK);		\
67*2d543d20SAndroid Build Coastguard Worker 	} while (0)
68*2d543d20SAndroid Build Coastguard Worker 
69*2d543d20SAndroid Build Coastguard Worker #define __pthread_mutex_lock(LOCK) 				\
70*2d543d20SAndroid Build Coastguard Worker 	do {							\
71*2d543d20SAndroid Build Coastguard Worker 		if (pthread_mutex_lock != NULL)			\
72*2d543d20SAndroid Build Coastguard Worker 			pthread_mutex_lock(LOCK);		\
73*2d543d20SAndroid Build Coastguard Worker 	} while (0)
74*2d543d20SAndroid Build Coastguard Worker 
75*2d543d20SAndroid Build Coastguard Worker #define __pthread_mutex_unlock(LOCK) 				\
76*2d543d20SAndroid Build Coastguard Worker 	do {							\
77*2d543d20SAndroid Build Coastguard Worker 		if (pthread_mutex_unlock != NULL)		\
78*2d543d20SAndroid Build Coastguard Worker 			pthread_mutex_unlock(LOCK);		\
79*2d543d20SAndroid Build Coastguard Worker 	} while (0)
80*2d543d20SAndroid Build Coastguard Worker 
81*2d543d20SAndroid Build Coastguard Worker #pragma weak pthread_create
82*2d543d20SAndroid Build Coastguard Worker #pragma weak pthread_join
83*2d543d20SAndroid Build Coastguard Worker #pragma weak pthread_cond_init
84*2d543d20SAndroid Build Coastguard Worker #pragma weak pthread_cond_signal
85*2d543d20SAndroid Build Coastguard Worker #pragma weak pthread_cond_destroy
86*2d543d20SAndroid Build Coastguard Worker #pragma weak pthread_cond_wait
87*2d543d20SAndroid Build Coastguard Worker 
88*2d543d20SAndroid Build Coastguard Worker /* check if all functions needed to do parallel operations are available */
89*2d543d20SAndroid Build Coastguard Worker #define __pthread_supported (					\
90*2d543d20SAndroid Build Coastguard Worker 	pthread_create &&					\
91*2d543d20SAndroid Build Coastguard Worker 	pthread_join &&						\
92*2d543d20SAndroid Build Coastguard Worker 	pthread_cond_init &&					\
93*2d543d20SAndroid Build Coastguard Worker 	pthread_cond_destroy &&					\
94*2d543d20SAndroid Build Coastguard Worker 	pthread_cond_signal &&					\
95*2d543d20SAndroid Build Coastguard Worker 	pthread_cond_wait					\
96*2d543d20SAndroid Build Coastguard Worker )
97*2d543d20SAndroid Build Coastguard Worker 
98*2d543d20SAndroid Build Coastguard Worker #define SELINUXDIR "/etc/selinux/"
99*2d543d20SAndroid Build Coastguard Worker #define SELINUXCONFIG SELINUXDIR "config"
100*2d543d20SAndroid Build Coastguard Worker 
101*2d543d20SAndroid Build Coastguard Worker extern int has_selinux_config ;
102*2d543d20SAndroid Build Coastguard Worker 
103*2d543d20SAndroid Build Coastguard Worker #ifndef HAVE_STRLCPY
104*2d543d20SAndroid Build Coastguard Worker size_t strlcpy(char *dest, const char *src, size_t size);
105*2d543d20SAndroid Build Coastguard Worker #endif
106*2d543d20SAndroid Build Coastguard Worker 
107*2d543d20SAndroid Build Coastguard Worker #ifndef HAVE_REALLOCARRAY
108*2d543d20SAndroid Build Coastguard Worker void *reallocarray(void *ptr, size_t nmemb, size_t size);
109*2d543d20SAndroid Build Coastguard Worker #endif
110*2d543d20SAndroid Build Coastguard Worker 
111*2d543d20SAndroid Build Coastguard Worker /* Use to ignore intentional unsigned under- and overflows while running under UBSAN. */
112*2d543d20SAndroid Build Coastguard Worker #if defined(__clang__) && defined(__clang_major__) && (__clang_major__ >= 4)
113*2d543d20SAndroid Build Coastguard Worker #if (__clang_major__ >= 12)
114*2d543d20SAndroid Build Coastguard Worker #define ignore_unsigned_overflow_        __attribute__((no_sanitize("unsigned-integer-overflow", "unsigned-shift-base")))
115*2d543d20SAndroid Build Coastguard Worker #else
116*2d543d20SAndroid Build Coastguard Worker #define ignore_unsigned_overflow_        __attribute__((no_sanitize("unsigned-integer-overflow")))
117*2d543d20SAndroid Build Coastguard Worker #endif
118*2d543d20SAndroid Build Coastguard Worker #else
119*2d543d20SAndroid Build Coastguard Worker #define ignore_unsigned_overflow_
120*2d543d20SAndroid Build Coastguard Worker #endif
121*2d543d20SAndroid Build Coastguard Worker 
122*2d543d20SAndroid Build Coastguard Worker /* Ignore usage of deprecated declaration */
123*2d543d20SAndroid Build Coastguard Worker #ifdef __clang__
124*2d543d20SAndroid Build Coastguard Worker #define IGNORE_DEPRECATED_DECLARATION_BEGIN \
125*2d543d20SAndroid Build Coastguard Worker 	_Pragma("clang diagnostic push") \
126*2d543d20SAndroid Build Coastguard Worker 	_Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"")
127*2d543d20SAndroid Build Coastguard Worker #define IGNORE_DEPRECATED_DECLARATION_END \
128*2d543d20SAndroid Build Coastguard Worker 	_Pragma("clang diagnostic pop")
129*2d543d20SAndroid Build Coastguard Worker #elif defined __GNUC__
130*2d543d20SAndroid Build Coastguard Worker #define IGNORE_DEPRECATED_DECLARATION_BEGIN \
131*2d543d20SAndroid Build Coastguard Worker 	_Pragma("GCC diagnostic push") \
132*2d543d20SAndroid Build Coastguard Worker 	_Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
133*2d543d20SAndroid Build Coastguard Worker #define IGNORE_DEPRECATED_DECLARATION_END \
134*2d543d20SAndroid Build Coastguard Worker 	_Pragma("GCC diagnostic pop")
135*2d543d20SAndroid Build Coastguard Worker #else
136*2d543d20SAndroid Build Coastguard Worker #define IGNORE_DEPRECATED_DECLARATION_BEGIN
137*2d543d20SAndroid Build Coastguard Worker #define IGNORE_DEPRECATED_DECLARATION_END
138*2d543d20SAndroid Build Coastguard Worker #endif
139*2d543d20SAndroid Build Coastguard Worker 
fclose_errno_safe(FILE * stream)140*2d543d20SAndroid Build Coastguard Worker static inline void fclose_errno_safe(FILE *stream)
141*2d543d20SAndroid Build Coastguard Worker {
142*2d543d20SAndroid Build Coastguard Worker 	int saved_errno;
143*2d543d20SAndroid Build Coastguard Worker 
144*2d543d20SAndroid Build Coastguard Worker 	saved_errno = errno;
145*2d543d20SAndroid Build Coastguard Worker 	(void) fclose(stream);
146*2d543d20SAndroid Build Coastguard Worker 	errno = saved_errno;
147*2d543d20SAndroid Build Coastguard Worker }
148*2d543d20SAndroid Build Coastguard Worker 
149*2d543d20SAndroid Build Coastguard Worker #endif /* SELINUX_INTERNAL_H_ */
150