16cd6a6acSopenharmony_ci/* Private definitions for libsepol. */ 26cd6a6acSopenharmony_ci 36cd6a6acSopenharmony_ci/* Endian conversion for reading and writing binary policies */ 46cd6a6acSopenharmony_ci 56cd6a6acSopenharmony_ci#include <sepol/policydb/policydb.h> 66cd6a6acSopenharmony_ci 76cd6a6acSopenharmony_ci 86cd6a6acSopenharmony_ci#ifdef __APPLE__ 96cd6a6acSopenharmony_ci#include <sys/types.h> 106cd6a6acSopenharmony_ci#include <machine/endian.h> 116cd6a6acSopenharmony_ci#else 126cd6a6acSopenharmony_ci#include <byteswap.h> 136cd6a6acSopenharmony_ci#include <endian.h> 146cd6a6acSopenharmony_ci#endif 156cd6a6acSopenharmony_ci 166cd6a6acSopenharmony_ci#include <errno.h> 176cd6a6acSopenharmony_ci 186cd6a6acSopenharmony_ci#ifdef __APPLE__ 196cd6a6acSopenharmony_ci#define __BYTE_ORDER BYTE_ORDER 206cd6a6acSopenharmony_ci#define __LITTLE_ENDIAN LITTLE_ENDIAN 216cd6a6acSopenharmony_ci#endif 226cd6a6acSopenharmony_ci 236cd6a6acSopenharmony_ci#if __BYTE_ORDER == __LITTLE_ENDIAN 246cd6a6acSopenharmony_ci#define cpu_to_le16(x) (x) 256cd6a6acSopenharmony_ci#define le16_to_cpu(x) (x) 266cd6a6acSopenharmony_ci#define cpu_to_le32(x) (x) 276cd6a6acSopenharmony_ci#define le32_to_cpu(x) (x) 286cd6a6acSopenharmony_ci#define cpu_to_le64(x) (x) 296cd6a6acSopenharmony_ci#define le64_to_cpu(x) (x) 306cd6a6acSopenharmony_ci#else 316cd6a6acSopenharmony_ci#define cpu_to_le16(x) bswap_16(x) 326cd6a6acSopenharmony_ci#define le16_to_cpu(x) bswap_16(x) 336cd6a6acSopenharmony_ci#define cpu_to_le32(x) bswap_32(x) 346cd6a6acSopenharmony_ci#define le32_to_cpu(x) bswap_32(x) 356cd6a6acSopenharmony_ci#define cpu_to_le64(x) bswap_64(x) 366cd6a6acSopenharmony_ci#define le64_to_cpu(x) bswap_64(x) 376cd6a6acSopenharmony_ci#endif 386cd6a6acSopenharmony_ci 396cd6a6acSopenharmony_ci#undef min 406cd6a6acSopenharmony_ci#define min(a,b) (((a) < (b)) ? (a) : (b)) 416cd6a6acSopenharmony_ci 426cd6a6acSopenharmony_ci#undef max 436cd6a6acSopenharmony_ci#define max(a,b) ((a) >= (b) ? (a) : (b)) 446cd6a6acSopenharmony_ci 456cd6a6acSopenharmony_ci#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0])) 466cd6a6acSopenharmony_ci 476cd6a6acSopenharmony_ci#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION 486cd6a6acSopenharmony_ci# define is_saturated(x) (x == (typeof(x))-1 || (x) > (1U << 16)) 496cd6a6acSopenharmony_ci#else 506cd6a6acSopenharmony_ci# define is_saturated(x) (x == (typeof(x))-1) 516cd6a6acSopenharmony_ci#endif 526cd6a6acSopenharmony_ci 536cd6a6acSopenharmony_ci#define zero_or_saturated(x) ((x == 0) || is_saturated(x)) 546cd6a6acSopenharmony_ci 556cd6a6acSopenharmony_ci#define spaceship_cmp(a, b) (((a) > (b)) - ((a) < (b))) 566cd6a6acSopenharmony_ci 576cd6a6acSopenharmony_ci/* Use to ignore intentional unsigned under- and overflows while running under UBSAN. */ 586cd6a6acSopenharmony_ci#if defined(__clang__) && defined(__clang_major__) && (__clang_major__ >= 4) 596cd6a6acSopenharmony_ci#if (__clang_major__ >= 12) 606cd6a6acSopenharmony_ci#define ignore_unsigned_overflow_ __attribute__((no_sanitize("unsigned-integer-overflow", "unsigned-shift-base"))) 616cd6a6acSopenharmony_ci#else 626cd6a6acSopenharmony_ci#define ignore_unsigned_overflow_ __attribute__((no_sanitize("unsigned-integer-overflow"))) 636cd6a6acSopenharmony_ci#endif 646cd6a6acSopenharmony_ci#else 656cd6a6acSopenharmony_ci#define ignore_unsigned_overflow_ 666cd6a6acSopenharmony_ci#endif 676cd6a6acSopenharmony_ci 686cd6a6acSopenharmony_ci/* Policy compatibility information. */ 696cd6a6acSopenharmony_cistruct policydb_compat_info { 706cd6a6acSopenharmony_ci unsigned int type; 716cd6a6acSopenharmony_ci unsigned int version; 726cd6a6acSopenharmony_ci unsigned int sym_num; 736cd6a6acSopenharmony_ci unsigned int ocon_num; 746cd6a6acSopenharmony_ci unsigned int target_platform; 756cd6a6acSopenharmony_ci}; 766cd6a6acSopenharmony_ci 776cd6a6acSopenharmony_ciextern const struct policydb_compat_info *policydb_lookup_compat(unsigned int version, 786cd6a6acSopenharmony_ci unsigned int type, 796cd6a6acSopenharmony_ci unsigned int target_platform); 806cd6a6acSopenharmony_ci 816cd6a6acSopenharmony_ci/* Reading from a policy "file". */ 826cd6a6acSopenharmony_ciextern int next_entry(void *buf, struct policy_file *fp, size_t bytes); 836cd6a6acSopenharmony_ciextern size_t put_entry(const void *ptr, size_t size, size_t n, 846cd6a6acSopenharmony_ci struct policy_file *fp); 856cd6a6acSopenharmony_ciextern int str_read(char **strp, struct policy_file *fp, size_t len); 866cd6a6acSopenharmony_ci 876cd6a6acSopenharmony_ci#ifndef HAVE_REALLOCARRAY 886cd6a6acSopenharmony_cistatic inline void* reallocarray(void *ptr, size_t nmemb, size_t size) { 896cd6a6acSopenharmony_ci if (size && nmemb > (size_t)-1 / size) { 906cd6a6acSopenharmony_ci errno = ENOMEM; 916cd6a6acSopenharmony_ci return NULL; 926cd6a6acSopenharmony_ci } 936cd6a6acSopenharmony_ci 946cd6a6acSopenharmony_ci return realloc(ptr, nmemb * size); 956cd6a6acSopenharmony_ci} 966cd6a6acSopenharmony_ci#endif 97