ln: fix replacing symbolic links whose targets can't exist

* src/ln.c (errno_nonexisting): A new function to determine if
the errno implies that a file doesn't or can't (currently) exist.
(target_directory_operand): Use the new function to expand the
set of errors we handle.
* tests/ln/sf-1.sh: Add test cases for the newly handled errors.
* THANKS.in: Mention the reporter.
* NEWS: Mention the bug fix.
This commit is contained in:
Pádraig Brady
2014-01-17 03:54:29 +00:00
parent 745de6dca5
commit 7fa1641db0
4 changed files with 33 additions and 3 deletions

View File

@@ -20,12 +20,27 @@
print_ver_ ln
echo foo > a || framework_failure_
ln -s . b || framework_failure_
# Check that a target directory of '.' is supported
# and that indirectly specifying the same target and link name
# through that is detected.
ln -s . b || framework_failure_
ln -sf a b > err 2>&1 && fail=1
case $(cat err) in
*'are the same file') ;;
*) fail=1 ;;
esac
# Ensure we replace symlinks that don't or can't link to an existing target.
# coreutils-8.22 would fail to replace {ENOTDIR,ELOOP,ENAMETOOLONG}_link below.
name_max_plus1=$(expr $(stat -f -c %l .) + 1)
test $name_max_plus1 -gt 1 || skip_ 'Error determining NAME_MAX'
long_name=$(printf '%0*d' $name_max_plus1 0)
for f in '' f; do
ln -s$f missing ENOENT_link || fail=1
ln -s$f a/b ENOTDIR_link || fail=1
ln -s$f ELOOP_link ELOOP_link || fail=1
ln -s$f "$long_name" ENAMETOOLONG_link || fail=1
done
Exit $fail