From f8d235be9ebdaaa4621e99c70b9024f56d216955 Mon Sep 17 00:00:00 2001 From: Ed Bartosh Date: Sat, 23 Feb 2019 15:45:14 +0100 Subject: [PATCH] kubeadm: fix url validation code Fixed nil pointer dereference in url validation code that caused kubeamd panic: panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x8 pc=0xa7930c] goroutine 1 [running]: kubeadm/validation.ValidateURLs(0x40000bafe0, 0x2, 0x2, 0x1, 0x40002967b0, 0x0, 0x40002967b0, 0xf302a0) kubeadm/validation/validation.go:324 +0xcc kubeadm/validation.ValidateEtcd(0x400000b490, 0x4000296720, 0x0, 0x0, 0x0) kubeadm/validation/validation.go:291 +0x1f0 ... Fixes: kubernetes/kubeadm#1419 Signed-off-by: Ed Bartosh --- .../app/apis/kubeadm/validation/validation.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/cmd/kubeadm/app/apis/kubeadm/validation/validation.go b/cmd/kubeadm/app/apis/kubeadm/validation/validation.go index c85d35348d..af44803a5e 100644 --- a/cmd/kubeadm/app/apis/kubeadm/validation/validation.go +++ b/cmd/kubeadm/app/apis/kubeadm/validation/validation.go @@ -321,12 +321,16 @@ func ValidateURLs(urls []string, requireHTTPS bool, fldPath *field.Path) field.E allErrs := field.ErrorList{} for _, urlstr := range urls { u, err := url.Parse(urlstr) - if err != nil || u.Scheme == "" { - allErrs = append(allErrs, field.Invalid(fldPath, urlstr, "not a valid URL")) + if err != nil { + allErrs = append(allErrs, field.Invalid(fldPath, urlstr, fmt.Sprintf("URL parse error: %v", err))) + continue } if requireHTTPS && u.Scheme != "https" { allErrs = append(allErrs, field.Invalid(fldPath, urlstr, "the URL must be using the HTTPS scheme")) } + if u.Scheme == "" { + allErrs = append(allErrs, field.Invalid(fldPath, urlstr, "the URL without scheme is not allowed")) + } } return allErrs } @@ -476,7 +480,7 @@ func ValidateSocketPath(socket string, fldPath *field.Path) field.ErrorList { u, err := url.Parse(socket) if err != nil { - return append(allErrs, field.Invalid(fldPath, socket, fmt.Sprintf("url parsing error: %v", err))) + return append(allErrs, field.Invalid(fldPath, socket, fmt.Sprintf("URL parsing error: %v", err))) } if u.Scheme == "" { @@ -484,7 +488,7 @@ func ValidateSocketPath(socket string, fldPath *field.Path) field.ErrorList { return append(allErrs, field.Invalid(fldPath, socket, fmt.Sprintf("path is not absolute: %s", socket))) } } else if u.Scheme != kubeadmapiv1beta1.DefaultUrlScheme { - return append(allErrs, field.Invalid(fldPath, socket, fmt.Sprintf("url scheme %s is not supported", u.Scheme))) + return append(allErrs, field.Invalid(fldPath, socket, fmt.Sprintf("URL scheme %s is not supported", u.Scheme))) } return allErrs