mirror of
https://git.savannah.gnu.org/git/coreutils.git
synced 2025-09-10 07:59:52 +02:00
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user