69 lines
2.6 KiB
Diff
69 lines
2.6 KiB
Diff
From e3c9b94734531a08c9bf51057ca3a9022cc90f91 Mon Sep 17 00:00:00 2001
|
|
From: Quentin Monnet <quentin@isovalent.com>
|
|
Date: Mon, 15 Aug 2022 17:22:05 +0100
|
|
Subject: bpftool: Clear errno after libcap's checks
|
|
|
|
[ Upstream commit cea558855c39b7f1f02ff50dcf701ca6596bc964 ]
|
|
|
|
When bpftool is linked against libcap, the library runs a "constructor"
|
|
function to compute the number of capabilities of the running kernel
|
|
[0], at the beginning of the execution of the program. As part of this,
|
|
it performs multiple calls to prctl(). Some of these may fail, and set
|
|
errno to a non-zero value:
|
|
|
|
# strace -e prctl ./bpftool version
|
|
prctl(PR_CAPBSET_READ, CAP_MAC_OVERRIDE) = 1
|
|
prctl(PR_CAPBSET_READ, 0x30 /* CAP_??? */) = -1 EINVAL (Invalid argument)
|
|
prctl(PR_CAPBSET_READ, CAP_CHECKPOINT_RESTORE) = 1
|
|
prctl(PR_CAPBSET_READ, 0x2c /* CAP_??? */) = -1 EINVAL (Invalid argument)
|
|
prctl(PR_CAPBSET_READ, 0x2a /* CAP_??? */) = -1 EINVAL (Invalid argument)
|
|
prctl(PR_CAPBSET_READ, 0x29 /* CAP_??? */) = -1 EINVAL (Invalid argument)
|
|
** fprintf added at the top of main(): we have errno == 1
|
|
./bpftool v7.0.0
|
|
using libbpf v1.0
|
|
features: libbfd, libbpf_strict, skeletons
|
|
+++ exited with 0 +++
|
|
|
|
This has been addressed in libcap 2.63 [1], but until this version is
|
|
available everywhere, we can fix it on bpftool side.
|
|
|
|
Let's clean errno at the beginning of the main() function, to make sure
|
|
that these checks do not interfere with the batch mode, where we error
|
|
out if errno is set after a bpftool command.
|
|
|
|
[0] https://git.kernel.org/pub/scm/libs/libcap/libcap.git/tree/libcap/cap_alloc.c?h=libcap-2.65#n20
|
|
[1] https://git.kernel.org/pub/scm/libs/libcap/libcap.git/commit/?id=f25a1b7e69f7b33e6afb58b3e38f3450b7d2d9a0
|
|
|
|
Signed-off-by: Quentin Monnet <quentin@isovalent.com>
|
|
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
|
|
Link: https://lore.kernel.org/bpf/20220815162205.45043-1-quentin@isovalent.com
|
|
Signed-off-by: Sasha Levin <sashal@kernel.org>
|
|
---
|
|
src/main.c | 10 ++++++++++
|
|
1 file changed, 10 insertions(+)
|
|
|
|
diff --git a/src/main.c b/src/main.c
|
|
index 1854d6b978604..4fd4e3462ebce 100644
|
|
--- a/src/main.c
|
|
+++ b/src/main.c
|
|
@@ -398,6 +398,16 @@ int main(int argc, char **argv)
|
|
|
|
setlinebuf(stdout);
|
|
|
|
+#ifdef USE_LIBCAP
|
|
+ /* Libcap < 2.63 hooks before main() to compute the number of
|
|
+ * capabilities of the running kernel, and doing so it calls prctl()
|
|
+ * which may fail and set errno to non-zero.
|
|
+ * Let's reset errno to make sure this does not interfere with the
|
|
+ * batch mode.
|
|
+ */
|
|
+ errno = 0;
|
|
+#endif
|
|
+
|
|
last_do_help = do_help;
|
|
pretty_output = false;
|
|
json_output = false;
|
|
--
|
|
cgit
|
|
|