From ae2694b30d690c879711521f59763e4f63a88ba9 Mon Sep 17 00:00:00 2001 From: Patrice Arruda Date: Thu, 4 Jun 2020 19:34:41 +0000 Subject: [PATCH] Pass the TMPDIR directly to the command when dumping makefile variables. External applications such as metrics uploader depends on the TMPDIR. DumpMakeVars is changing the TMPDIR environment variable value. Once the work is done, TMPDIR directory is deleted. Additional flow of the tool or external applications can panic since TMPDIR directory does not exist. Since this is an isolated case, pass the TMPDIR directory to the command of dumping the makefile variables. Bug: b/140638454 Test: * Ran lunch command with ANDROID_ENABLE_METRICS_UPLOAD set and metrics_uploader did not crash. * m nothing Change-Id: Ib78a3f8cfb5da48f65bd9bce1511e9abdf3d9cca --- ui/build/dumpvars.go | 15 ++++++++------- ui/build/path.go | 12 ++++++++---- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/ui/build/dumpvars.go b/ui/build/dumpvars.go index a559330cb..7dc4915e2 100644 --- a/ui/build/dumpvars.go +++ b/ui/build/dumpvars.go @@ -54,18 +54,16 @@ func DumpMakeVars(ctx Context, config Config, goals, vars []string) (map[string] var ret map[string]string if len(makeVars) > 0 { + // It's not safe to use the same TMPDIR as the build, as that can be removed. tmpDir, err := ioutil.TempDir("", "dumpvars") if err != nil { return nil, err } defer os.RemoveAll(tmpDir) - // It's not safe to use the same TMPDIR as the build, as that can be removed. - config.Environment().Set("TMPDIR", tmpDir) + SetupLitePath(ctx, config, tmpDir) - SetupLitePath(ctx, config) - - ret, err = dumpMakeVars(ctx, config, goals, makeVars, false) + ret, err = dumpMakeVars(ctx, config, goals, makeVars, false, tmpDir) if err != nil { return ret, err } @@ -82,7 +80,7 @@ func DumpMakeVars(ctx Context, config Config, goals, vars []string) (map[string] return ret, nil } -func dumpMakeVars(ctx Context, config Config, goals, vars []string, write_soong_vars bool) (map[string]string, error) { +func dumpMakeVars(ctx Context, config Config, goals, vars []string, write_soong_vars bool, tmpDir string) (map[string]string, error) { ctx.BeginTrace(metrics.RunKati, "dumpvars") defer ctx.EndTrace() @@ -98,6 +96,9 @@ func dumpMakeVars(ctx Context, config Config, goals, vars []string, write_soong_ cmd.Environment.Set("WRITE_SOONG_VARIABLES", "true") } cmd.Environment.Set("DUMP_MANY_VARS", strings.Join(vars, " ")) + if tmpDir != "" { + cmd.Environment.Set("TMPDIR", tmpDir) + } cmd.Sandbox = dumpvarsSandbox output := bytes.Buffer{} cmd.Stdout = &output @@ -253,7 +254,7 @@ func runMakeProductConfig(ctx Context, config Config) { "BUILD_BROKEN_USES_BUILD_STATIC_LIBRARY", }, exportEnvVars...), BannerVars...) - make_vars, err := dumpMakeVars(ctx, config, config.Arguments(), allVars, true) + make_vars, err := dumpMakeVars(ctx, config, config.Arguments(), allVars, true, "") if err != nil { ctx.Fatalln("Error dumping make vars:", err) } diff --git a/ui/build/path.go b/ui/build/path.go index 7122927a6..6f5cf78b1 100644 --- a/ui/build/path.go +++ b/ui/build/path.go @@ -55,8 +55,9 @@ func parsePathDir(dir string) []string { } // A "lite" version of SetupPath used for dumpvars, or other places that need -// minimal overhead (but at the expense of logging). -func SetupLitePath(ctx Context, config Config) { +// minimal overhead (but at the expense of logging). If tmpDir is empty, the +// default TMPDIR is used from config. +func SetupLitePath(ctx Context, config Config, tmpDir string) { if config.pathReplaced { return } @@ -65,8 +66,11 @@ func SetupLitePath(ctx Context, config Config) { defer ctx.EndTrace() origPath, _ := config.Environment().Get("PATH") - myPath, _ := config.Environment().Get("TMPDIR") - myPath = filepath.Join(myPath, "path") + + if tmpDir == "" { + tmpDir, _ = config.Environment().Get("TMPDIR") + } + myPath := filepath.Join(tmpDir, "path") ensureEmptyDirectoriesExist(ctx, myPath) os.Setenv("PATH", origPath)