From 6229d9d07dc16cb4b4f7b35716a59b9432bbd651 Mon Sep 17 00:00:00 2001
From: Valentin Rothberg <rothberg@redhat.com>
Date: Thu, 4 Jun 2020 09:37:27 +0200
Subject: /images/.../json: fix port parsing

Fix a bug when parsing the `ExposedPorts` of the image that lead to
panics when the field was set.  The OCI image spec allows three valid
formats: `tcp/port`, `udp/port` and `port`

Fixes: #6490
Reported-by: @jgallucci32
Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
---
 pkg/api/handlers/types.go | 27 ++++++++++++++++++---------
 1 file changed, 18 insertions(+), 9 deletions(-)

diff --git a/pkg/api/handlers/types.go b/pkg/api/handlers/types.go
index aa3d0fe91..79aeff2f8 100644
--- a/pkg/api/handlers/types.go
+++ b/pkg/api/handlers/types.go
@@ -334,16 +334,25 @@ func ImageDataToImageInspect(ctx context.Context, l *libpodImage.Image) (*ImageI
 func portsToPortSet(input map[string]struct{}) (nat.PortSet, error) {
 	ports := make(nat.PortSet)
 	for k := range input {
-		npTCP, err := nat.NewPort("tcp", k)
-		if err != nil {
-			return nil, errors.Wrapf(err, "unable to create tcp port from %s", k)
-		}
-		npUDP, err := nat.NewPort("udp", k)
-		if err != nil {
-			return nil, errors.Wrapf(err, "unable to create udp port from %s", k)
+		proto, port := nat.SplitProtoPort(k)
+		switch proto {
+		// See the OCI image spec for details:
+		// https://github.com/opencontainers/image-spec/blob/e562b04403929d582d449ae5386ff79dd7961a11/config.md#properties
+		case "tcp", "":
+			p, err := nat.NewPort("tcp", port)
+			if err != nil {
+				return nil, errors.Wrapf(err, "unable to create tcp port from %s", k)
+			}
+			ports[p] = struct{}{}
+		case "udp":
+			p, err := nat.NewPort("udp", port)
+			if err != nil {
+				return nil, errors.Wrapf(err, "unable to create tcp port from %s", k)
+			}
+			ports[p] = struct{}{}
+		default:
+			return nil, errors.Errorf("invalid port proto %q in %q", proto, k)
 		}
-		ports[npTCP] = struct{}{}
-		ports[npUDP] = struct{}{}
 	}
 	return ports, nil
 }
-- 
cgit v1.2.3-54-g00ecf