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