| #!/bin/sh |
| |
|
|
| |
|
|
| |
| |
| |
| |
|
|
| |
| |
| |
| |
|
|
| |
| |
|
|
| . "${srcdir=.}/tests/init.sh"; path_prepend_ ./src |
| print_ver_ cp |
|
|
| require_perl_ |
| require_root_ |
|
|
| |
| working_umask_or_skip_ |
|
|
| |
| |
| primary_group_num=$(id -g) |
|
|
| create() { |
| echo "$1" > "$1" || exit 1 |
| chown "+$2:+$3" "$1" || exit 1 |
| } |
|
|
| t0() { |
| f=$1; shift |
| u=$1; shift |
| g=$1; shift |
| rm -f b || exit 1 |
| "$@" "$f" b || exit 1 |
| s=$(stat -c '%u %g' b) |
| if test "x$s" != "x$u $g"; then |
| |
| |
| if test "x$s" = "x$u $primary_group_num"; then |
| : |
| else |
| echo "$0: $* $f b: $u $g != $s" 1>&2 |
| Exit 1 |
| fi |
| fi |
| } |
|
|
| nameless_uid=$($PERL -le ' |
| foreach my $i (1000..16*1024-1) |
| { |
| getpwuid $i or (print $i), exit |
| } |
| ') |
| nameless_gid1=$($PERL -le ' |
| foreach my $i (1000..16*1024) |
| { |
| getgrgid $i or (print $i), exit |
| } |
| ') |
| nameless_gid2=$($PERL -le ' |
| foreach my $i ('"$nameless_gid1"'+1..16*1024) |
| { |
| getgrgid $i or (print $i), exit |
| } |
| ') |
|
|
| if test -z "$nameless_uid" \ |
| || test -z "$nameless_gid1" \ |
| || test -z "$nameless_gid2"; then |
| skip_ "couldn't find a nameless UID or GID" |
| fi |
|
|
| chown "+$nameless_uid:+0" . |
|
|
| create a0 0 0 |
| create b0 "$nameless_uid" "$nameless_gid1" |
| create b1 "$nameless_uid" "$nameless_gid2" |
| create c0 0 "$nameless_gid1" |
| create c1 0 "$nameless_gid2" |
|
|
| t0 a0 0 0 cp |
| t0 b0 0 0 cp |
| t0 b1 0 0 cp |
| t0 c0 0 0 cp |
| t0 c1 0 0 cp |
|
|
| t0 a0 0 0 cp -p |
| t0 b0 "$nameless_uid" "$nameless_gid1" cp -p |
| t0 b1 "$nameless_uid" "$nameless_gid2" cp -p |
| t0 c0 0 "$nameless_gid1" cp -p |
| t0 c1 0 "$nameless_gid2" cp -p |
|
|
| |
| |
| |
| |
| tmp_path= |
| cleanup_() { rm -rf "$tmp_path"; } |
|
|
| |
| |
| |
| test -d /tmp && TMPDIR=/tmp |
| tmp_path=$(mktemp -d) || fail_ "failed to create temporary directory" |
| if test -x "$abs_path_dir_/coreutils" && |
| { test -L "$abs_path_dir_/cp" || |
| test $(wc -l < "$abs_path_dir_/cp") = 1; } then |
| |
| cp "$abs_path_dir_/coreutils" "$tmp_path/cp" || framework_failure_ |
| else |
| cp "$abs_path_dir_/cp" "$tmp_path" |
| fi |
| chmod -R a+rx "$tmp_path" |
|
|
| t1() { |
| f=$1; shift |
| u=$1; shift |
| g=$1; shift |
| t0 "$f" "$u" "$g" \ |
| chroot --skip-chdir \ |
| --user=+$nameless_uid:+$nameless_gid1 \ |
| --groups="+$nameless_gid1,+$nameless_gid2" \ |
| / env PATH="$tmp_path" "$@" |
| } |
|
|
| t1 a0 "$nameless_uid" "$nameless_gid1" cp |
| t1 b0 "$nameless_uid" "$nameless_gid1" cp |
| t1 b1 "$nameless_uid" "$nameless_gid1" cp |
| t1 c0 "$nameless_uid" "$nameless_gid1" cp |
| t1 c1 "$nameless_uid" "$nameless_gid1" cp |
|
|
| t1 a0 "$nameless_uid" "$nameless_gid1" cp -p |
| t1 b0 "$nameless_uid" "$nameless_gid1" cp -p |
| t1 b1 "$nameless_uid" "$nameless_gid2" cp -p |
| t1 c0 "$nameless_uid" "$nameless_gid1" cp -p |
| t1 c1 "$nameless_uid" "$nameless_gid2" cp -p |
|
|
| Exit $fail |
|
|