Skip to content

Commit f186bef

Browse files
committed
fix(build): avoid cache merge allocation overflow
1 parent 341ada2 commit f186bef

2 files changed

Lines changed: 11 additions & 4 deletions

File tree

internal/cli/build.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -662,8 +662,8 @@ func cacheFromForDockerfileBuild(flagCacheFrom []string, cfg *config.DevContaine
662662
if cfg == nil || cfg.Build == nil || len(cfg.Build.CacheFrom) == 0 {
663663
return flagCacheFrom
664664
}
665-
combined := make([]string, 0, len(flagCacheFrom)+len(cfg.Build.CacheFrom))
666-
combined = append(combined, flagCacheFrom...)
665+
combined := make([]string, len(flagCacheFrom))
666+
copy(combined, flagCacheFrom)
667667
combined = append(combined, cfg.Build.CacheFrom...)
668668
return combined
669669
}

internal/cli/build_cachefrom_test.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,17 @@ func TestCacheFromForDockerfileBuild(t *testing.T) {
4242
// aliasing/appending into the caller's flag slice (which extendImageWithFeatures
4343
// still passes verbatim for the feature layers).
4444
func TestCacheFromForDockerfileBuildDoesNotMutateFlag(t *testing.T) {
45-
flag := []string{"flag1"}
45+
flagBacking := []string{"flag1", "sentinel"}
46+
flag := flagBacking[:1]
4647
cfg := &config.DevContainer{Build: &config.Build{CacheFrom: config.StringOrStrings{"cfg1"}}}
47-
_ = cacheFromForDockerfileBuild(flag, cfg)
48+
got := cacheFromForDockerfileBuild(flag, cfg)
4849
if len(flag) != 1 || flag[0] != "flag1" {
4950
t.Fatalf("flag slice mutated: %v", flag)
5051
}
52+
if flagBacking[1] != "sentinel" {
53+
t.Fatalf("flag backing array mutated: %v", flagBacking)
54+
}
55+
if !reflect.DeepEqual(got, []string{"flag1", "cfg1"}) {
56+
t.Fatalf("merged cache-from = %v, want [flag1 cfg1]", got)
57+
}
5158
}

0 commit comments

Comments
 (0)