Skip to content

Commit 98e0d8d

Browse files
committed
Whenever copying OCI Platform data, include OSVersion and OSFeatures
Trivially created by looking for every reference to .Variant and adding OSVersion and OSFeatures, except the ones related to the string representation of a Platform instance. I then went through and ensured every assignment of OSFeatures that might leak out, i.e., not local-only or for marhsalling purposes, uses the append-to-nil idiom to avoid sharing the slice storage and allowing accidental mutation after-the-fact. Signed-off-by: Paul "TBBle" Hampson <[email protected]>
1 parent 36c5550 commit 98e0d8d

File tree

14 files changed

+98
-39
lines changed

14 files changed

+98
-39
lines changed

client/llb/marshal.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,18 @@ func MarshalConstraints(base, override *Constraints) (*pb.Op, *pb.OpMetadata) {
9595
c.Platform = &defaultPlatform
9696
}
9797

98+
opPlatform := pb.Platform{
99+
OS: c.Platform.OS,
100+
Architecture: c.Platform.Architecture,
101+
Variant: c.Platform.Variant,
102+
OSVersion: c.Platform.OSVersion,
103+
}
104+
if c.Platform.OSFeatures != nil {
105+
opPlatform.OSFeatures = append([]string{}, c.Platform.OSFeatures...)
106+
}
107+
98108
return &pb.Op{
99-
Platform: &pb.Platform{
100-
OS: c.Platform.OS,
101-
Architecture: c.Platform.Architecture,
102-
Variant: c.Platform.Variant,
103-
OSVersion: c.Platform.OSVersion,
104-
OSFeatures: c.Platform.OSFeatures,
105-
},
109+
Platform: &opPlatform,
106110
Constraints: &pb.WorkerConstraints{
107111
Filter: c.WorkerConstraints,
108112
},

client/llb/state.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,11 +258,16 @@ func (s State) WithImageConfig(c []byte) (State, error) {
258258
}
259259
s = s.Dir(img.Config.WorkingDir)
260260
if img.Architecture != "" && img.OS != "" {
261-
s = s.Platform(ocispecs.Platform{
261+
plat := ocispecs.Platform{
262262
OS: img.OS,
263263
Architecture: img.Architecture,
264264
Variant: img.Variant,
265-
})
265+
OSVersion: img.OSVersion,
266+
}
267+
if img.OSFeatures != nil {
268+
plat.OSFeatures = append([]string{}, img.OSFeatures...)
269+
}
270+
s = s.Platform(plat)
266271
}
267272
return s, nil
268273
}

exporter/containerimage/writer.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,8 @@ func defaultImageConfig() ([]byte, error) {
598598
img := ocispecs.Image{}
599599
img.Architecture = pl.Architecture
600600
img.OS = pl.OS
601+
img.OSVersion = pl.OSVersion
602+
img.OSFeatures = pl.OSFeatures
601603
img.Variant = pl.Variant
602604
img.RootFS.Type = "layers"
603605
img.Config.WorkingDir = "/"

frontend/dockerfile/dockerfile2llb/convert.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,10 @@ func toDispatchState(ctx context.Context, dt []byte, opt ConvertOpt) (*dispatchS
274274
OS: img.OS,
275275
Architecture: img.Architecture,
276276
Variant: img.Variant,
277+
OSVersion: img.OSVersion,
278+
}
279+
if img.OSFeatures != nil {
280+
ds.platform.OSFeatures = append([]string{}, img.OSFeatures...)
277281
}
278282
}
279283
}
@@ -595,6 +599,10 @@ func toDispatchState(ctx context.Context, dt []byte, opt ConvertOpt) (*dispatchS
595599
target.image.OS = platformOpt.targetPlatform.OS
596600
target.image.Architecture = platformOpt.targetPlatform.Architecture
597601
target.image.Variant = platformOpt.targetPlatform.Variant
602+
target.image.OSVersion = platformOpt.targetPlatform.OSVersion
603+
if platformOpt.targetPlatform.OSFeatures != nil {
604+
target.image.OSFeatures = append([]string{}, platformOpt.targetPlatform.OSFeatures...)
605+
}
598606
}
599607

600608
return target, nil

frontend/dockerfile/dockerfile2llb/image.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ func emptyImage(platform ocispecs.Platform) image.Image {
1919
img := image.Image{}
2020
img.Architecture = platform.Architecture
2121
img.OS = platform.OS
22+
img.OSVersion = platform.OSVersion
23+
if platform.OSFeatures != nil {
24+
img.OSFeatures = append([]string{}, platform.OSFeatures...)
25+
}
2226
img.Variant = platform.Variant
2327
img.RootFS.Type = "layers"
2428
img.Config.WorkingDir = "/"

frontend/dockerui/build.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func (bc *Client) Build(ctx context.Context, fn BuildFunc) (*ResultBuilder, erro
5757
p.OSVersion = img.OSVersion
5858
}
5959
if p.OSFeatures == nil && len(img.OSFeatures) > 0 {
60-
p.OSFeatures = img.OSFeatures
60+
p.OSFeatures = append([]string{}, img.OSFeatures...)
6161
}
6262
}
6363

