summaryrefslogtreecommitdiff
path: root/tests/mv/hard-4.sh
diff options
context:
space:
mode:
authorBoris Ranto <branto@redhat.com>2014-11-18 20:20:50 +0100
committerPádraig Brady <P@draigBrady.com>2014-11-21 02:48:45 +0000
commit222d7ac0c4f5f005438c534f3aba62fd94d96dc2 (patch)
tree55263d170dd91118391d3fddd0598311f33d43d7 /tests/mv/hard-4.sh
parentf43c072a04ba881debf35ccdb509ee0a145b255c (diff)
downloadcoreutils-222d7ac0c4f5f005438c534f3aba62fd94d96dc2.tar.xz
mv: fail when moving a file to a hardlink
We may run into a race condition if we treat hard links to the same file as distinct files. If we do 'mv a b' and 'mv b a' in parallel, both a and b can disappear from the file system. The reason is that in this case the unlink on src is called and the system calls can end up being run in the order where unlink(a) and unlink(b) are the last two system calls. Therefore exit with an error code so that we avoid the potential data loss. * src/copy.c (same_file_ok): Don't set unlink_src that was used by mv, and return false for two hardlinks to a file in move_mode. *src/copy.c (copy_internal): No longer honor the unlink_src option, used only by mv. NEWS: Mention the change in behavior. * tests/cp/same-file.sh: Augment to cover the `cp -a hlsl1 sl1` case. * tests/mv/hard-verbose.sh: Remove no longer needed test. * tests/local.mk: Remove the reference to hard-verbose.sh. * tests/mv/hard-4.sh: Adjust so we fail in this case. * tests/mv/i-4.sh: Likewise. * tests/mv/symlink-onto-hardlink-to-self.sh: Likewise.
Diffstat (limited to 'tests/mv/hard-4.sh')
-rwxr-xr-xtests/mv/hard-4.sh17
1 files changed, 10 insertions, 7 deletions
diff --git a/tests/mv/hard-4.sh b/tests/mv/hard-4.sh
index d518e3bcd..8b03c458b 100755
--- a/tests/mv/hard-4.sh
+++ b/tests/mv/hard-4.sh
@@ -1,5 +1,5 @@
#!/bin/sh
-# ensure that mv removes a in this case: touch a; ln a b; mv a b
+# ensure that mv maintains a in this case: touch a; ln a b; mv a b
# Copyright (C) 2003-2014 Free Software Foundation, Inc.
@@ -21,15 +21,18 @@ print_ver_ mv
touch a || framework_failure_
ln a b || framework_failure_
+# Between coreutils-5.0 and coreutils-8.24, 'a' would be removed.
+# Before coreutils-5.0.1 the issue would not have been diagnosed.
+# We don't emulate the rename(a,b) with unlink(a) as that would
+# introduce races with overlapping mv instances removing both links.
+mv a b 2>err && fail=1
+printf "mv: 'a' and 'b' are the same file\n" > exp
+compare exp err || fail=1
-mv a b || fail=1
-
-# In coreutils-5.0 and earlier, a would not be removed.
-test -r a && fail=1
+test -r a || fail=1
test -r b || fail=1
-# Make sure it works also with --backup.
-ln b a
+# Make sure it works with --backup.
mv --backup=simple a b || fail=1
test -r a && fail=1
test -r b || fail=1