1*2d543d20SAndroid Build Coastguard Worker /* Private definitions for libsepol. */
2*2d543d20SAndroid Build Coastguard Worker
3*2d543d20SAndroid Build Coastguard Worker /* Endian conversion for reading and writing binary policies */
4*2d543d20SAndroid Build Coastguard Worker
5*2d543d20SAndroid Build Coastguard Worker #include <sepol/policydb/policydb.h>
6*2d543d20SAndroid Build Coastguard Worker
7*2d543d20SAndroid Build Coastguard Worker
8*2d543d20SAndroid Build Coastguard Worker #ifdef __APPLE__
9*2d543d20SAndroid Build Coastguard Worker #include <sys/types.h>
10*2d543d20SAndroid Build Coastguard Worker #include <machine/endian.h>
11*2d543d20SAndroid Build Coastguard Worker #else
12*2d543d20SAndroid Build Coastguard Worker #include <byteswap.h>
13*2d543d20SAndroid Build Coastguard Worker #include <endian.h>
14*2d543d20SAndroid Build Coastguard Worker #endif
15*2d543d20SAndroid Build Coastguard Worker
16*2d543d20SAndroid Build Coastguard Worker #include <errno.h>
17*2d543d20SAndroid Build Coastguard Worker
18*2d543d20SAndroid Build Coastguard Worker #ifdef __APPLE__
19*2d543d20SAndroid Build Coastguard Worker #define __BYTE_ORDER BYTE_ORDER
20*2d543d20SAndroid Build Coastguard Worker #define __LITTLE_ENDIAN LITTLE_ENDIAN
21*2d543d20SAndroid Build Coastguard Worker #endif
22*2d543d20SAndroid Build Coastguard Worker
23*2d543d20SAndroid Build Coastguard Worker #if __BYTE_ORDER == __LITTLE_ENDIAN
24*2d543d20SAndroid Build Coastguard Worker #define cpu_to_le16(x) (x)
25*2d543d20SAndroid Build Coastguard Worker #define le16_to_cpu(x) (x)
26*2d543d20SAndroid Build Coastguard Worker #define cpu_to_le32(x) (x)
27*2d543d20SAndroid Build Coastguard Worker #define le32_to_cpu(x) (x)
28*2d543d20SAndroid Build Coastguard Worker #define cpu_to_le64(x) (x)
29*2d543d20SAndroid Build Coastguard Worker #define le64_to_cpu(x) (x)
30*2d543d20SAndroid Build Coastguard Worker #else
31*2d543d20SAndroid Build Coastguard Worker #define cpu_to_le16(x) bswap_16(x)
32*2d543d20SAndroid Build Coastguard Worker #define le16_to_cpu(x) bswap_16(x)
33*2d543d20SAndroid Build Coastguard Worker #define cpu_to_le32(x) bswap_32(x)
34*2d543d20SAndroid Build Coastguard Worker #define le32_to_cpu(x) bswap_32(x)
35*2d543d20SAndroid Build Coastguard Worker #define cpu_to_le64(x) bswap_64(x)
36*2d543d20SAndroid Build Coastguard Worker #define le64_to_cpu(x) bswap_64(x)
37*2d543d20SAndroid Build Coastguard Worker #endif
38*2d543d20SAndroid Build Coastguard Worker
39*2d543d20SAndroid Build Coastguard Worker #undef min
40*2d543d20SAndroid Build Coastguard Worker #define min(a,b) (((a) < (b)) ? (a) : (b))
41*2d543d20SAndroid Build Coastguard Worker
42*2d543d20SAndroid Build Coastguard Worker #undef max
43*2d543d20SAndroid Build Coastguard Worker #define max(a,b) ((a) >= (b) ? (a) : (b))
44*2d543d20SAndroid Build Coastguard Worker
45*2d543d20SAndroid Build Coastguard Worker #define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
46*2d543d20SAndroid Build Coastguard Worker
exceeds_available_bytes(const struct policy_file * fp,size_t x,size_t req_elem_size)47*2d543d20SAndroid Build Coastguard Worker static inline int exceeds_available_bytes(const struct policy_file *fp, size_t x, size_t req_elem_size)
48*2d543d20SAndroid Build Coastguard Worker {
49*2d543d20SAndroid Build Coastguard Worker size_t req_size;
50*2d543d20SAndroid Build Coastguard Worker
51*2d543d20SAndroid Build Coastguard Worker /* Remaining input size is only available for mmap'ed memory */
52*2d543d20SAndroid Build Coastguard Worker if (fp->type != PF_USE_MEMORY)
53*2d543d20SAndroid Build Coastguard Worker return 0;
54*2d543d20SAndroid Build Coastguard Worker
55*2d543d20SAndroid Build Coastguard Worker if (__builtin_mul_overflow(x, req_elem_size, &req_size))
56*2d543d20SAndroid Build Coastguard Worker return 1;
57*2d543d20SAndroid Build Coastguard Worker
58*2d543d20SAndroid Build Coastguard Worker return req_size > fp->len;
59*2d543d20SAndroid Build Coastguard Worker }
60*2d543d20SAndroid Build Coastguard Worker
61*2d543d20SAndroid Build Coastguard Worker #define is_saturated(x) ((x) == (typeof(x))-1)
62*2d543d20SAndroid Build Coastguard Worker
63*2d543d20SAndroid Build Coastguard Worker #define zero_or_saturated(x) (((x) == 0) || is_saturated(x))
64*2d543d20SAndroid Build Coastguard Worker
65*2d543d20SAndroid Build Coastguard Worker #define spaceship_cmp(a, b) (((a) > (b)) - ((a) < (b)))
66*2d543d20SAndroid Build Coastguard Worker
67*2d543d20SAndroid Build Coastguard Worker /* Use to ignore intentional unsigned under- and overflows while running under UBSAN. */
68*2d543d20SAndroid Build Coastguard Worker #if defined(__clang__) && defined(__clang_major__) && (__clang_major__ >= 4)
69*2d543d20SAndroid Build Coastguard Worker #if (__clang_major__ >= 12)
70*2d543d20SAndroid Build Coastguard Worker #define ignore_unsigned_overflow_ __attribute__((no_sanitize("unsigned-integer-overflow", "unsigned-shift-base")))
71*2d543d20SAndroid Build Coastguard Worker #else
72*2d543d20SAndroid Build Coastguard Worker #define ignore_unsigned_overflow_ __attribute__((no_sanitize("unsigned-integer-overflow")))
73*2d543d20SAndroid Build Coastguard Worker #endif
74*2d543d20SAndroid Build Coastguard Worker #else
75*2d543d20SAndroid Build Coastguard Worker #define ignore_unsigned_overflow_
76*2d543d20SAndroid Build Coastguard Worker #endif
77*2d543d20SAndroid Build Coastguard Worker
78*2d543d20SAndroid Build Coastguard Worker /* Policy compatibility information. */
79*2d543d20SAndroid Build Coastguard Worker struct policydb_compat_info {
80*2d543d20SAndroid Build Coastguard Worker unsigned int type;
81*2d543d20SAndroid Build Coastguard Worker unsigned int version;
82*2d543d20SAndroid Build Coastguard Worker unsigned int sym_num;
83*2d543d20SAndroid Build Coastguard Worker unsigned int ocon_num;
84*2d543d20SAndroid Build Coastguard Worker unsigned int target_platform;
85*2d543d20SAndroid Build Coastguard Worker };
86*2d543d20SAndroid Build Coastguard Worker
87*2d543d20SAndroid Build Coastguard Worker extern const struct policydb_compat_info *policydb_lookup_compat(unsigned int version,
88*2d543d20SAndroid Build Coastguard Worker unsigned int type,
89*2d543d20SAndroid Build Coastguard Worker unsigned int target_platform);
90*2d543d20SAndroid Build Coastguard Worker
91*2d543d20SAndroid Build Coastguard Worker /* Reading from a policy "file". */
92*2d543d20SAndroid Build Coastguard Worker extern int next_entry(void *buf, struct policy_file *fp, size_t bytes);
93*2d543d20SAndroid Build Coastguard Worker extern size_t put_entry(const void *ptr, size_t size, size_t n,
94*2d543d20SAndroid Build Coastguard Worker struct policy_file *fp);
95*2d543d20SAndroid Build Coastguard Worker extern int str_read(char **strp, struct policy_file *fp, size_t len);
96*2d543d20SAndroid Build Coastguard Worker
97*2d543d20SAndroid Build Coastguard Worker #ifndef HAVE_REALLOCARRAY
reallocarray(void * ptr,size_t nmemb,size_t size)98*2d543d20SAndroid Build Coastguard Worker static inline void* reallocarray(void *ptr, size_t nmemb, size_t size) {
99*2d543d20SAndroid Build Coastguard Worker if (size && nmemb > (size_t)-1 / size) {
100*2d543d20SAndroid Build Coastguard Worker errno = ENOMEM;
101*2d543d20SAndroid Build Coastguard Worker return NULL;
102*2d543d20SAndroid Build Coastguard Worker }
103*2d543d20SAndroid Build Coastguard Worker
104*2d543d20SAndroid Build Coastguard Worker return realloc(ptr, nmemb * size);
105*2d543d20SAndroid Build Coastguard Worker }
106*2d543d20SAndroid Build Coastguard Worker #endif
107