Remove the existing link before trying to re-create, passing the test.
Add -p to the -r test as a regression guard, portage calls cp with both.
>From fa5e8e861171cd89b7fc4e5423c8ce3bafc93d3f Mon Sep 17 00:00:00 2001
From: makepost <[email protected]>
Date: Mon, 10 Jun 2019 16:29:10 +0000
Subject: [PATCH] Fix cp -r dir/. symlink child.

Remove the existing link before trying to re-create, passing the test.
Add -p to the -r test as a regression guard, portage calls cp with both.
---
 tests/cp.test   | 8 ++++----
 toys/posix/cp.c | 3 ++-
 2 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/tests/cp.test b/tests/cp.test
index c7d445c0..9ee6cd0e 100755
--- a/tests/cp.test
+++ b/tests/cp.test
@@ -90,12 +90,12 @@ testing "-r dir1/* dir2" \
 rm -rf one dir dir2
 
 mkdir one; touch one/two; cp one/two one/three
-cp -r one/ one_ # Succeeds twice in a row
-testing "-r dir/." "cp -r one/. one_ && echo yes" "yes\n" "" ""
+cp -pr one/ one_ # Succeeds twice in a row
+testing "-pr dir/." "cp -pr one/. one_ && echo yes" "yes\n" "" ""
 rm -rf one one_
 mkdir one; touch one/two; ln -s two one/three
-cp -r one/ one_ # First time ok, but second will fail with "File exists"
-testing "-r dir/. symlink child" "cp -r one/. one_ && echo yes" "yes\n" "" ""
+cp -pr one/ one_ # First time ok, second mustn't fail with "File exists"
+testing "-pr dir/. symlink child" "cp -pr one/. one_ && echo yes" "yes\n" "" ""
 rm -rf one one_
 
 touch walrus
diff --git a/toys/posix/cp.c b/toys/posix/cp.c
index e37b360d..681af025 100644
--- a/toys/posix/cp.c
+++ b/toys/posix/cp.c
@@ -252,7 +252,8 @@ static int cp_node(struct dirtree *try)
         // make symlink, or make block/char/fifo/socket
         if (S_ISLNK(try->st.st_mode)
             ? ((i = readlinkat0(tfd, try->name, toybuf, sizeof(toybuf))) &&
-               !symlinkat(toybuf, cfd, catch))
+               ((!unlinkat(cfd, catch, 0) || ENOENT == errno) &&
+                !symlinkat(toybuf, cfd, catch)))
             : !mknodat(cfd, catch, try->st.st_mode, try->st.st_rdev))
         {
           err = 0;
_______________________________________________
Toybox mailing list
[email protected]
http://lists.landley.net/listinfo.cgi/toybox-landley.net

Reply via email to