1 /* Private definitions for libsepol. */ 2 3 /* Endian conversion for reading and writing binary policies */ 4 5 #include <sepol/policydb/policydb.h> 6 7 8 #ifdef __APPLE__ 9 #include <sys/types.h> 10 #include <machine/endian.h> 11 #else 12 #include <byteswap.h> 13 #include <endian.h> 14 #endif 15 16 #include <errno.h> 17 18 #ifdef __APPLE__ 19 #define __BYTE_ORDER BYTE_ORDER 20 #define __LITTLE_ENDIAN LITTLE_ENDIAN 21 #endif 22 23 #if __BYTE_ORDER == __LITTLE_ENDIAN 24 #define cpu_to_le16(x) (x) 25 #define le16_to_cpu(x) (x) 26 #define cpu_to_le32(x) (x) 27 #define le32_to_cpu(x) (x) 28 #define cpu_to_le64(x) (x) 29 #define le64_to_cpu(x) (x) 30 #else 31 #define cpu_to_le16(x) bswap_16(x) 32 #define le16_to_cpu(x) bswap_16(x) 33 #define cpu_to_le32(x) bswap_32(x) 34 #define le32_to_cpu(x) bswap_32(x) 35 #define cpu_to_le64(x) bswap_64(x) 36 #define le64_to_cpu(x) bswap_64(x) 37 #endif 38 39 #undef min 40 #define min(a,b) (((a) < (b)) ? (a) : (b)) 41 42 #undef max 43 #define max(a,b) ((a) >= (b) ? (a) : (b)) 44 45 #define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0])) 46 47 #define is_saturated(x) (x == (typeof(x))-1) 48 #define zero_or_saturated(x) ((x == 0) || is_saturated(x)) 49 50 #define spaceship_cmp(a, b) (((a) > (b)) - ((a) < (b))) 51 52 /* Use to ignore intentional unsigned under- and overflows while running under UBSAN. */ 53 #if defined(__clang__) && defined(__clang_major__) && (__clang_major__ >= 4) 54 #if (__clang_major__ >= 12) 55 #define ignore_unsigned_overflow_ __attribute__((no_sanitize("unsigned-integer-overflow", "unsigned-shift-base"))) 56 #else 57 #define ignore_unsigned_overflow_ __attribute__((no_sanitize("unsigned-integer-overflow"))) 58 #endif 59 #else 60 #define ignore_unsigned_overflow_ 61 #endif 62 63 /* Policy compatibility information. */ 64 struct policydb_compat_info { 65 unsigned int type; 66 unsigned int version; 67 unsigned int sym_num; 68 unsigned int ocon_num; 69 unsigned int target_platform; 70 }; 71 72 extern const struct policydb_compat_info *policydb_lookup_compat(unsigned int version, 73 unsigned int type, 74 unsigned int target_platform); 75 76 /* Reading from a policy "file". */ 77 extern int next_entry(void *buf, struct policy_file *fp, size_t bytes); 78 extern size_t put_entry(const void *ptr, size_t size, size_t n, 79 struct policy_file *fp); 80 extern int str_read(char **strp, struct policy_file *fp, size_t len); 81