summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJim Meyering <meyering@redhat.com>2008-03-19 13:37:04 +0100
committerJim Meyering <meyering@redhat.com>2008-03-19 13:38:27 +0100
commit63feb84a2db5246fb71df45884589b914679110c (patch)
tree445766ed937dd76bb685a3555cc44136ac1e6f7a /src
parent4b544e447eb78fd1f031a026a499f6aed177808a (diff)
downloadcoreutils-63feb84a2db5246fb71df45884589b914679110c.tar.xz
mv: never unlink a destination file before calling rename
While cp --preserve=links must unlink certain destination files, mv must never do that. * src/copy.c (copy_internal): Pull the '! x->move_mode' test "up", so it affects the entire condition, and not just DEREF_NEVER mode. Reported by James Ralston in <http://bugzilla.redhat.com/438076>. * tests/mv/atomic2: New file. Test for the above fix. * tests/mv/Makefile.am (TESTS): Add atomic2. * NEWS: Mention the bug-fix. [Bug introduced in 367719ba5f1dbd5e2f7fa2466c441f23f66a7c9e]
Diffstat (limited to 'src')
-rw-r--r--src/copy.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/copy.c b/src/copy.c
index fd31b5c91..208a67413 100644
--- a/src/copy.c
+++ b/src/copy.c
@@ -1339,10 +1339,11 @@ copy_internal (char const *src_name, char const *dst_name,
new_dst = true;
}
else if (! S_ISDIR (dst_sb.st_mode)
+ /* Never unlink dst_name when in move mode. */
+ && ! x->move_mode
&& (x->unlink_dest_before_opening
|| (x->preserve_links && 1 < dst_sb.st_nlink)
- || (!x->move_mode
- && x->dereference == DEREF_NEVER
+ || (x->dereference == DEREF_NEVER
&& S_ISLNK (src_sb.st_mode))
))
{