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
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 @@
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 @@
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<bpf_prog_type>(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<bpf_prog_type>(result);
- }
+ if (StartsWith(name, "fuse/")) return getFuseProgType();
return BPF_PROG_TYPE_UNSPEC;
}
@@ -465,7 +467,10 @@
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;