diff --git a/compose/convert/volume.go b/compose/convert/volume.go index 027774bcec..3a7504106a 100644 --- a/compose/convert/volume.go +++ b/compose/convert/volume.go @@ -31,6 +31,12 @@ func convertVolumeToMount(volumeSpec string, stackVolumes volumes, namespace Nam // TODO: split Windows path mappings properly parts := strings.SplitN(volumeSpec, ":", 3) + for _, part := range parts { + if strings.TrimSpace(part) == "" { + return mount.Mount{}, fmt.Errorf("invalid volume: %s", volumeSpec) + } + } + switch len(parts) { case 3: source = parts[0] @@ -41,8 +47,6 @@ func convertVolumeToMount(volumeSpec string, stackVolumes volumes, namespace Nam target = parts[1] case 1: target = parts[0] - default: - return mount.Mount{}, fmt.Errorf("invalid volume: %s", volumeSpec) } if source == "" { diff --git a/compose/convert/volume_test.go b/compose/convert/volume_test.go index 3ca6ab4a52..bcbfb08b95 100644 --- a/compose/convert/volume_test.go +++ b/compose/convert/volume_test.go @@ -46,6 +46,15 @@ func TestConvertVolumeToMountAnonymousVolume(t *testing.T) { assert.DeepEqual(t, mount, expected) } +func TestConvertVolumeToMountInvalidFormat(t *testing.T) { + namespace := NewNamespace("foo") + invalids := []string{"::", "::cc", ":bb:", "aa::", "aa::cc", "aa:bb:", " : : ", " : :cc", " :bb: ", "aa: : ", "aa: :cc", "aa:bb: "} + for _, vol := range invalids { + _, err := convertVolumeToMount(vol, volumes{}, namespace) + assert.Error(t, err, "invalid volume: "+vol) + } +} + func TestConvertVolumeToMountNamedVolume(t *testing.T) { stackVolumes := volumes{ "normal": composetypes.VolumeConfig{