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;