From c9542d313e2a52807644742e5fd684bc2de9f507 Mon Sep 17 00:00:00 2001 From: Yuichiro Kaneko Date: Thu, 5 Jul 2018 09:23:15 +0900 Subject: [PATCH] Return error if basename is expanded to blank Fix: https://github.com/moby/moby/issues/37325 Signed-off-by: Yuichiro Kaneko --- builder/dockerfile/dispatchers.go | 10 ++++++++-- builder/dockerfile/dispatchers_test.go | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/builder/dockerfile/dispatchers.go b/builder/dockerfile/dispatchers.go index 6ee2b17cda..2dd0177ad3 100644 --- a/builder/dockerfile/dispatchers.go +++ b/builder/dockerfile/dispatchers.go @@ -274,11 +274,17 @@ func (d *dispatchRequest) getImageOrStage(name string, platform *specs.Platform) } return imageMount.Image(), nil } -func (d *dispatchRequest) getFromImage(shlex *shell.Lex, name string, platform *specs.Platform) (builder.Image, error) { - name, err := d.getExpandedString(shlex, name) +func (d *dispatchRequest) getFromImage(shlex *shell.Lex, basename string, platform *specs.Platform) (builder.Image, error) { + name, err := d.getExpandedString(shlex, basename) if err != nil { return nil, err } + // Empty string is interpreted to FROM scratch by images.GetImageAndReleasableLayer, + // so validate expanded result is not empty. + if name == "" { + return nil, errors.Errorf("base name (%s) should not be blank", basename) + } + return d.getImageOrStage(name, platform) } diff --git a/builder/dockerfile/dispatchers_test.go b/builder/dockerfile/dispatchers_test.go index c61a45b03a..b623985efe 100644 --- a/builder/dockerfile/dispatchers_test.go +++ b/builder/dockerfile/dispatchers_test.go @@ -157,6 +157,22 @@ func TestFromWithArg(t *testing.T) { assert.Check(t, is.Len(sb.state.buildArgs.GetAllMeta(), 1)) } +func TestFromWithArgButBuildArgsNotGiven(t *testing.T) { + b := newBuilderWithMockBackend() + args := NewBuildArgs(make(map[string]*string)) + + metaArg := instructions.ArgCommand{} + cmd := &instructions.Stage{ + BaseName: "${THETAG}", + } + err := processMetaArg(metaArg, shell.NewLex('\\'), args) + + sb := newDispatchRequest(b, '\\', nil, args, newStagesBuildResults()) + assert.NilError(t, err) + err = initializeStage(sb, cmd) + assert.Error(t, err, "base name (${THETAG}) should not be blank") +} + func TestFromWithUndefinedArg(t *testing.T) { tag, expected := "sometag", "expectedthisid"