cos_kernel: Verify bin vars in toolchain/bin exist before use Hypothetically, if toolchain_env contained things other than paths to bins relative to toolchain/bin, then the set of kernel make args would be wrong. To avoid this, we check if each item is actually an executable binary before setting its value in the make args map. TEST=presubmit BUG=b/527927014 Change-Id: Ibfd354ee6c45a14593605a9fc304134b83b4b50e Reviewed-on: https://cos-review.googlesource.com/c/cos/tools/+/165584 Tested-by: Kevin Berry <kpberry@google.com> Reviewed-by: Derek Taylor <ddtaylor@google.com> Cloud-Build: 228075978874@cloudbuild.gserviceaccount.com <228075978874@cloudbuild.gserviceaccount.com>
diff --git a/src/pkg/cos/cos.go b/src/pkg/cos/cos.go index 805c576..757578d 100644 --- a/src/pkg/cos/cos.go +++ b/src/pkg/cos/cos.go
@@ -57,18 +57,20 @@ // LD=${toolchain}/bin/${arch}-cros-linux-gnu-ld.lld // STRIP=${toolchain}/bin/llvm-strip // OBJCOPY=${toolchain}/bin/llvm-objcopy -// HOSTCC=${arch}-pc-linux-gnu-clang -// HOSTCXX=${arch}-pc-linux-gnu-clang++ -// HOSTLD=${arch}-pc-linux-gnu-clang +// +// We deliberately do not set HOST{CC,CXX,LD} since make should determine +// those by itself. func KernelMakeFlags(arch, toolchainArch, toolchainDir string) (map[string]string, error) { + toolchainBinaries := map[string]string{ + "CC": fmt.Sprintf("%s-cros-linux-gnu-clang", toolchainArch), + "CXX": fmt.Sprintf("%s-cros-linux-gnu-clang++", toolchainArch), + "LD": fmt.Sprintf("%s-cros-linux-gnu-ld.lld", toolchainArch), + "STRIP": "llvm-strip", + "OBJCOPY": "llvm-objcopy", + } + makeVars := map[string]string{ - // paths are relative to the kernel source tree "ARCH": arch, - "CC": fmt.Sprintf("%s/toolchain/bin/%s-cros-linux-gnu-clang", toolchainDir, toolchainArch), - "CXX": fmt.Sprintf("%s/toolchain/bin/%s-cros-linux-gnu-clang++", toolchainDir, toolchainArch), - "LD": fmt.Sprintf("%s/toolchain/bin/%s-cros-linux-gnu-ld.lld", toolchainDir, toolchainArch), - "STRIP": fmt.Sprintf("%s/toolchain/bin/llvm-strip", toolchainDir), - "OBJCOPY": fmt.Sprintf("%s/toolchain/bin/llvm-objcopy", toolchainDir), } toolchainEnvVars, err := utils.LoadEnvFromFile(toolchainDir, toolchainEnv) @@ -76,13 +78,27 @@ return nil, fmt.Errorf("could not source toolchain_env to determine build toolchain: %v", err) } - for key := range makeVars { - toolchainValue, ok := toolchainEnvVars[key] - if ok { - makeVars[key] = fmt.Sprintf("%s/toolchain/bin/%s", toolchainDir, toolchainValue) + for key, val := range toolchainEnvVars { + // Hypothetically, the toolchain-env file could have things in it which are + // not toolchain binaries, so we should check if each one is an executable + // in the toolchain bin dir before adding it to our variables. + toolchainBinPath := fmt.Sprintf("%s/toolchain/bin/%s", toolchainDir, val) + stat, err := os.Stat(toolchainBinPath) + if err == nil && stat.Mode().IsRegular() && (stat.Mode().Perm() & 0x111) > 0 { + toolchainBinaries[key] = val + } else { + if os.IsNotExist(err) { + makeVars[key] = val + } else { + return nil, fmt.Errorf("could not check if toolchain var %s=%s is a binary or not: %v", key, val, err) + } } } + for varName, bin := range toolchainBinaries { + makeVars[varName] = fmt.Sprintf("%s/toolchain/bin/%s", toolchainDir, bin) + } + return makeVars, nil }