solver/llbsolver/ops/exec.go

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ func (e *ExecOp) CacheMap(ctx context.Context, g session.Group, index int) (*sol
113113
OS: e.platform.OS,
114114
Architecture: e.platform.Architecture,
115115
Variant: e.platform.Variant,
116+
OSVersion: e.platform.OSVersion,
117+
OSFeatures: e.platform.OSFeatures,
116118
}
117119
}
118120

@@ -133,17 +135,21 @@ func (e *ExecOp) CacheMap(ctx context.Context, g session.Group, index int) (*sol
133135
}
134136

135137
dt, err := json.Marshal(struct {
136-
Type string
137-
Exec *pb.ExecOp
138-
OS string
139-
Arch string
140-
Variant string `json:",omitempty"`
138+
Type string
139+
Exec *pb.ExecOp
140+
OS string
141+
Arch string
142+
Variant string `json:",omitempty"`
143+
OSVersion string `json:",omitempty"`
144+
OSFeatures []string `json:",omitempty"`
141145
}{
142-
Type: execCacheType,
143-
Exec: &op,
144-
OS: p.OS,
145-
Arch: p.Architecture,
146-
Variant: p.Variant,
146+
Type: execCacheType,
147+
Exec: &op,
148+
OS: p.OS,
149+
Arch: p.Architecture,
150+
Variant: p.Variant,
151+
OSVersion: p.OSVersion,
152+
OSFeatures: p.OSFeatures,
147153
})
148154
if err != nil {
149155
return nil, false, err

solver/llbsolver/ops/exec_binfmt.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ func getEmulator(ctx context.Context, p *pb.Platform, idmap *idtools.IdentityMap
9090
pp := platforms.Normalize(ocispecs.Platform{
9191
Architecture: p.Architecture,
9292
OS: p.OS,
93+
OSVersion: p.OSVersion,
94+
OSFeatures: p.OSFeatures,
9395
Variant: p.Variant,
9496
})
9597

solver/llbsolver/provenance/capture.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,9 @@ func (c *Capture) AddImage(i ImageSource) {
152152
return
153153
}
154154
if v.Platform != nil && i.Platform != nil {
155-
if v.Platform.Architecture == i.Platform.Architecture && v.Platform.OS == i.Platform.OS && v.Platform.Variant == i.Platform.Variant {
155+
// NOTE: Deliberately excluding OSFeatures, as there's no extant (or rational) case where a source image is an index and contains images distinguished only by OSFeature
156+
// See https://github.com/moby/buildkit/pull/4387#discussion_r1376234241 and https://github.com/opencontainers/image-spec/issues/1147
157+
if v.Platform.Architecture == i.Platform.Architecture && v.Platform.OS == i.Platform.OS && v.Platform.OSVersion == i.Platform.OSVersion && v.Platform.Variant == i.Platform.Variant {
156158
return
157159
}
158160
}

solver/llbsolver/vertex.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,17 +79,29 @@ func NormalizeRuntimePlatforms() LoadOpt {
7979
OS: p.OS,
8080
Architecture: p.Architecture,
8181
Variant: p.Variant,
82+
OSVersion: p.OSVersion,
83+
OSFeatures: p.OSFeatures,
8284
}
8385
}
8486
op.Platform = defaultPlatform
8587
}
86-
platform := ocispecs.Platform{OS: op.Platform.OS, Architecture: op.Platform.Architecture, Variant: op.Platform.Variant}
88+
platform := ocispecs.Platform{
89+
OS: op.Platform.OS,
90+
Architecture: op.Platform.Architecture,
91+
Variant: op.Platform.Variant,
92+
OSVersion: op.Platform.OSVersion,
93+
OSFeatures: op.Platform.OSFeatures,
94+
}
8795
normalizedPlatform := platforms.Normalize(platform)
8896

8997
op.Platform = &pb.Platform{
9098
OS: normalizedPlatform.OS,
9199
Architecture: normalizedPlatform.Architecture,
92100
Variant: normalizedPlatform.Variant,
101+
OSVersion: normalizedPlatform.OSVersion,
102+
}
103+
if normalizedPlatform.OSFeatures != nil {
104+
op.Platform.OSFeatures = append([]string{}, normalizedPlatform.OSFeatures...)
93105
}
94106

95107
return nil

0 commit comments

Comments
 (0)