From 5d14649a045d442c8e50c9fb2c7b0d588e1a2a02 Mon Sep 17 00:00:00 2001 From: Ken Chen <cken@google.com> Date: Mon, 27 Nov 2023 17:05:43 +0800 Subject: [PATCH] Add error trace in BpfHandler::initPrograms Debugging the SIGABRT of this function is annoying because the module can be built from source or pre-built. It requires finding the correct version of the symbol to get the correct line number. In addition, there are 7 consecutive aborts in source code, it is hard to tell whether the symbolized call stack shows the right line number or not. Adds error trace before abort so we can identify the root cause without even symbolizing the call stack of SIGABRT. Bug: 312094533 Test: make; flash; adb logcat Change-Id: I74713029d059e10bf5d34694cdb96712bc806696 --- netd/BpfHandler.cpp | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/netd/BpfHandler.cpp b/netd/BpfHandler.cpp index a7a405953c..2a9892f830 100644 --- a/netd/BpfHandler.cpp +++ b/netd/BpfHandler.cpp @@ -76,23 +76,43 @@ static Status checkProgramAccessible(const char* programPath) { } static Status initPrograms(const char* cg2_path) { + if (!cg2_path) { + ALOGE("cg2_path is NULL"); + return statusFromErrno(EINVAL, "cg2_path is NULL"); + } + // This code was mainlined in T, so this should be trivially satisfied. - if (!modules::sdklevel::IsAtLeastT()) abort(); + if (!modules::sdklevel::IsAtLeastT()) { + ALOGE("S- platform is unsupported"); + abort(); + } // S requires eBPF support which was only added in 4.9, so this should be satisfied. - if (!bpf::isAtLeastKernelVersion(4, 9, 0)) abort(); + if (!bpf::isAtLeastKernelVersion(4, 9, 0)) { + ALOGE("kernel version < 4.9.0 is unsupported"); + abort(); + } // U bumps the kernel requirement up to 4.14 - if (modules::sdklevel::IsAtLeastU() && !bpf::isAtLeastKernelVersion(4, 14, 0)) abort(); + if (modules::sdklevel::IsAtLeastU() && !bpf::isAtLeastKernelVersion(4, 14, 0)) { + ALOGE("U+ platform with kernel version < 4.14.0 is unsupported"); + abort(); + } if (modules::sdklevel::IsAtLeastV()) { // V bumps the kernel requirement up to 4.19 // see also: //system/netd/tests/kernel_test.cpp TestKernel419 - if (!bpf::isAtLeastKernelVersion(4, 19, 0)) abort(); + if (!bpf::isAtLeastKernelVersion(4, 19, 0)) { + ALOGE("V+ platform with kernel version < 4.19.0 is unsupported"); + abort(); + } // Technically already required by U, but only enforce on V+ // see also: //system/netd/tests/kernel_test.cpp TestKernel64Bit - if (bpf::isKernel32Bit() && bpf::isAtLeastKernelVersion(5, 16, 0)) abort(); + if (bpf::isKernel32Bit() && bpf::isAtLeastKernelVersion(5, 16, 0)) { + ALOGE("V+ platform with 32 bit kernel, version >= 5.16.0 is unsupported"); + abort(); + } } // Linux 6.1 is highest version supported by U, starting with V new kernels, @@ -102,10 +122,16 @@ static Status initPrograms(const char* cg2_path) { // it does not affect unprivileged apps, the 32-on-64 compatibility // problems are AFAIK limited to various CAP_NET_ADMIN protected interfaces. // see also: //system/bpf/bpfloader/BpfLoader.cpp main() - if (bpf::isUserspace32bit() && bpf::isAtLeastKernelVersion(6, 2, 0)) abort(); + if (bpf::isUserspace32bit() && bpf::isAtLeastKernelVersion(6, 2, 0)) { + ALOGE("32 bit userspace with Kernel version >= 6.2.0 is unsupported"); + abort(); + } // U mandates this mount point (though it should also be the case on T) - if (modules::sdklevel::IsAtLeastU() && !!strcmp(cg2_path, "/sys/fs/cgroup")) abort(); + if (modules::sdklevel::IsAtLeastU() && !!strcmp(cg2_path, "/sys/fs/cgroup")) { + ALOGE("U+ platform with cg2_path != /sys/fs/cgroup is unsupported"); + abort(); + } unique_fd cg_fd(open(cg2_path, O_DIRECTORY | O_RDONLY | O_CLOEXEC)); if (!cg_fd.ok()) { -- GitLab