Disallow '_' in bpf source name
Current design:
1. The bpf compiled object name is derived from the source name
(e.g. foo.c -> foo.o).
2. Full bpf program/map name are concatenated by object name + '_' +
program/map name in run-time. (e.g. obj name: x.o; program name: y_z;
full bpf program name will be x_y_z)
Issue:
x.o with map y_z and x_y.o with map z can cause naming collision in
run-time, since both result in x_y_z. This commit prevents it from
happening with a build-time check.
Bug: 236706995
Test: m
Change-Id: Ic03bfcf07a5748ed63246b71d5ae8de0405e658a
diff --git a/bpf/bpf.go b/bpf/bpf.go
index 14b2d84..5d2533f 100644
--- a/bpf/bpf.go
+++ b/bpf/bpf.go
@@ -17,6 +17,7 @@
import (
"fmt"
"io"
+ "path/filepath"
"strings"
"android/soong/android"
@@ -154,6 +155,9 @@
srcs := android.PathsForModuleSrc(ctx, bpf.properties.Srcs)
for _, src := range srcs {
+ if strings.ContainsRune(filepath.Base(src.String()), '_') {
+ ctx.ModuleErrorf("invalid character '_' in source name")
+ }
obj := android.ObjPathWithExt(ctx, "unstripped", src, "o")
ctx.Build(pctx, android.BuildParams{
diff --git a/bpf/bpf_test.go b/bpf/bpf_test.go
index 51fbc15..6e39096 100644
--- a/bpf/bpf_test.go
+++ b/bpf/bpf_test.go
@@ -30,8 +30,9 @@
cc.PrepareForTestWithCcDefaultModules,
android.FixtureMergeMockFs(
map[string][]byte{
- "bpf.c": nil,
- "BpfTest.cpp": nil,
+ "bpf.c": nil,
+ "bpf_invalid_name.c": nil,
+ "BpfTest.cpp": nil,
},
),
PrepareForTestWithBpf,
@@ -58,3 +59,15 @@
// value is not available for testing from this package.
// TODO(jungjw): Add a check for data or move this test to the cc package.
}
+
+func TestBpfSourceName(t *testing.T) {
+ bp := `
+ bpf {
+ name: "bpf_invalid_name.o",
+ srcs: ["bpf_invalid_name.c"],
+ }
+ `
+ prepareForBpfTest.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(
+ `\QAndroid.bp:2:3: module "bpf_invalid_name.o" variant "android_common": invalid character '_' in source name\E`)).
+ RunTestWithBp(t, bp)
+}