diff --git a/staging/src/k8s.io/mount-utils/mount_windows.go b/staging/src/k8s.io/mount-utils/mount_windows.go index f4573f264f7d..358bcf52f200 100644 --- a/staging/src/k8s.io/mount-utils/mount_windows.go +++ b/staging/src/k8s.io/mount-utils/mount_windows.go @@ -132,12 +132,23 @@ func (mounter *Mounter) MountSensitive(source string, target string, fstype stri } } - output, err := exec.Command("cmd", "/c", "mklink", "/D", target, bindSource).CombinedOutput() + // There is an issue in golang where EvalSymlinks fails on Windows when passed a + // UNC share root path without a trailing backslash. + // Ex: \\SERVER\share will fail to resolve but \\SERVER\share\ will resolve + // containerD on Windows calls EvalSymlinks so we'll add the backslash when making the symlink if it is missing. + // https://github.com/golang/go/pull/42096 fixes this issue in golang but a fix will not be available until + // golang v1.16 + mklinkSource := bindSource + if !strings.HasSuffix(mklinkSource, "\\") { + mklinkSource = mklinkSource + "\\" + } + + output, err := exec.Command("cmd", "/c", "mklink", "/D", target, mklinkSource).CombinedOutput() if err != nil { - klog.Errorf("mklink failed: %v, source(%q) target(%q) output: %q", err, bindSource, target, string(output)) + klog.Errorf("mklink failed: %v, source(%q) target(%q) output: %q", err, mklinkSource, target, string(output)) return err } - klog.V(2).Infof("mklink source(%q) on target(%q) successfully, output: %q", bindSource, target, string(output)) + klog.V(2).Infof("mklink source(%q) on target(%q) successfully, output: %q", mklinkSource, target, string(output)) return nil }