/* Private definitions for libsepol. */ /* Endian conversion for reading and writing binary policies */ #include #ifdef __APPLE__ #include #include #else #include #include #endif #include #ifdef __APPLE__ #define __BYTE_ORDER BYTE_ORDER #define __LITTLE_ENDIAN LITTLE_ENDIAN #endif #if __BYTE_ORDER == __LITTLE_ENDIAN #define cpu_to_le16(x) (x) #define le16_to_cpu(x) (x) #define cpu_to_le32(x) (x) #define le32_to_cpu(x) (x) #define cpu_to_le64(x) (x) #define le64_to_cpu(x) (x) #else #define cpu_to_le16(x) bswap_16(x) #define le16_to_cpu(x) bswap_16(x) #define cpu_to_le32(x) bswap_32(x) #define le32_to_cpu(x) bswap_32(x) #define cpu_to_le64(x) bswap_64(x) #define le64_to_cpu(x) bswap_64(x) #endif #undef min #define min(a,b) (((a) < (b)) ? (a) : (b)) #undef max #define max(a,b) ((a) >= (b) ? (a) : (b)) #define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0])) #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION # define is_saturated(x) (x == (typeof(x))-1 || (x) > (1U << 16)) #else # define is_saturated(x) (x == (typeof(x))-1) #endif #define zero_or_saturated(x) ((x == 0) || is_saturated(x)) #define spaceship_cmp(a, b) (((a) > (b)) - ((a) < (b))) /* Use to ignore intentional unsigned under- and overflows while running under UBSAN. */ #if defined(__clang__) && defined(__clang_major__) && (__clang_major__ >= 4) #if (__clang_major__ >= 12) #define ignore_unsigned_overflow_ __attribute__((no_sanitize("unsigned-integer-overflow", "unsigned-shift-base"))) #else #define ignore_unsigned_overflow_ __attribute__((no_sanitize("unsigned-integer-overflow"))) #endif #else #define ignore_unsigned_overflow_ #endif /* Policy compatibility information. */ struct policydb_compat_info { unsigned int type; unsigned int version; unsigned int sym_num; unsigned int ocon_num; unsigned int target_platform; }; extern const struct policydb_compat_info *policydb_lookup_compat(unsigned int version, unsigned int type, unsigned int target_platform); /* Reading from a policy "file". */ extern int next_entry(void *buf, struct policy_file *fp, size_t bytes); extern size_t put_entry(const void *ptr, size_t size, size_t n, struct policy_file *fp); extern int str_read(char **strp, struct policy_file *fp, size_t len); #ifndef HAVE_REALLOCARRAY static inline void* reallocarray(void *ptr, size_t nmemb, size_t size) { if (size && nmemb > (size_t)-1 / size) { errno = ENOMEM; return NULL; } return realloc(ptr, nmemb * size); } #endif