From da22625f6986f0ef196eaa1f8bb6adce098f0fb7 Mon Sep 17 00:00:00 2001 From: Liu Hua Date: Tue, 13 Apr 2021 11:22:58 +0800 Subject: [PATCH] checkpoint: resolve symlink for external bind mount runc resolves symlink before doing bind mount. So we should save original path while formatting CriuReq for checkpoint. Signed-off-by: Liu Hua --- libcontainer/container_linux.go | 3 +++ tests/integration/checkpoint.bats | 13 ++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/libcontainer/container_linux.go b/libcontainer/container_linux.go index 69632daba2d..dbb36cb083a 100644 --- a/libcontainer/container_linux.go +++ b/libcontainer/container_linux.go @@ -779,6 +779,9 @@ const descriptorsFilename = "descriptors.json" func (c *linuxContainer) addCriuDumpMount(req *criurpc.CriuReq, m *configs.Mount) { mountDest := strings.TrimPrefix(m.Destination, c.config.Rootfs) + if dest, err := securejoin.SecureJoin(c.config.Rootfs, mountDest); err == nil { + mountDest = dest[len(c.config.Rootfs):] + } extMnt := &criurpc.ExtMountMap{ Key: proto.String(mountDest), Val: proto.String(mountDest), diff --git a/tests/integration/checkpoint.bats b/tests/integration/checkpoint.bats index 535b1c1057f..05671fbe004 100644 --- a/tests/integration/checkpoint.bats +++ b/tests/integration/checkpoint.bats @@ -126,7 +126,18 @@ function simple_cr() { done } -@test "checkpoint and restore " { +@test "checkpoint and restore" { + simple_cr +} + +@test "checkpoint and restore (bind mount, destination is symlink)" { + mkdir -p rootfs/real/conf + ln -s /real/conf rootfs/conf + update_config ' .mounts += [{ + source: ".", + destination: "/conf", + options: ["bind"] + }]' simple_cr }