Skip to content

Commit 34a576c

Browse files
authored
Merge pull request moby#3659 from sipsma/fix-nil-frontend-input-panic
Fix buildkitd panic when frontend input is nil.
2 parents a84cd1c + 2e6d0bf commit 34a576c

File tree

3 files changed

+34
-0
lines changed

3 files changed

+34
-0
lines changed

client/llb/definition.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ type DefinitionOp struct {
2929

3030
// NewDefinitionOp returns a new operation from a marshalled definition.
3131
func NewDefinitionOp(def *pb.Definition) (*DefinitionOp, error) {
32+
if def == nil {
33+
return nil, errors.New("invalid nil input definition to definition op")
34+
}
35+
3236
ops := make(map[digest.Digest]*pb.Op)
3337
defs := make(map[digest.Digest][]byte)
3438
platforms := make(map[digest.Digest]*ocispecs.Platform)

client/llb/definition_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,3 +118,9 @@ func TestDefinitionInputCache(t *testing.T) {
118118
// 1 exec + 2x2 mounts from stA and stB + 1 src = 6 vertexes
119119
require.Equal(t, 6, len(vertexCache))
120120
}
121+
122+
func TestDefinitionNil(t *testing.T) {
123+
// should be an error, not a panic
124+
_, err := NewDefinitionOp(nil)
125+
require.Error(t, err)
126+
}

frontend/dockerfile/dockerfile_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ var allTests = integration.TestFuncs(
160160
testNilProvenance,
161161
testSBOMScannerArgs,
162162
testMultiPlatformWarnings,
163+
testNilContextInSolveGateway,
163164
)
164165

165166
// Tests that depend on the `security.*` entitlements
@@ -6563,6 +6564,29 @@ COPY --from=0 / /
65636564
require.Equal(t, expectedDigest, outDigest)
65646565
}
65656566

6567+
func testNilContextInSolveGateway(t *testing.T, sb integration.Sandbox) {
6568+
f := getFrontend(t, sb)
6569+
c, err := client.New(sb.Context(), sb.Address())
6570+
require.NoError(t, err)
6571+
defer c.Close()
6572+
6573+
_, err = c.Build(sb.Context(), client.SolveOpt{}, "", func(ctx context.Context, c gateway.Client) (*gateway.Result, error) {
6574+
res, err := f.SolveGateway(ctx, c, gateway.SolveRequest{
6575+
Frontend: "dockerfile.v0",
6576+
FrontendInputs: map[string]*pb.Definition{
6577+
dockerui.DefaultLocalNameContext: nil,
6578+
dockerui.DefaultLocalNameDockerfile: nil,
6579+
},
6580+
})
6581+
if err != nil {
6582+
return nil, err
6583+
}
6584+
return res, nil
6585+
}, nil)
6586+
// should not cause buildkitd to panic
6587+
require.ErrorContains(t, err, "invalid nil input definition to definition op")
6588+
}
6589+
65666590
func runShell(dir string, cmds ...string) error {
65676591
for _, args := range cmds {
65686592
var cmd *exec.Cmd

0 commit comments

Comments
 (0)