From 7fb8b546e3d6476727d79771ede5bd945cd24980 Mon Sep 17 00:00:00 2001 From: Paul Lawrence Date: Tue, 19 Jul 2022 16:13:49 -0700 Subject: [PATCH] Add fuse prog types to allowed prog types from system Until fuse-bpf is upstreamed, the value BPF_PROG_TYPE_FUSE is dynamically defined, so use BPF_PROG_TYPE_UNSPEC as a placeholder and read the actual value from sys/fs/fuse Bug: 202785178 Test: fuse bpf can be enabled successfully Change-Id: I67d3ff45768b581a6b239e235edaa6e46a2f6fe0 --- bpfloader/BpfLoader.cpp | 1 + libbpf_android/Loader.cpp | 17 +++++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/bpfloader/BpfLoader.cpp b/bpfloader/BpfLoader.cpp index b8dd504..f0ff413 100644 --- a/bpfloader/BpfLoader.cpp +++ b/bpfloader/BpfLoader.cpp @@ -107,6 +107,7 @@ constexpr bpf_prog_type kPlatformAllowedProgTypes[] = { BPF_PROG_TYPE_PERF_EVENT, BPF_PROG_TYPE_SOCKET_FILTER, BPF_PROG_TYPE_TRACEPOINT, + BPF_PROG_TYPE_UNSPEC, // Will be replaced with fuse bpf program type }; // see b/162057235. For arbitrary program types, the concern is that due to the lack of diff --git a/libbpf_android/Loader.cpp b/libbpf_android/Loader.cpp index d68f407..ba0ed4c 100644 --- a/libbpf_android/Loader.cpp +++ b/libbpf_android/Loader.cpp @@ -354,16 +354,18 @@ static int readSymTab(ifstream& elfFile, int sort, vector& data) { return 0; } +static enum bpf_prog_type getFuseProgType() { + int result = BPF_PROG_TYPE_UNSPEC; + ifstream("/sys/fs/fuse/bpf_prog_type_fuse") >> result; + return static_cast(result); +} + static enum bpf_prog_type getSectionType(string& name) { for (auto& snt : sectionNameTypes) if (StartsWith(name, snt.name)) return snt.type; // TODO Remove this code when fuse-bpf is upstream and this BPF_PROG_TYPE_FUSE is fixed - if (StartsWith(name, "fuse/")) { - int result = BPF_PROG_TYPE_UNSPEC; - ifstream("/sys/fs/fuse/bpf_prog_type_fuse") >> result; - return static_cast(result); - } + if (StartsWith(name, "fuse/")) return getFuseProgType(); return BPF_PROG_TYPE_UNSPEC; } @@ -465,7 +467,10 @@ static bool IsAllowed(bpf_prog_type type, const bpf_prog_type* allowed, size_t n if (allowed == nullptr) return true; for (size_t i = 0; i < numAllowed; i++) { - if (type == allowed[i]) return true; + if (allowed[i] == BPF_PROG_TYPE_UNSPEC) { + if (type == getFuseProgType()) return true; + } else if (type == allowed[i]) + return true; } return false;