xref: /third_party/selinux/libsepol/src/private.h (revision 6cd6a6ac)
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