From eb13daf905d2a49f02a71629947f604834a0e08c Mon Sep 17 00:00:00 2001 From: Patrick Rohr Date: Thu, 18 May 2023 14:36:02 -0700 Subject: [PATCH] NetlinkEvent: use isKernel64Bit in KernelUtils.h Now that the code has moved, delete the local implementation in favor of the common one. Test: builds Change-Id: Ic29d7c9bcd3d623204f3e4de3a3434483021cbac --- libsysutils/Android.bp | 4 +++ libsysutils/src/NetlinkEvent.cpp | 56 ++------------------------------ 2 files changed, 6 insertions(+), 54 deletions(-) diff --git a/libsysutils/Android.bp b/libsysutils/Android.bp index 5f472b2ab..1b41a6b17 100644 --- a/libsysutils/Android.bp +++ b/libsysutils/Android.bp @@ -29,6 +29,10 @@ cc_library { "liblog", ], + header_libs: [ + "bpf_headers", + ], + export_include_dirs: ["include"], tidy: true, diff --git a/libsysutils/src/NetlinkEvent.cpp b/libsysutils/src/NetlinkEvent.cpp index 515cc1047..cd9db54fa 100644 --- a/libsysutils/src/NetlinkEvent.cpp +++ b/libsysutils/src/NetlinkEvent.cpp @@ -37,10 +37,12 @@ #include #include +#include #include #include using android::base::ParseInt; +using android::bpf::isKernel64Bit; /* From kernel's net/netfilter/xt_quota2.c */ const int LOCAL_QLOG_NL_EVENT = 112; @@ -138,60 +140,6 @@ static_assert(sizeof(ulog_packet_msg_t) == sizeof(ulog_packet_msg32_t) || static_assert(sizeof(ulog_packet_msg32_t) == 168); static_assert(sizeof(ulog_packet_msg64_t) == 192); -// Figure out the bitness of userspace. -// Trivial and known at compile time. -static bool isUserspace64bit(void) { - return sizeof(long) == 8; -} - -// Figure out the bitness of the kernel. -static bool isKernel64Bit(void) { - // a 64-bit userspace requires a 64-bit kernel - if (isUserspace64bit()) return true; - - static bool init = false; - static bool cache = false; - if (init) return cache; - - // Retrieve current personality - on Linux this system call *cannot* fail. - int p = personality(0xffffffff); - // But if it does just assume kernel and userspace (which is 32-bit) match... - if (p == -1) return false; - - // This will effectively mask out the bottom 8 bits, and switch to 'native' - // personality, and then return the previous personality of this thread - // (likely PER_LINUX or PER_LINUX32) with any extra options unmodified. - int q = personality((p & ~PER_MASK) | PER_LINUX); - // Per man page this theoretically could error out with EINVAL, - // but kernel code analysis suggests setting PER_LINUX cannot fail. - // Either way, assume kernel and userspace (which is 32-bit) match... - if (q != p) return false; - - struct utsname u; - (void)uname(&u); // only possible failure is EFAULT, but u is on stack. - - // Switch back to previous personality. - // Theoretically could fail with EINVAL on arm64 with no 32-bit support, - // but then we wouldn't have fetched 'p' from the kernel in the first place. - // Either way there's nothing meaningul we can do in case of error. - // Since PER_LINUX32 vs PER_LINUX only affects uname.machine it doesn't - // really hurt us either. We're really just switching back to be 'clean'. - (void)personality(p); - - // Possible values of utsname.machine observed on x86_64 desktop (arm via qemu): - // x86_64 i686 aarch64 armv7l - // additionally observed on arm device: - // armv8l - // presumably also might just be possible: - // i386 i486 i586 - // and there might be other weird arm32 cases. - // We note that the 64 is present in both 64-bit archs, - // and in general is likely to be present in only 64-bit archs. - cache = !!strstr(u.machine, "64"); - init = true; - return cache; -} - /******************************************************************************/ NetlinkEvent::NetlinkEvent() {