Skip to content
This repository was archived by the owner on Oct 13, 2023. It is now read-only.

Commit a36b2dc

Browse files
committed
pkg/archive: escape ":" symbol in overlay lowerdir
lowerdir needs escaping: https://github.com/torvalds/linux/blob/v5.4/fs/overlayfs/super.c#L835-L853 Fix #40939 Signed-off-by: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp> (cherry picked from commit 6a5e3547fbe0d17eb99762cf2c24fae485308473) Signed-off-by: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp> Upstream-commit: 0a3b2bda3495e259208c49b08f5bd208078f9371 Component: engine
1 parent ea22cea commit a36b2dc

1 file changed

Lines changed: 6 additions & 2 deletions

File tree

components/engine/pkg/archive/archive_linux.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,9 @@ func mknodChar0Overlay(cleansedOriginalPath string) error {
151151
if err := ioutil.WriteFile(lowerDummy, []byte{}, 0600); err != nil {
152152
return errors.Wrapf(err, "failed to create a dummy lower file %s", lowerDummy)
153153
}
154-
mOpts := fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", lower, upper, work)
154+
// lowerdir needs ":" to be escaped: https://github.com/moby/moby/issues/40939#issuecomment-627098286
155+
lowerEscaped := strings.ReplaceAll(lower, ":", "\\:")
156+
mOpts := fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", lowerEscaped, upper, work)
155157
// docker/pkg/mount.Mount() requires procfs to be mounted. So we use syscall.Mount() directly instead.
156158
if err := syscall.Mount("overlay", merged, "overlay", uintptr(0), mOpts); err != nil {
157159
return errors.Wrapf(err, "failed to mount overlay (%s) on %s", mOpts, merged)
@@ -236,7 +238,9 @@ func createDirWithOverlayOpaque(tmp string) (string, error) {
236238
if err := os.MkdirAll(lowerDummy, 0700); err != nil {
237239
return "", errors.Wrapf(err, "failed to create a dummy lower directory %s", lowerDummy)
238240
}
239-
mOpts := fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", lower, upper, work)
241+
// lowerdir needs ":" to be escaped: https://github.com/moby/moby/issues/40939#issuecomment-627098286
242+
lowerEscaped := strings.ReplaceAll(lower, ":", "\\:")
243+
mOpts := fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", lowerEscaped, upper, work)
240244
// docker/pkg/mount.Mount() requires procfs to be mounted. So we use syscall.Mount() directly instead.
241245
if err := syscall.Mount("overlay", merged, "overlay", uintptr(0), mOpts); err != nil {
242246
return "", errors.Wrapf(err, "failed to mount overlay (%s) on %s", mOpts, merged)

0 commit comments

Comments
 (0)