diff options
Diffstat (limited to 'tests/chown')
-rwxr-xr-x | tests/chown/basic.sh | 59 | ||||
-rwxr-xr-x | tests/chown/deref.sh | 38 | ||||
-rwxr-xr-x | tests/chown/preserve-root.sh | 66 | ||||
-rwxr-xr-x | tests/chown/separator.sh | 69 |
4 files changed, 232 insertions, 0 deletions
diff --git a/tests/chown/basic.sh b/tests/chown/basic.sh new file mode 100755 index 0000000..2db9ef7 --- /dev/null +++ b/tests/chown/basic.sh @@ -0,0 +1,59 @@ +#!/bin/sh +# make sure chown --from=... works + +# Copyright (C) 2001-2023 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 <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src +print_ver_ chown +require_root_ + +touch f || framework_failure_ + +chown -R --preserve-root 0:1 f + +# Make sure the owner and group are 0 and 1 respectively. +set _ $(ls -n f); shift; test "$3:$4" = 0:1 || fail=1 + +# Make sure the correct diagnostic is output +# Note we output a name even though an id was specified. +chown -v --from=42 43 f > out || fail=1 +printf "ownership of 'f' retained as $(id -nu)\n" > exp +compare exp out || fail=1 + +# Ensure diagnostics work for non existent files. +returns_ 1 chown -v 0 nf > out || fail=1 +printf "failed to change ownership of 'nf' to 0\n" > exp +compare exp out || fail=1 + +chown --from=0:1 2:010 f || fail=1 + +# And now they should be 2 and 10 respectively. +set _ $(ls -n f); shift; test "$3:$4" = 2:10 || fail=1 + +ln -s f slink +# Applying chown to a symlink with --no-dereference +# should change only the link. +chown --no-dereference 0:1 slink || fail=1 +# owner/group on the symlink should be set +set _ $(ls -n slink); shift; test "$3:$4" = 0:1 || fail=1 +# owner/group on the referent should remain unchanged +set _ $(ls -n f); shift; test "$3:$4" = 2:10 || fail=1 + +chown --no-dereference --from=0:1 2:010 slink || fail=1 +# owner/group on the symlink should be changed +set _ $(ls -n slink); shift; test "$3:$4" = 2:10 || fail=1 + +Exit $fail diff --git a/tests/chown/deref.sh b/tests/chown/deref.sh new file mode 100755 index 0000000..d669a7c --- /dev/null +++ b/tests/chown/deref.sh @@ -0,0 +1,38 @@ +#!/bin/sh +# For coreutils-5.2.1 and earlier, chown --dereference would skip +# symlinks having owner/group matching the specified owner/group. + +# Copyright (C) 2004-2023 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 <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src +print_ver_ chown + +ln -s no-such dangle || framework_failure_ + + +set _ $(ls -ldo dangle); shift; user=$3 + +# With 5.2.1 and earlier, this command would mistakenly succeed. +chown --dereference $user dangle 2> out1 && fail=1 +sed 's/: [^:]*$//' out1 > out + +cat <<\EOF > exp || framework_failure_ +chown: cannot dereference 'dangle' +EOF + +compare exp out || fail=1 + +Exit $fail diff --git a/tests/chown/preserve-root.sh b/tests/chown/preserve-root.sh new file mode 100755 index 0000000..4ef8662 --- /dev/null +++ b/tests/chown/preserve-root.sh @@ -0,0 +1,66 @@ +#!/bin/sh +# Verify that --preserve-root works. + +# Copyright (C) 2006-2023 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 <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src +print_ver_ chown +skip_if_root_ + +mkdir d && ln -s / d/slink-to-root + + +# Even if --preserve-root were to malfunction, allowing the chown or +# chgrp to traverse through "/", since we're running as non-root, +# they would be very unlikely to cause any changes. +chown -R --preserve-root 0 / > out 2>&1 && fail=1 +chgrp -R --preserve-root 0 / >> out 2>&1 && fail=1 + +# Here, if --preserve-root were to malfunction, chmod could make changes, +# but only to files owned and unreadable by the user running this test, +# and then, only to make them readable by owner. +chmod -R --preserve-root u+r / >> out 2>&1 && fail=1 + +# With -RHh, --preserve-root should trigger nothing, +# since the symlink in question is not a command line argument. +# Contrary to the above commands, these two should succeed. +echo '==== test -RHh' >> out || framework_failure_ +chown -RHh --preserve-root $(id -u) d >> out 2>&1 || fail=1 +chgrp -RHh --preserve-root $(id -g) d >> out 2>&1 || fail=1 + +# These must fail. +echo '==== test -RLh' >> out || framework_failure_ +chown -RLh --preserve-root $(id -u) d >> out 2>&1 && fail=1 +chgrp -RLh --preserve-root $(id -g) d >> out 2>&1 && fail=1 + +cat <<\EOF > exp || framework_failure_ +chown: it is dangerous to operate recursively on '/' +chown: use --no-preserve-root to override this failsafe +chgrp: it is dangerous to operate recursively on '/' +chgrp: use --no-preserve-root to override this failsafe +chmod: it is dangerous to operate recursively on '/' +chmod: use --no-preserve-root to override this failsafe +==== test -RHh +==== test -RLh +chown: it is dangerous to operate recursively on 'd/slink-to-root' (same as '/') +chown: use --no-preserve-root to override this failsafe +chgrp: it is dangerous to operate recursively on 'd/slink-to-root' (same as '/') +chgrp: use --no-preserve-root to override this failsafe +EOF + +compare exp out || fail=1 + +Exit $fail diff --git a/tests/chown/separator.sh b/tests/chown/separator.sh new file mode 100755 index 0000000..7901cf8 --- /dev/null +++ b/tests/chown/separator.sh @@ -0,0 +1,69 @@ +#!/bin/sh +# Make sure "chown USER:GROUP FILE" works, and similar tests with separators. + +# Copyright (C) 2004-2023 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 <https://www.gnu.org/licenses/>. + +. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src +print_ver_ chown + +id_u=$(id -u) || framework_failure_ +test -n "$id_u" || framework_failure_ + +id_un=$(id -un) || framework_failure_ +test -n "$id_un" || framework_failure_ + +id_g=$(id -g) || framework_failure_ +test -n "$id_g" || framework_failure_ + +id_gn=$(id -gn) || framework_failure_ +test -n "$id_gn" || framework_failure_ + +# Systems with both local and external groups with conflicting IDs, +# were seen to fail this test erroneously with EPERM errors. +test $(getent group | grep "^$id_gn:" | wc -l) = 1 || + skip_ "group '$id_gn' not unique: " \ + "$(getent group | grep "^$id_gn:" | tr '\n' ',')" + +# FreeBSD 6.x's getgrnam fails to look up a group name containing +# a space. On such a system, skip this test if the group name contains +# a byte not in the portable filename character set. +case $host_triplet in + *-freebsd6.*) + case $id_gn in + *[^a-zA-Z0-9._-]*) skip_ "invalid group name: $id_gn";; + esac;; + *) ;; +esac + + +chown '' . || fail=1 + +for u in $id_u "$id_un" ''; do + for g in $id_g "$id_gn" ''; do + case $u$g in + *.*) seps=':' ;; + *) seps=': .' ;; + esac + for sep in $seps; do + case $u$sep$g in + [0-9]*$sep) returns_ 1 chown "$u$sep$g" . 2>/dev/null || fail=1 ;; + *) chown "$u$sep$g" . || fail=1 ;; + esac + done + done +done + +Exit $fail |