From: Pádraig Brady
Date: Tue, 29 Sep 2009 14:43:01 +0000 (+0100) Subject: ls: always print "?" for allocated size of a dereferenced dangling symlink X-Git-Tag: v8.0~13 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d4c7114bce116aefe28c899f5d0e7dcc39feb103;p=thirdparty%2Fcoreutils.git ls: always print "?" for allocated size of a dereferenced dangling symlink Previously for `ls -Ls` (but not `ls -Lsl`), we referenced the st_blocks returned from the previous failed stat() call. This undefined value was seen to be 0 for dangling symlinks at least. * src/ls.c (print_file_name_and_frills, length_of_file_name_and_frills): Don't use st_blocks if the previous stat() failed * tests/ls/dangle: Add a test case * NEWS: Mention the fix, and roll up related items into a single entry. --- diff --git a/NEWS b/NEWS index f1f73472d8..e7e4ddccf5 100644 --- a/NEWS +++ b/NEWS @@ -18,12 +18,9 @@ GNU coreutils NEWS -*- outline -*- ls -LR exits with status 2, not 0, when it encounters a cycle - ls -Li is now consistent with ls -Lil in printing "?", not "0" as the - inode of a dangling symlink. - - ls -Li no longer relies on unspecified behavior of stat/lstat. - Before this change, "ls -Li dangling-symlink" would mistakenly - print the inode number of the symlink under some conditions. + ls -is is now consistent with ls -lis in ignoring values returned + from a failed stat/lstat. For example ls -Lis now prints "?", not "0", + for the inode number and allocated size of a dereferenced dangling symlink. ** Portability diff --git a/src/ls.c b/src/ls.c index 801e717c61..30df92c1ac 100644 --- a/src/ls.c +++ b/src/ls.c @@ -4016,8 +4016,9 @@ print_file_name_and_frills (const struct fileinfo *f, size_t start_col) if (print_block_size) printf ("%*s ", format == with_commas ? 0 : block_size_width, - human_readable (ST_NBLOCKS (f->stat), buf, human_output_opts, - ST_NBLOCKSIZE, output_block_size)); + ! f->stat_ok ? "?" + : human_readable (ST_NBLOCKS (f->stat), buf, human_output_opts, + ST_NBLOCKSIZE, output_block_size)); if (print_scontext) printf ("%*s ", format == with_commas ? 0 : scontext_width, f->scontext); @@ -4234,9 +4235,10 @@ length_of_file_name_and_frills (const struct fileinfo *f) if (print_block_size) len += 1 + (format == with_commas - ? strlen (human_readable (ST_NBLOCKS (f->stat), buf, - human_output_opts, ST_NBLOCKSIZE, - output_block_size)) + ? strlen (! f->stat_ok ? "?" + : human_readable (ST_NBLOCKS (f->stat), buf, + human_output_opts, ST_NBLOCKSIZE, + output_block_size)) : block_size_width); if (print_scontext) diff --git a/tests/ls/dangle b/tests/ls/dangle index 6abad9213d..687d3dfba0 100755 --- a/tests/ls/dangle +++ b/tests/ls/dangle @@ -28,7 +28,8 @@ mkdir -p dir/sub || framework_failure ln -s dir slink-to-dir || framework_failure mkdir d || framework_failure ln -s no-such d/dangle || framework_failure -echo '? dangle' > subdir_exp || framework_failure +printf '? dangle\n' > subdir_Li_exp || framework_failure +printf 'total 0\n? dangle\n' > subdir_Ls_exp || framework_failure fail=0 @@ -56,6 +57,11 @@ compare out exp || fail=1 # Ensure that ls -Li prints "?" as the inode of a dangling symlink. rm -f out ls -Li d > out 2>/dev/null && fail=1 -compare out subdir_exp || fail=1 +compare out subdir_Li_exp || fail=1 + +# Ensure that ls -Ls prints "?" as the allocation of a dangling symlink. +rm -f out +ls -Ls d > out 2>/dev/null && fail=1 +compare out subdir_Ls_exp || fail=1 Exit $fail