diff --git a/meson.build b/meson.build index b13817f0d2..fed51389a8 100644 --- a/meson.build +++ b/meson.build @@ -555,6 +555,7 @@ foreach ident : [ #include #include '''], ['mallinfo', '''#include '''], + ['mallinfo2', '''#include '''], ['execveat', '''#include '''], ['close_range', '''#include '''], ['epoll_pwait2', '''#include '''], diff --git a/src/basic/selinux-util.c b/src/basic/selinux-util.c index ee9e34ed47..8c5544d46b 100644 --- a/src/basic/selinux-util.c +++ b/src/basic/selinux-util.c @@ -84,15 +84,24 @@ void mac_selinux_retest(void) { } #if HAVE_SELINUX -# if HAVE_MALLINFO -static struct mallinfo mallinfo_nowarn(void) { - /* glibc has deprecated mallinfo(), but the replacement malloc_info() returns an XML blob ;=[ */ +# if HAVE_MALLINFO2 +# define HAVE_GENERIC_MALLINFO 1 +typedef struct mallinfo2 generic_mallinfo; +static generic_mallinfo generic_mallinfo_get(void) { + return mallinfo2(); +} +# elif HAVE_MALLINFO +# define HAVE_GENERIC_MALLINFO 1 +typedef struct mallinfo generic_mallinfo; +static generic_mallinfo generic_mallinfo_get(void) { + /* glibc has deprecated mallinfo(), let's suppress the deprecation warning if mallinfo2() doesn't + * exist yet. */ DISABLE_WARNING_DEPRECATED_DECLARATIONS return mallinfo(); REENABLE_WARNING } # else -# warning "mallinfo() is missing, add mallinfo2() supported instead." +# define HAVE_GENERIC_MALLINFO 0 # endif static int open_label_db(void) { @@ -100,8 +109,8 @@ static int open_label_db(void) { usec_t before_timestamp, after_timestamp; char timespan[FORMAT_TIMESPAN_MAX]; -# if HAVE_MALLINFO - struct mallinfo before_mallinfo = mallinfo_nowarn(); +# if HAVE_GENERIC_MALLINFO + generic_mallinfo before_mallinfo = generic_mallinfo_get(); # endif before_timestamp = now(CLOCK_MONOTONIC); @@ -110,10 +119,10 @@ static int open_label_db(void) { return log_enforcing_errno(errno, "Failed to initialize SELinux labeling handle: %m"); after_timestamp = now(CLOCK_MONOTONIC); -# if HAVE_MALLINFO - struct mallinfo after_mallinfo = mallinfo_nowarn(); - int l = after_mallinfo.uordblks > before_mallinfo.uordblks ? after_mallinfo.uordblks - before_mallinfo.uordblks : 0; - log_debug("Successfully loaded SELinux database in %s, size on heap is %iK.", +# if HAVE_GENERIC_MALLINFO + generic_mallinfo after_mallinfo = generic_mallinfo_get(); + size_t l = LESS_BY((size_t) after_mallinfo.uordblks, (size_t) before_mallinfo.uordblks); + log_debug("Successfully loaded SELinux database in %s, size on heap is %zuK.", format_timespan(timespan, sizeof(timespan), after_timestamp - before_timestamp, 0), DIV_ROUND_UP(l, 1024)); # else