diff options
Diffstat (limited to 'tests/mkdir')
-rwxr-xr-x | tests/mkdir/p-1.sh | 25 | ||||
-rwxr-xr-x | tests/mkdir/p-2.sh | 25 | ||||
-rwxr-xr-x | tests/mkdir/p-3.sh | 52 | ||||
-rwxr-xr-x | tests/mkdir/p-acl.sh | 35 | ||||
-rwxr-xr-x | tests/mkdir/p-slashdot.sh | 29 | ||||
-rwxr-xr-x | tests/mkdir/p-thru-slink.sh | 27 | ||||
-rwxr-xr-x | tests/mkdir/p-v.sh | 32 | ||||
-rwxr-xr-x | tests/mkdir/parents.sh | 52 | ||||
-rwxr-xr-x | tests/mkdir/perm.sh | 85 | ||||
-rwxr-xr-x | tests/mkdir/restorecon.sh | 72 | ||||
-rwxr-xr-x | tests/mkdir/selinux.sh | 56 | ||||
-rwxr-xr-x | tests/mkdir/smack-no-root.sh | 39 | ||||
-rwxr-xr-x | tests/mkdir/smack-root.sh | 36 | ||||
-rwxr-xr-x | tests/mkdir/special-1.sh | 51 | ||||
-rwxr-xr-x | tests/mkdir/t-slash.sh | 31 | ||||
-rwxr-xr-x | tests/mkdir/writable-under-readonly.sh | 52 |
16 files changed, 699 insertions, 0 deletions
diff --git a/tests/mkdir/p-1.sh b/tests/mkdir/p-1.sh new file mode 100755 index 0000000..e9be94e --- /dev/null +++ b/tests/mkdir/p-1.sh @@ -0,0 +1,25 @@ +#!/bin/sh +# Test "mkdir -p". + +# Copyright (C) 1997-2022 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_ mkdir + +mkdir --parents "$(pwd)/t" || fail=1 +test -d t || fail=1 + +Exit $fail diff --git a/tests/mkdir/p-2.sh b/tests/mkdir/p-2.sh new file mode 100755 index 0000000..2f641a8 --- /dev/null +++ b/tests/mkdir/p-2.sh @@ -0,0 +1,25 @@ +#!/bin/sh +# Just like p-1, but with an absolute path. + +# Copyright (C) 1997-2022 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_ mkdir + +mkdir --parents "$(pwd)/t/u" || fail=1 +test -d t/u || fail=1 + +Exit $fail diff --git a/tests/mkdir/p-3.sh b/tests/mkdir/p-3.sh new file mode 100755 index 0000000..c31515a --- /dev/null +++ b/tests/mkdir/p-3.sh @@ -0,0 +1,52 @@ +#!/bin/sh +# Ensure that mkdir-p.c's fail-to-return-to-initial-working-directory +# causes immediate failure. Also, ensure that we don't create +# subsequent, relative command-line arguments in the wrong place. + +# Copyright (C) 2005-2022 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_ mkdir +skip_if_root_ + +mkdir no-access || framework_failure_ +mkdir no-acce2s || framework_failure_ +mkdir -p no-acce3s/d || framework_failure_ + +p=$(pwd) +(cd no-access && chmod 0 . && mkdir -p "$p/a/b" u/v) 2> /dev/null +test $? -eq 1 || fail=1 +test -d "$p/a/b" || fail=1 + +# Same as above, but with a following *absolute* name, it should succeed +(cd no-acce2s && chmod 0 . && mkdir -p "$p/b/b" "$p/z") || fail=1 +test -d "$p/b/b" && test -d "$p/z" || fail=1 + +# Same as above, but a trailing relative name in an unreadable directory +# whose parent is inaccessible. coreutils 5.97 fails this test. +# Perform this test only if "." is on a local file system. +# Otherwise, it would fail e.g., on an NFS-mounted file system. +if is_local_dir_ .; then + (cd no-acce3s/d && chmod a-r . && chmod a-rx .. && + mkdir -p a/b "$p/b/c" d/e && test -d a/b && test -d d/e) || fail=1 + test -d "$p/b/c" || fail=1 +fi + +b=$(ls "$p/a" | tr -d '\n') +# With coreutils-5.3.0, this would fail with $b=bu. +test "x$b" = xb || fail=1 + +Exit $fail diff --git a/tests/mkdir/p-acl.sh b/tests/mkdir/p-acl.sh new file mode 100755 index 0000000..59ddc60 --- /dev/null +++ b/tests/mkdir/p-acl.sh @@ -0,0 +1,35 @@ +#!/bin/sh +# Test "mkdir -p" with default ACLs. + +# Copyright (C) 1997-2022 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_ mkdir + +require_setfacl_ + +mkdir d || framework_failure_ +setfacl -d -m group::rwx d || framework_failure_ +umask 077 + +mkdir --parents d/e || fail=1 +ls_l=$(ls -ld d/e) || fail=1 +case $ls_l in + d???rw[sx]*) ;; + *) fail=1 ;; +esac + +Exit $fail diff --git a/tests/mkdir/p-slashdot.sh b/tests/mkdir/p-slashdot.sh new file mode 100755 index 0000000..1bd055e --- /dev/null +++ b/tests/mkdir/p-slashdot.sh @@ -0,0 +1,29 @@ +#!/bin/sh +# Ensure that mkdir -p works with arguments specified with a trailing "/.". + +# Copyright (C) 2005-2022 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_ mkdir + + +mkdir -p d1/. || fail=1 +test -d d1 || fail=1 + +mkdir -p d2/.. || fail=1 +test -d d2 || fail=1 + +Exit $fail diff --git a/tests/mkdir/p-thru-slink.sh b/tests/mkdir/p-thru-slink.sh new file mode 100755 index 0000000..7948ef4 --- /dev/null +++ b/tests/mkdir/p-thru-slink.sh @@ -0,0 +1,27 @@ +#!/bin/sh +# Ensure that mkdir -p foo/bar works when foo is a symbolic link to a directory + +# Copyright (C) 2005-2022 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_ mkdir + +ln -s . slink || framework_failure_ + +mkdir -p slink/x || fail=1 +test -d x || fail=1 + +Exit $fail diff --git a/tests/mkdir/p-v.sh b/tests/mkdir/p-v.sh new file mode 100755 index 0000000..c9c7511 --- /dev/null +++ b/tests/mkdir/p-v.sh @@ -0,0 +1,32 @@ +#!/bin/sh +# Test mkdir -pv. + +# Copyright (C) 2006-2022 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_ mkdir + +mkdir -pv foo/a/b/c/d >out || fail=1 + +compare - out <<\EOF || fail=1 +mkdir: created directory 'foo' +mkdir: created directory 'foo/a' +mkdir: created directory 'foo/a/b' +mkdir: created directory 'foo/a/b/c' +mkdir: created directory 'foo/a/b/c/d' +EOF + +Exit $fail diff --git a/tests/mkdir/parents.sh b/tests/mkdir/parents.sh new file mode 100755 index 0000000..7debfbb --- /dev/null +++ b/tests/mkdir/parents.sh @@ -0,0 +1,52 @@ +#!/bin/sh +# make sure mkdir's -p options works properly + +# Copyright (C) 2000-2022 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_ mkdir +skip_if_setgid_ +require_no_default_acl_ . + +mkdir -m 700 e-dir || framework_failure_ + + +# Make sure 'mkdir -p existing-dir' succeeds +# and that 'mkdir existing-dir' fails. +mkdir -p e-dir || fail=1 +returns_ 1 mkdir e-dir > /dev/null 2>&1 || fail=1 + +# Create an existing directory. +umask 077 +mode_str=drwxr-x-wx +mode_arg=$(rwx_to_mode_ $mode_str) +mkdir -m $mode_arg a || fail=1 + +# this 'mkdir -p ...' shouldn't change perms of existing dir 'a'. +d_mode_str=drwx-w--wx +d_mode_arg=$(rwx_to_mode_ $d_mode_str) +mkdir -p -m $d_mode_arg a/b/c/d + +# Make sure the permissions of 'a' haven't been changed. +p=$(ls -ld a|cut -b-10); case $p in $mode_str);; *) fail=1;; esac +# 'b's and 'c's should reflect the umask +p=$(ls -ld a/b|cut -b-10); case $p in drwx------);; *) fail=1;; esac +p=$(ls -ld a/b/c|cut -b-10); case $p in drwx------);; *) fail=1;; esac + +# 'd's perms are determined by the -m argument. +p=$(ls -ld a/b/c/d|cut -b-10); case $p in $d_mode_str);; *) fail=1;; esac + +Exit $fail diff --git a/tests/mkdir/perm.sh b/tests/mkdir/perm.sh new file mode 100755 index 0000000..3a904a9 --- /dev/null +++ b/tests/mkdir/perm.sh @@ -0,0 +1,85 @@ +#!/bin/sh +# Verify that mkdir's '-m MODE' option works properly +# with various umask settings. + +# Copyright (C) 2000-2022 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_ mkdir +skip_if_setgid_ +require_no_default_acl_ . + +working_umask_or_skip_ + + +# parent parent/dir +# umask -m option resulting perm resulting perm +tests=' + 000 : empty : drwxrwxrwx : drwxrwxrwx : + 000 : -m 016 : drwxrwxrwx : d-----xrw- : + 077 : empty : drwx------ : drwx------ : + 050 : empty : drwx-w-rwx : drwx-w-rwx : + 050 : -m 312 : drwx-w-rwx : d-wx--x-w- : + 160 : empty : drwx--xrwx : drw---xrwx : + 160 : -m 743 : drwx--xrwx : drwxr---wx : + 022 : -m o-w : drwxr-xr-x : drwxrwxr-x : + 027 : -m =+x : drwxr-x--- : d--x--x--- : + 027 : -m =+X : drwxr-x--- : d--x--x--- : + - : - : last : last : + ' +colon_tests=$(echo $tests | sed 's/^ *//; s/ *: */:/g') + +for p in empty -p; do + test _$p = _empty && p= + + old_IFS=$IFS + IFS=':' + set $colon_tests + IFS=$old_IFS + + while :; do + test "$VERBOSE" = yes && set -x + umask=$1 mode=$2 parent_perms=$3 sub_perms=$4 + test "_$mode" = _empty && mode= + test $sub_perms = last && break + # echo p=$p umask=$1 mode=$2 parent_perms=$3 sub_perms=$4 + shift; shift; shift; shift + umask $umask + + # If we're not using -p, then create the parent manually, + # and adjust expectations accordingly. + test x$p = x && + { + mkdir -m =,u=rwx parent || fail=1 + parent_perms=drwx------ + } + + mkdir $p $mode parent/sub || fail=1 + + perms=$(stat --printf %A parent) + test "$parent_perms" = "$perms" \ + || { fail=1; echo parent: expected $parent_perms, got $perms; } + + perms=$(stat --printf %A parent/sub) + test "$sub_perms" = "$perms" \ + || { fail=1; echo parent/sub: expected $sub_perms, got $perms; } + + chmod -R u+rwx parent + rm -rf parent || fail=1 + done +done + +Exit $fail diff --git a/tests/mkdir/restorecon.sh b/tests/mkdir/restorecon.sh new file mode 100755 index 0000000..dfffce8 --- /dev/null +++ b/tests/mkdir/restorecon.sh @@ -0,0 +1,72 @@ +#!/bin/sh +# test mkdir, mknod, mkfifo -Z + +# Copyright (C) 2013-2022 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_ mkdir mknod mkfifo +require_selinux_ + +mkdir subdir || framework_failure_ +ctx='root:object_r:tmp_t' +mls_enabled_ && ctx="$ctx:s0" +chcon "$ctx" subdir || skip_ "Failed to set context: $ctx" +cd subdir + +# --- mkdir -Z --- +# Since in a tmp_t dir, dirs can be created as user_tmp_t ... +mkdir standard || framework_failure_ +mkdir restored || framework_failure_ +if restorecon restored 2>/dev/null; then + # ... but when restored can be set to user_home_t + # So ensure the type for these mkdir -Z cases matches + # the directory type as set by restorecon. + mkdir -Z single || fail=1 + # Run these as separate processes in case global context + # set for an arg, impacts on another arg + # TODO: Have the defaultcon() vary over these directories + for dir in single_p single_p/existing multi/ple; do + mkdir -Zp "$dir" || fail=1 + done + restored_type=$(get_selinux_type 'restored') + test "$(get_selinux_type 'single')" = "$restored_type" || fail=1 + test "$(get_selinux_type 'single_p')" = "$restored_type" || fail=1 + test "$(get_selinux_type 'single_p/existing')" = "$restored_type" || fail=1 + test "$(get_selinux_type 'multi')" = "$restored_type" || fail=1 + test "$(get_selinux_type 'multi/ple')" = "$restored_type" || fail=1 +fi +if test "$fail" = '1'; then + ls -UZd standard restored + ls -UZd single single_p single_p/existing multi multi/ple +fi + +# --- mknod -Z and mkfifo -Z --- +# Assume if selinux present that we can create fifos +for cmd_w_arg in 'mknod' 'mkfifo'; do + # In OpenBSD's /bin/sh, mknod is a shell built-in. + # Running via "env" ensures we run our program and not the built-in. + basename="$cmd_w_arg" + test "$basename" = 'mknod' && nt='p' || nt='' + env -- $cmd_w_arg $basename $nt || fail=1 + env -- $cmd_w_arg ${basename}_restore $nt || fail=1 + if restorecon ${basename}_restore 2>/dev/null; then + env -- $cmd_w_arg -Z ${basename}_Z $nt || fail=1 + restored_type=$(get_selinux_type "${basename}_restore") + test "$(get_selinux_type ${basename}_Z)" = "$restored_type" || fail=1 + fi +done + +Exit $fail diff --git a/tests/mkdir/selinux.sh b/tests/mkdir/selinux.sh new file mode 100755 index 0000000..8958edf --- /dev/null +++ b/tests/mkdir/selinux.sh @@ -0,0 +1,56 @@ +#!/bin/sh +# ensure that an invalid context doesn't cause a segfault + +# Copyright (C) 2008-2022 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_ mkdir mkfifo mknod + +# Note: on an SELinux/enforcing system running mcstransd older than +# mcstrans-0.2.8-1.fc9, the following commands may mistakenly exit +# successfully, in spite of the invalid context string. +require_selinux_enforcing_ + +c=invalid-selinux-context +msg="failed to set default file creation context to '$c':" + +# Test each of mkdir, mknod, mkfifo with "-Z invalid-context". + +for cmd_w_arg in 'mkdir dir' 'mknod b p' 'mkfifo f'; do + # In OpenBSD's /bin/sh, mknod is a shell built-in. + # Running via "env" ensures we run our program and not the built-in. + env -- $cmd_w_arg --context=$c 2> out && fail=1 + set $cmd_w_arg; cmd=$1 + echo "$cmd: $msg" > exp || framework_failure_ + + # Some systems fail with ENOTSUP, EINVAL, ENOENT, or even + # "Unknown system error", or "Function not implemented". + # For AIX 5.3: "Unsupported attribute value" + # For HP-UX 11.23: Unknown error (252) + sed \ + -e 's/ Not supported$//' \ + -e 's/ Invalid argument$//' \ + -e 's/ Unknown system error$//' \ + -e 's/ Operation not supported$//' \ + -e 's/ Function not implemented$//' \ + -e 's/ Unsupported attribute value$//' \ + -e 's/ Unknown error .*$//' \ + -e 's/ No such file or directory$//' out > k || framework_failure_ + mv k out || fail=1 + compare exp out || fail=1 +done + +Exit $fail diff --git a/tests/mkdir/smack-no-root.sh b/tests/mkdir/smack-no-root.sh new file mode 100755 index 0000000..4b4eb88 --- /dev/null +++ b/tests/mkdir/smack-no-root.sh @@ -0,0 +1,39 @@ +#!/bin/sh +# SMACK test for the mkdir,mknod, mkfifo commands. +# Derived from tests/mkdir/selinux.sh. +# Ensure that an unsettable SMACK label doesn't cause a segfault. + +# Copyright (C) 2014-2022 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_ mkdir mkfifo mknod + +require_smack_ + +c=arbitrary-smack-label +msg="failed to set default file creation context to '$c':" + +for cmd in 'mkdir dir' 'mknod b p' 'mkfifo f'; do + $cmd --context="$c" 2> out && fail=1 + set $cmd + echo "$1: $msg" > exp || framework_failure_ + + sed -e 's/ Operation not permitted$//' out > k || framework_failure_ + mv k out || fail=1 + compare exp out || fail=1 +done + +Exit $fail diff --git a/tests/mkdir/smack-root.sh b/tests/mkdir/smack-root.sh new file mode 100755 index 0000000..cb13b88 --- /dev/null +++ b/tests/mkdir/smack-root.sh @@ -0,0 +1,36 @@ +#!/bin/sh +# SMACK test for the mkdir,mknod, mkfifo commands. +# Derived from tests/mkdir/selinux.sh. +# Ensure that SMACK label gets set. + +# Copyright (C) 2014-2022 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_ mkdir mkfifo mknod + +require_smack_ +require_root_ + +c=arbitrary-smack-label + +for cmd in 'mkdir dir' 'mknod b p' 'mkfifo f'; do + $cmd --context="$c" || { fail=1; continue; } + set $cmd + ls -dZ $2 > out || fail=1 + test "$(cut -f1 -d' ' out)" = "$c" || { cat out; fail=1; } +done + +Exit $fail diff --git a/tests/mkdir/special-1.sh b/tests/mkdir/special-1.sh new file mode 100755 index 0000000..116bf3f --- /dev/null +++ b/tests/mkdir/special-1.sh @@ -0,0 +1,51 @@ +#!/bin/sh +# verify that mkdir honors special bits in MODE + +# Copyright (C) 2000-2022 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_ mkdir + +set_mode_string=u=rwx,g=rx,o=w,-s,+t +output_mode_string=drwxr-x-wT + +tmp=t +mkdir -m$set_mode_string $tmp || fail=1 + +test -d $tmp || fail=1 +mode=$(ls -ld $tmp|cut -b-10) +case "$mode" in + $output_mode_string) ;; + *) fail=1 ;; +esac + +rmdir $tmp || fail=1 +tmp2=$tmp/sub + +# This should fail. +returns_ 1 mkdir -m$set_mode_string $tmp2 2> /dev/null || fail=1 + +# Now test the --parents option. +mkdir --parents -m$set_mode_string $tmp2 || fail=1 + +test -d $tmp2 || fail=1 +mode=$(ls -ld $tmp2|cut -b-10) +case "$mode" in + $output_mode_string) ;; + *) fail=1 ;; +esac + +Exit $fail diff --git a/tests/mkdir/t-slash.sh b/tests/mkdir/t-slash.sh new file mode 100755 index 0000000..3e06261 --- /dev/null +++ b/tests/mkdir/t-slash.sh @@ -0,0 +1,31 @@ +#!/bin/sh +# Ensure that mkdir works with arguments specified with and without +# a trailing slash. + +# Copyright (C) 2000-2022 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_ mkdir + + +mkdir -p dir/ || fail=1 +test -d dir || fail=1 + +# This failed on NetBSD for fileutils-4.0.33. +mkdir d2/ || fail=1 +test -d d2 || fail=1 + +Exit $fail diff --git a/tests/mkdir/writable-under-readonly.sh b/tests/mkdir/writable-under-readonly.sh new file mode 100755 index 0000000..c5422df --- /dev/null +++ b/tests/mkdir/writable-under-readonly.sh @@ -0,0 +1,52 @@ +#!/bin/sh +# FIXME: convert this to a root-only test. + +# Copyright (C) 2005-2022 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/>. + +# Test for the 2005-10-13 patch to lib/mkdir-p.c that fixed this sort +# of bug in mkdir: +# +# "mkdir -p /a/b/c" no longer fails merely because a leading prefix +# directory (e.g., /a or /a/b) exists on a read-only file system. +# +# Demonstrate the problem, as root: + +. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src +print_ver_ mkdir +require_root_ + +# FIXME: for now, skip it unconditionally +skip_ temporarily disabled + +# FIXME: define cleanup_ to do the umount + +# FIXME: use mktemp +cd /tmp \ + && dd if=/dev/zero of=1 bs=8192 count=50 \ + && dd if=/dev/zero of=2 bs=8192 count=50 \ + && mkdir -p mnt-ro && mkfs -t ext2 1 && mkfs -t ext2 2 \ + && mount -o loop=/dev/loop3 1 mnt-ro \ + && mkdir -p mnt-ro/rw \ + && mount -o remount,ro mnt-ro \ + && mount -o loop=/dev/loop4 2 mnt-ro/rw + +mkdir -p mnt-ro/rw/sub || fail=1 + +# To clean up +umount /tmp/2 +umount /tmp/1 + +Exit $fail |