mirror of
git://git.sv.gnu.org/coreutils.git
synced 2026-04-12 23:08:17 +02:00
Capability checking was incorrectly done on just the base name rather than on the whole path. Consequently there could be both false positives and negatives when coloring files with capabilities. Also capability checking was not done at all in certain cases for non executable files. Note passing absolute rather than relative names to cap_get_file() reduces the has_capability() overhead from around 33% to 30%. I.E. ls --color is now around 3% faster. * src/ls.c (struct fileinfo): Add a has_capability member. (print_color_indicator): Refactor to pass just a fileinfo pointer and a flag to say if we're dealing with a symlink target. (print_name_with_quoting): Likewise. (gobble_file): Set has_capability in the fileinfo struct. Also do a capability check even if executable coloring is disabled. Ditto for SETUID and SETUID coloring. Comment on how expensive has_capability() is. (print_long_format): Adjust to refactored print_name_with_quoting. (quote_name): Likewise. (print_file_name_and_frills): Likewise. * tests/ls/capability: Test the various false positive and negatives. * THANKS: Add reporter (Ivan Labath). * NEWS: Mention the fix.
68 lines
1.9 KiB
Bash
Executable File
68 lines
1.9 KiB
Bash
Executable File
#!/bin/sh
|
|
# Ensure "ls --color" properly colorizes file with capability.
|
|
|
|
# Copyright (C) 2008-2009 Free Software Foundation, Inc.
|
|
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
if test "$VERBOSE" = yes; then
|
|
set -x
|
|
ls --version
|
|
fi
|
|
|
|
. $srcdir/test-lib.sh
|
|
require_root_
|
|
|
|
grep '^#define HAVE_CAP 1$' $CONFIG_HEADER > /dev/null \
|
|
|| skip_test_ "configured without libcap support"
|
|
|
|
(setcap --help) 2>&1 |grep 'usage: setcap' > /dev/null \
|
|
|| skip_test_ "setcap utility not found"
|
|
|
|
# Don't let a different umask perturb the results.
|
|
umask 22
|
|
|
|
# We create 2 files of the same name as
|
|
# before coreutils 8.1 only the name rather than
|
|
# the full path was used to read the capabilities
|
|
# thus giving false positives and negatives.
|
|
mkdir test test/dir
|
|
cd test
|
|
touch cap_pos dir/cap_pos dir/cap_neg
|
|
for file in cap_pos dir/cap_neg; do
|
|
setcap 'cap_net_bind_service=ep' $file ||
|
|
skip_test_ "setcap doesn't work"
|
|
done
|
|
|
|
code='30;41'
|
|
# Note we explicitly disable "executable" coloring
|
|
# so that capability coloring is not dependent on it,
|
|
# as was the case before coreutils 8.1
|
|
for ex in '' ex=:; do
|
|
LS_COLORS="di=:${ex}ca=$code" \
|
|
ls --color=always cap_pos dir > out || fail=1
|
|
|
|
env printf "\
|
|
\e[0m\e[${code}mcap_pos\e[0m
|
|
|
|
dir:
|
|
\e[${code}mcap_neg\e[0m
|
|
cap_pos
|
|
\e[m" > out_ok || framework_failure
|
|
|
|
compare out out_ok || fail=1
|
|
done
|
|
|
|
Exit $fail
|