diff options
author | openshift-ci[bot] <75433959+openshift-ci[bot]@users.noreply.github.com> | 2021-08-16 12:47:13 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-16 12:47:13 +0000 |
commit | 9ee9d4a0722b2a31d95066a4e3ce756a8b4d15ac (patch) | |
tree | e0b08243f37d909daf1d6f02b321f8d9ee97b7ee /libpod/networking_linux.go | |
parent | a38d7530dbe7d39cb76c16b2b44f96f870223fca (diff) | |
parent | 2a8c4144887373dd8c070ac09f33fea7ab764a95 (diff) | |
download | podman-9ee9d4a0722b2a31d95066a4e3ce756a8b4d15ac.tar.gz podman-9ee9d4a0722b2a31d95066a4e3ce756a8b4d15ac.tar.bz2 podman-9ee9d4a0722b2a31d95066a4e3ce756a8b4d15ac.zip |
Merge pull request #11230 from Luap99/rootless-dns
Fix rootless cni dns without systemd stub resolver
Diffstat (limited to 'libpod/networking_linux.go')
-rw-r--r-- | libpod/networking_linux.go | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/libpod/networking_linux.go b/libpod/networking_linux.go index 17e444f66..2ed2bb01b 100644 --- a/libpod/networking_linux.go +++ b/libpod/networking_linux.go @@ -173,11 +173,27 @@ func (r *RootlessCNI) Do(toRun func() error) error { // the link target will be available in the mount ns. // see: https://github.com/containers/podman/issues/10855 resolvePath := "/etc/resolv.conf" - resolvePath, err = filepath.EvalSymlinks(resolvePath) - if err != nil { - return err + for i := 0; i < 255; i++ { + // Do not use filepath.EvalSymlinks, we only want the first symlink under /run. + // If /etc/resolv.conf has more than one symlink under /run, e.g. + // -> /run/systemd/resolve/stub-resolv.conf -> /run/systemd/resolve/resolv.conf + // we would put the netns resolv.conf file to the last path. However this will + // break dns because the second link does not exists in the mount ns. + // see https://github.com/containers/podman/issues/11222 + link, err := os.Readlink(resolvePath) + if err != nil { + // if there is no symlink exit + break + } + resolvePath = filepath.Join(filepath.Dir(resolvePath), link) + if strings.HasPrefix(resolvePath, "/run/") { + break + } + if i == 254 { + return errors.New("too many symlinks while resolving /etc/resolv.conf") + } } - logrus.Debugf("The actual path of /etc/resolv.conf on the host is %q", resolvePath) + logrus.Debugf("The path of /etc/resolv.conf in the mount ns is %q", resolvePath) // When /etc/resolv.conf on the host is a symlink to /run/systemd/resolve/stub-resolv.conf, // we have to mount an empty filesystem on /run/systemd/resolve in the child namespace, // so as to isolate the directory from the host mount namespace. |