diff --git a/libselinux/src/init.c b/libselinux/src/init.c index 542c979b9..2df515f51 100644 --- a/libselinux/src/init.c +++ b/libselinux/src/init.c @@ -146,6 +146,7 @@ void set_selinuxmnt(const char *mnt) static void init_lib(void) __attribute__ ((constructor)); static void init_lib(void) { + SELINUX_PROTECT_ERRNO; selinux_page_size = sysconf(_SC_PAGE_SIZE); init_selinuxmnt(); #ifndef ANDROID diff --git a/libselinux/src/selinux_internal.h b/libselinux/src/selinux_internal.h index 450a42c2d..e7ade0c3b 100644 --- a/libselinux/src/selinux_internal.h +++ b/libselinux/src/selinux_internal.h @@ -3,6 +3,7 @@ #include #include +#include extern int require_seusers ; @@ -131,4 +132,13 @@ void *reallocarray(void *ptr, size_t nmemb, size_t size); #define IGNORE_DEPRECATED_DECLARATION_END #endif +static inline void selinux_reset_errno(int *saved_errno) { + if (*saved_errno < 0) + return; + + errno = *saved_errno; +} + +#define SELINUX_PROTECT_ERRNO __attribute__((__cleanup__(selinux_reset_errno))) \ + __attribute__((__unused__)) int __selinux_saved_errno = errno #endif /* SELINUX_INTERNAL_H_ */