From 5372a243758bd6f85f5d461915be55d9bc160b3f Mon Sep 17 00:00:00 2001 From: Ken Chen Date: Thu, 7 Jul 2022 17:48:06 +0800 Subject: [PATCH] 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 --- apex/apex_test.go | 18 +++++++++--------- bpf/bpf.go | 4 ++++ bpf/bpf_test.go | 17 +++++++++++++++-- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/apex/apex_test.go b/apex/apex_test.go index dbe918010..dc505b4fa 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -619,7 +619,7 @@ func TestDefaults(t *testing.T) { java_libs: ["myjar"], apps: ["AppFoo"], rros: ["rro"], - bpfs: ["bpf", "netd_test"], + bpfs: ["bpf", "netdTest"], updatable: false, } @@ -673,8 +673,8 @@ func TestDefaults(t *testing.T) { } bpf { - name: "netd_test", - srcs: ["netd_test.c"], + name: "netdTest", + srcs: ["netdTest.c"], sub_dir: "netd", } @@ -687,7 +687,7 @@ func TestDefaults(t *testing.T) { "overlay/blue/rro.apk", "etc/bpf/bpf.o", "etc/bpf/bpf2.o", - "etc/bpf/netd/netd_test.o", + "etc/bpf/netd/netdTest.o", }) } @@ -6151,7 +6151,7 @@ func TestOverrideApex(t *testing.T) { name: "override_myapex", base: "myapex", apps: ["override_app"], - bpfs: ["override_bpf"], + bpfs: ["overrideBpf"], prebuilts: ["override_myetc"], bootclasspath_fragments: ["override_bootclasspath_fragment"], systemserverclasspath_fragments: ["override_systemserverclasspath_fragment"], @@ -6201,8 +6201,8 @@ func TestOverrideApex(t *testing.T) { } bpf { - name: "override_bpf", - srcs: ["override_bpf.c"], + name: "overrideBpf", + srcs: ["overrideBpf.c"], } prebuilt_etc { @@ -6305,7 +6305,7 @@ func TestOverrideApex(t *testing.T) { ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk") ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o") - ensureContains(t, copyCmds, "image.apex/etc/bpf/override_bpf.o") + ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o") ensureNotContains(t, copyCmds, "image.apex/etc/myetc") ensureContains(t, copyCmds, "image.apex/etc/override_myetc") @@ -6339,7 +6339,7 @@ func TestOverrideApex(t *testing.T) { data.Custom(&builder, name, "TARGET_", "", data) androidMk := builder.String() ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex") - ensureContains(t, androidMk, "LOCAL_MODULE := override_bpf.o.override_myapex") + ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex") ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex") ensureContains(t, androidMk, "LOCAL_MODULE := override_bcplib.override_myapex") ensureContains(t, androidMk, "LOCAL_MODULE := override_systemserverlib.override_myapex") diff --git a/bpf/bpf.go b/bpf/bpf.go index 14b2d84c5..5d2533fc2 100644 --- a/bpf/bpf.go +++ b/bpf/bpf.go @@ -17,6 +17,7 @@ package bpf import ( "fmt" "io" + "path/filepath" "strings" "android/soong/android" @@ -154,6 +155,9 @@ func (bpf *bpf) GenerateAndroidBuildActions(ctx android.ModuleContext) { 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 51fbc15e1..6e3909680 100644 --- a/bpf/bpf_test.go +++ b/bpf/bpf_test.go @@ -30,8 +30,9 @@ var prepareForBpfTest = android.GroupFixturePreparers( 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 @@ func TestBpfDataDependency(t *testing.T) { // 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) +}