forked from openzfs/zfs
-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ZTS: Add tests for DOS mode attributes
Create a new section of tests to run with acltype=off. For now the only test we have is for the DOS mode READONLY attribute on FreeBSD. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Ryan Moeller <ryan@iXsystems.com> Closes openzfs#11734
- Loading branch information
Ryan Moeller
committed
May 6, 2021
1 parent
4ae96ed
commit f635a48
Showing
9 changed files
with
359 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,4 +3,4 @@ dist_pkgdata_DATA = \ | |
acl.cfg \ | ||
acl_common.kshlib | ||
|
||
SUBDIRS = posix posix-sa | ||
SUBDIRS = off posix posix-sa |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
/dosmode_readonly_write |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
include $(top_srcdir)/config/Rules.am | ||
|
||
pkgdatadir = $(datadir)/@PACKAGE@/zfs-tests/tests/functional/acl/off | ||
|
||
dist_pkgdata_SCRIPTS = \ | ||
dosmode.ksh \ | ||
cleanup.ksh \ | ||
setup.ksh | ||
|
||
pkgexecdir = $(datadir)/@PACKAGE@/zfs-tests/tests/functional/acl/off | ||
|
||
if BUILD_FREEBSD | ||
pkgexec_PROGRAMS = dosmode_readonly_write | ||
dosmode_readonly_write_SOURCES = dosmode_readonly_write.c | ||
endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
#!/bin/ksh -p | ||
# | ||
# CDDL HEADER START | ||
# | ||
# The contents of this file are subject to the terms of the | ||
# Common Development and Distribution License (the "License"). | ||
# You may not use this file except in compliance with the License. | ||
# | ||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
# or http://www.opensolaris.org/os/licensing. | ||
# See the License for the specific language governing permissions | ||
# and limitations under the License. | ||
# | ||
# When distributing Covered Code, include this CDDL HEADER in each | ||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
# If applicable, add the following below this CDDL HEADER, with the | ||
# fields enclosed by brackets "[]" replaced with your own identifying | ||
# information: Portions Copyright [yyyy] [name of copyright owner] | ||
# | ||
# CDDL HEADER END | ||
# | ||
|
||
# | ||
# Copyright 2007 Sun Microsystems, Inc. All rights reserved. | ||
# Use is subject to license terms. | ||
# | ||
|
||
. $STF_SUITE/include/libtest.shlib | ||
. $STF_SUITE/tests/functional/acl/acl_common.kshlib | ||
|
||
cleanup_user_group | ||
|
||
default_cleanup |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,199 @@ | ||
#!/bin/ksh -p | ||
# | ||
# CDDL HEADER START | ||
# | ||
# The contents of this file are subject to the terms of the | ||
# Common Development and Distribution License (the "License"). | ||
# You may not use this file except in compliance with the License. | ||
# | ||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
# or http://www.opensolaris.org/os/licensing. | ||
# See the License for the specific language governing permissions | ||
# and limitations under the License. | ||
# | ||
# When distributing Covered Code, include this CDDL HEADER in each | ||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
# If applicable, add the following below this CDDL HEADER, with the | ||
# fields enclosed by brackets "[]" replaced with your own identifying | ||
# information: Portions Copyright [yyyy] [name of copyright owner] | ||
# | ||
# CDDL HEADER END | ||
# | ||
|
||
# | ||
# Portions Copyright 2021 iXsystems, Inc. | ||
# | ||
|
||
. $STF_SUITE/include/libtest.shlib | ||
. $STF_SUITE/tests/functional/acl/acl_common.kshlib | ||
|
||
# | ||
# DESCRIPTION: | ||
# Verify that DOS mode flags function correctly. | ||
# | ||
# These flags are not currently exposed on Linux, so the test is | ||
# only useful on FreeBSD. | ||
# | ||
# STRATEGY: | ||
# 1. ARCHIVE | ||
# 2. HIDDEN | ||
# 3. OFFLINE | ||
# 4. READONLY | ||
# 5. REPARSE | ||
# 6. SPARSE | ||
# 7. SYSTEM | ||
# | ||
|
||
verify_runnable "both" | ||
|
||
function cleanup | ||
{ | ||
rm -f $testfile | ||
} | ||
|
||
function hasflag | ||
{ | ||
typeset flag=$1 | ||
typeset path=$2 | ||
|
||
ls -lo $path | awk '{ gsub(",", "\n", $5); print $5 }' | grep -qxF $flag | ||
} | ||
|
||
log_assert "Verify DOS mode flags function correctly" | ||
log_onexit cleanup | ||
|
||
tests_base=$STF_SUITE/tests/functional/acl/off | ||
testfile=$TESTDIR/testfile | ||
owner=$ZFS_ACL_STAFF1 | ||
other=$ZFS_ACL_STAFF2 | ||
|
||
# | ||
# ARCHIVE | ||
# | ||
# This flag is set by ZFS when a file has been updated to indicate that | ||
# the file needs to be archived. | ||
# | ||
log_must touch $testfile | ||
log_must hasflag uarch $testfile | ||
log_must chflags nouarch $testfile | ||
log_must hasflag - $testfile | ||
log_must touch $testfile | ||
log_must hasflag uarch $testfile | ||
log_must rm $testfile | ||
log_must user_run $owner touch $testfile | ||
log_must hasflag uarch $testfile | ||
log_must user_run $owner chflags nouarch $testfile | ||
log_mustnot user_run $other chflags uarch $testfile | ||
log_must hasflag - $testfile | ||
log_must user_run $owner touch $testfile | ||
log_mustnot user_run $other chflags nouarch $testfile | ||
log_must hasflag uarch $testfile | ||
log_must user_run $owner rm $testfile | ||
|
||
# | ||
# HIDDEN | ||
# | ||
log_must touch $testfile | ||
log_must chflags hidden $testfile | ||
log_must hasflag hidden $testfile | ||
log_must chflags 0 $testfile | ||
log_must hasflag - $testfile | ||
log_must rm $testfile | ||
log_must user_run $owner touch $testfile | ||
log_must user_run $owner chflags hidden $testfile | ||
log_mustnot user_run $other chflags nohidden $testfile | ||
log_must hasflag hidden $testfile | ||
log_must user_run $owner chflags 0 $testfile | ||
log_mustnot user_run $other chflags hidden $testfile | ||
log_must hasflag - $testfile | ||
log_must user_run $owner rm $testfile | ||
|
||
|
||
# | ||
# OFFLINE | ||
# | ||
log_must touch $testfile | ||
log_must chflags offline $testfile | ||
log_must hasflag offline $testfile | ||
log_must chflags 0 $testfile | ||
log_must hasflag - $testfile | ||
log_must rm $testfile | ||
log_must user_run $owner touch $testfile | ||
log_must user_run $owner chflags offline $testfile | ||
log_mustnot user_run $other chflags nooffline $testfile | ||
log_must hasflag offline $testfile | ||
log_must user_run $owner chflags 0 $testfile | ||
log_mustnot user_run $other chflags offline $testfile | ||
log_must hasflag - $testfile | ||
log_must user_run $owner rm $testfile | ||
|
||
# | ||
# READONLY | ||
# | ||
# This flag prevents users from writing or appending to the file, | ||
# but root is always allowed the operation. | ||
# | ||
log_must touch $testfile | ||
log_must chflags rdonly $testfile | ||
log_must hasflag rdonly $testfile | ||
log_must eval "echo 'root write allowed' >> $testfile" | ||
log_must cat $testfile | ||
log_must chflags 0 $testfile | ||
log_must hasflag - $tesfile | ||
log_must rm $testfile | ||
# It is required to still be able to write to an fd that was opened RW before | ||
# READONLY is set. We have a special test program for that. | ||
log_must user_run $owner touch $testfile | ||
log_mustnot user_run $other chflags rdonly $testfile | ||
log_must user_run $owner $tests_base/dosmode_readonly_write $testfile | ||
log_mustnot user_run $other chflags nordonly $testfile | ||
log_must hasflag rdonly $testfile | ||
log_mustnot user_run $owner "echo 'user write forbidden' >> $testfile" | ||
log_must eval "echo 'root write allowed' >> $testfile" | ||
# We are still allowed to read and remove the file when READONLY is set. | ||
log_must user_run $owner cat $testfile | ||
log_must user_run $owner rm $testfile | ||
|
||
# | ||
# REPARSE | ||
# | ||
# FIXME: does not work, not sure if broken or testing wrong | ||
# | ||
|
||
# | ||
# SPARSE | ||
# | ||
log_must truncate -s 1m $testfile | ||
log_must chflags sparse $testfile | ||
log_must hasflag sparse $testfile | ||
log_must chflags 0 $testfile | ||
log_must hasflag - $testfile | ||
log_must rm $testfile | ||
log_must user_run $owner truncate -s 1m $testfile | ||
log_must user_run $owner chflags sparse $testfile | ||
log_mustnot user_run $other chflags nosparse $testfile | ||
log_must hasflag sparse $testfile | ||
log_must user_run $owner chflags 0 $testfile | ||
log_mustnot user_run $other chflags sparse $testfile | ||
log_must hasflag - $testfile | ||
log_must user_run $owner rm $testfile | ||
|
||
# | ||
# SYSTEM | ||
# | ||
log_must touch $testfile | ||
log_must chflags system $testfile | ||
log_must hasflag system $testfile | ||
log_must chflags 0 $testfile | ||
log_must hasflag - $testfile | ||
log_must rm $testfile | ||
log_must user_run $owner touch $testfile | ||
log_must user_run $owner chflags system $testfile | ||
log_mustnot user_run $other chflags nosystem $testfile | ||
log_must hasflag system $testfile | ||
log_must user_run $owner chflags 0 $testfile | ||
log_mustnot user_run $other chflags system $testfile | ||
log_must hasflag - $testfile | ||
log_must user_run $owner rm $testfile | ||
|
||
log_pass "DOS mode flags function correctly" |
61 changes: 61 additions & 0 deletions
61
tests/zfs-tests/tests/functional/acl/off/dosmode_readonly_write.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
/* | ||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD | ||
* | ||
* Copyright (c) 2021 iXsystems, Inc. | ||
* | ||
* Redistribution and use in source and binary forms, with or without | ||
* modification, are permitted provided that the following conditions | ||
* are met: | ||
* 1. Redistributions of source code must retain the above copyright | ||
* notice, this list of conditions and the following disclaimer. | ||
* 2. Redistributions in binary form must reproduce the above copyright | ||
* notice, this list of conditions and the following disclaimer in the | ||
* documentation and/or other materials provided with the distribution. | ||
* | ||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | ||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | ||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||
* SUCH DAMAGE. | ||
* | ||
* Test for correct behavior of DOS mode READONLY flag on a file. | ||
* We should be able to open a file RW, set READONLY, and still write to the fd. | ||
*/ | ||
|
||
#include <sys/stat.h> | ||
#include <err.h> | ||
#include <errno.h> | ||
#include <fcntl.h> | ||
#include <stdio.h> | ||
#include <string.h> | ||
#include <unistd.h> | ||
|
||
int | ||
main(int argc, const char *argv[]) | ||
{ | ||
const char *buf = "We should be allowed to write this to the fd.\n"; | ||
const char *path; | ||
int fd; | ||
|
||
if (argc != 2) { | ||
fprintf(stderr, "usage: %s PATH\n", argv[0]); | ||
return (EXIT_FAILURE); | ||
} | ||
path = argv[1]; | ||
fd = open(path, O_CREAT|O_RDWR, 0777); | ||
if (fd == -1) | ||
err(EXIT_FAILURE, "%s: open failed", path); | ||
if (chflags(path, UF_READONLY) == -1) | ||
err(EXIT_FAILURE, "%s: chflags failed", path); | ||
if (write(fd, buf, strlen(buf)) == -1) | ||
err(EXIT_FAILURE, "%s: write failed", path); | ||
if (close(fd) == -1) | ||
err(EXIT_FAILURE, "%s: close failed", path); | ||
return (EXIT_SUCCESS); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
#!/bin/ksh -p | ||
# | ||
# CDDL HEADER START | ||
# | ||
# The contents of this file are subject to the terms of the | ||
# Common Development and Distribution License (the "License"). | ||
# You may not use this file except in compliance with the License. | ||
# | ||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
# or http://www.opensolaris.org/os/licensing. | ||
# See the License for the specific language governing permissions | ||
# and limitations under the License. | ||
# | ||
# When distributing Covered Code, include this CDDL HEADER in each | ||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
# If applicable, add the following below this CDDL HEADER, with the | ||
# fields enclosed by brackets "[]" replaced with your own identifying | ||
# information: Portions Copyright [yyyy] [name of copyright owner] | ||
# | ||
# CDDL HEADER END | ||
# | ||
|
||
# | ||
# Portions Copyright (c) 2021 iXsystems, Inc. | ||
# | ||
|
||
. $STF_SUITE/include/libtest.shlib | ||
. $STF_SUITE/tests/functional/acl/acl_common.kshlib | ||
|
||
DISK=${DISKS%% *} | ||
|
||
cleanup_user_group | ||
|
||
# Create staff group and add users to it | ||
log_must add_group $ZFS_ACL_STAFF_GROUP | ||
log_must add_user $ZFS_ACL_STAFF_GROUP $ZFS_ACL_STAFF1 | ||
log_must add_user $ZFS_ACL_STAFF_GROUP $ZFS_ACL_STAFF2 | ||
|
||
default_setup_noexit $DISK | ||
|
||
log_must zfs set acltype=off $TESTPOOL/$TESTFS | ||
log_must chmod 0777 $TESTDIR | ||
|
||
log_pass |