diff options
author | Jim Meyering <meyering@redhat.com> | 2008-03-19 13:37:04 +0100 |
---|---|---|
committer | Jim Meyering <meyering@redhat.com> | 2008-03-19 13:38:27 +0100 |
commit | 63feb84a2db5246fb71df45884589b914679110c (patch) | |
tree | 445766ed937dd76bb685a3555cc44136ac1e6f7a /src | |
parent | 4b544e447eb78fd1f031a026a499f6aed177808a (diff) | |
download | coreutils-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.c | 5 |
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)) )) { |