diff --git a/components/engine/daemon/volumes_linux_unit_test.go b/components/engine/daemon/volumes_linux_unit_test.go index 6f4ab882dc..63181bf278 100644 --- a/components/engine/daemon/volumes_linux_unit_test.go +++ b/components/engine/daemon/volumes_linux_unit_test.go @@ -24,6 +24,10 @@ func TestParseBindMount(t *testing.T) { {"name:/tmp:ro", "local", "/tmp", "", "name", "local", false, false}, {"local/name:/tmp:rw", "", "/tmp", "", "local/name", "local", true, false}, {"/tmp:tmp", "", "", "", "", "", true, true}, + {"./name:/tmp", "", "", "", "", "", true, true}, + {"../name:/tmp", "", "", "", "", "", true, true}, + {"./:/tmp", "", "", "", "", "", true, true}, + {"../:/tmp", "", "", "", "", "", true, true}, } for _, c := range cases { diff --git a/components/engine/daemon/volumes_unix.go b/components/engine/daemon/volumes_unix.go index 3b32c65f9a..9fea1cf3a5 100644 --- a/components/engine/daemon/volumes_unix.go +++ b/components/engine/daemon/volumes_unix.go @@ -6,6 +6,7 @@ import ( "io/ioutil" "os" "path/filepath" + "regexp" "sort" "strings" @@ -102,6 +103,12 @@ func parseBindMount(spec, volumeDriver string) (*mountPoint, error) { } if len(source) == 0 { + //validate the name of named volume + nameRegex := regexp.MustCompile(`(^.+[^0-9A-Za-z_]+$)|(/)`) + if nameRegex.MatchString(name) { + return nil, derr.ErrorCodeVolumeName.WithArgs(name) + } + bind.Driver = volumeDriver if len(bind.Driver) == 0 { bind.Driver = volume.DefaultDriverName diff --git a/components/engine/errors/daemon.go b/components/engine/errors/daemon.go index 991388e4d7..88024bc1ab 100644 --- a/components/engine/errors/daemon.go +++ b/components/engine/errors/daemon.go @@ -385,6 +385,14 @@ var ( HTTPStatusCode: http.StatusInternalServerError, }) + // ErrorCodeVolumeName is generated when the name of named volume isn't valid. + ErrorCodeVolumeName = errcode.Register(errGroup, errcode.ErrorDescriptor{ + Value: "VOLUMENAME", + Message: "%s looks like a relative path, but it's taken as a name. And it is not a valid name.", + Description: "The name of named volume is invalid", + HTTPStatusCode: http.StatusInternalServerError, + }) + // ErrorCodeVolumeFromBlank is generated when path to a volume is blank. ErrorCodeVolumeFromBlank = errcode.Register(errGroup, errcode.ErrorDescriptor{ Value: "VOLUMEFROMBLANK",