Skip to content

Commit

Permalink
podman cp: fix copying with "." suffix
Browse files Browse the repository at this point in the history
Fix a bug for special-casing "." where Podman has mistakenly been
looking for a "." suffix instead of interpreting it as a path.

Add regression tests for the host-to-container, container-to-host and
container-to-container use cases.  Have separate tests for each to
verify that previous Podman versions fail each case.

Fixes: containers#16421
Signed-off-by: Valentin Rothberg <[email protected]>
  • Loading branch information
vrothberg committed Nov 14, 2022
1 parent f50ce4a commit 3371c9d
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 3 deletions.
6 changes: 3 additions & 3 deletions cmd/podman/containers/cp.go
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ func copyContainerToContainer(sourceContainer string, sourcePath string, destCon
// Hence, whenever "." is the source and the destination does not
// exist, we copy the source's parent and let the copier package create
// the destination via the Rename option.
if destResolvedToParentDir && sourceContainerInfo.IsDir && strings.HasSuffix(sourcePath, ".") {
if destResolvedToParentDir && sourceContainerInfo.IsDir && filepath.Base(sourcePath) == "." {
sourceContainerTarget = filepath.Dir(sourceContainerTarget)
}

Expand Down Expand Up @@ -261,7 +261,7 @@ func copyFromContainer(container string, containerPath string, hostPath string)
// we copy the source's parent and let the copier package create the
// destination via the Rename option.
containerTarget := containerInfo.LinkTarget
if resolvedToHostParentDir && containerInfo.IsDir && strings.HasSuffix(containerTarget, ".") {
if resolvedToHostParentDir && containerInfo.IsDir && filepath.Base(containerTarget) == "." {
containerTarget = filepath.Dir(containerTarget)
}

Expand Down Expand Up @@ -365,7 +365,7 @@ func copyToContainer(container string, containerPath string, hostPath string) er
// exist, we copy the source's parent and let the copier package create
// the destination via the Rename option.
hostTarget := hostInfo.LinkTarget
if containerResolvedToParentDir && hostInfo.IsDir && strings.HasSuffix(hostTarget, ".") {
if containerResolvedToParentDir && hostInfo.IsDir && filepath.Base(hostTarget) == "." {
hostTarget = filepath.Dir(hostTarget)
}

Expand Down
38 changes: 38 additions & 0 deletions test/system/065-cp.bats
Original file line number Diff line number Diff line change
Expand Up @@ -1047,6 +1047,44 @@ ${randomcontent[1]}" "$description"
run_podman rm -t 0 -f ctr-file ctr-dir
}

@test "podman cp - dot notation - host to container" {
srcdir=$PODMAN_TMPDIR/src
mkdir -p $srcdir
mkdir -p $srcdir/test1. $srcdir/test2
touch $srcdir/test1./file1 $srcdir/test2/file2

run_podman run -d --name=test-ctr --rm $IMAGE sleep infinity
run_podman cp $srcdir/test1. test-ctr:/tmp/foo
run_podman exec test-ctr stat /tmp/foo/file1

run_podman rm -f -t0 test-ctr
}

@test "podman cp - dot notation - container to host" {
dstdir=$PODMAN_TMPDIR/dst
mkdir -p $dstdir

run_podman run -d --name=test-ctr --rm $IMAGE sh -c "mkdir -p /foo/test1. /foo/test2; touch /foo/test1./file1 /foo/test2/file2; sleep infinity"
run_podman cp test-ctr:/foo/test1. $dstdir/foo
run stat $dstdir/foo/test1.
if [[ -e $dstdir/foo/test2 ]]; then
die "the test2 directory should not have been copied over"
fi

run_podman rm -f -t0 test-ctr
}

@test "podman cp - dot notation - container to container" {
run_podman run -d --name=src-ctr --rm $IMAGE sh -c "mkdir -p /foo/test1. /foo/test2; touch /foo/test1./file1 /foo/test2/file2; sleep infinity"
run_podman run -d --name=dest-ctr --rm $IMAGE sleep infinity
run_podman cp src-ctr:/foo/test1. dest-ctr:/foo

run_podman exec dest-ctr find /foo
run_podman exec dest-ctr stat /foo/file1

run_podman rm -f -t0 src-ctr dest-ctr
}

function teardown() {
# In case any test fails, clean up the container we left behind
run_podman rm -t 0 -f --ignore cpcontainer
Expand Down

0 comments on commit 3371c9d

Please sign in to comment.