diff --git a/pkg/commands/expose.go b/pkg/commands/expose.go index c2a75f9ea..daf4dc781 100644 --- a/pkg/commands/expose.go +++ b/pkg/commands/expose.go @@ -1,8 +1,26 @@ +/* +Copyright 2018 Google LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package commands import ( + "fmt" "github.com/containers/image/manifest" "github.com/docker/docker/builder/dockerfile/instructions" + "github.com/sirupsen/logrus" "strings" ) @@ -14,6 +32,16 @@ func (r *ExposeCommand) ExecuteCommand(config *manifest.Schema2Config) error { return updateExposedPorts(r.cmd.Ports, config) } +func validProtocol(protocol string) bool { + validProtocols := [2]string{"tcp", "udp"} + for _, p := range validProtocols { + if protocol == p { + return true + } + } + return false +} + func updateExposedPorts(ports []string, config *manifest.Schema2Config) error { // Grab the currently exposed ports existingPorts := config.ExposedPorts @@ -24,6 +52,11 @@ func updateExposedPorts(ports []string, config *manifest.Schema2Config) error { if !strings.Contains(p, "/") { p = p + "/tcp" } + protocol := strings.Split(p, "/")[1] + if !validProtocol(protocol) { + return fmt.Errorf("Invalid protocol: %s", protocol) + } + logrus.Infof("Adding exposed port: %s", p) var x struct{} existingPorts[manifest.Schema2Port(p)] = x } diff --git a/pkg/commands/expose_test.go b/pkg/commands/expose_test.go index b06b6766e..fc7fb2c0e 100644 --- a/pkg/commands/expose_test.go +++ b/pkg/commands/expose_test.go @@ -1,3 +1,19 @@ +/* +Copyright 2018 Google LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package commands import ( @@ -27,6 +43,19 @@ func TestUpdateExposedPorts(t *testing.T) { "8083/udp": {}, } - updateExposedPorts(ports, cfg) - testutil.CheckErrorAndDeepEqual(t, false, nil, expectedPorts, cfg.ExposedPorts) + err := updateExposedPorts(ports, cfg) + testutil.CheckErrorAndDeepEqual(t, false, err, expectedPorts, cfg.ExposedPorts) +} + +func TestInvalidProtocol(t *testing.T) { + cfg := &manifest.Schema2Config{ + ExposedPorts: manifest.Schema2PortSet{}, + } + + ports := []string{ + "80/garbage", + } + + err := updateExposedPorts(ports, cfg) + testutil.CheckErrorAndDeepEqual(t, true, err, nil, nil) }