diff options
Diffstat (limited to 'tools')
83 files changed, 2673 insertions, 1051 deletions
diff --git a/tools/boot/universe.sh b/tools/boot/universe.sh index e97858ff2bcb..80a9cc0b90ff 100755 --- a/tools/boot/universe.sh +++ b/tools/boot/universe.sh @@ -95,11 +95,11 @@ for i in \ dobuild $ta _.boot.${ta}.no_zfs.log "MK_LOADER_ZFS=no" done -# Build w/ LOADER_BIOS_TEXTONLY +# Build w/o LOADER_BIOS_TEXTONLY for i in \ amd64/amd64 \ i386/i386 \ ; do ta=${i##*/} - dobuild $ta _.boot.${ta}.no_zfs.log "MK_LOADER_BIOS_TEXTONLY=yes" + dobuild $ta _.boot.${ta}.no_zfs.log "MK_LOADER_BIOS_TEXTONLY=no" done diff --git a/tools/build/Makefile b/tools/build/Makefile index 3c4e07e3cfc2..fdec5f11311d 100644 --- a/tools/build/Makefile +++ b/tools/build/Makefile @@ -85,6 +85,10 @@ INCS+= stdlib.h SRCS+= reallocarray.c .endif +.if !exists(${HOST_INCLUDE_ROOT}/stdckdint.h) +INCS+= stdckdint.h +.endif + .if exists(${HOST_INCLUDE_ROOT}/sys/stat.h) _WITH_UTIMENS!= grep -c utimensat ${HOST_INCLUDE_ROOT}/sys/stat.h || true .else @@ -497,6 +501,7 @@ INSTALLDIR_LIST= \ usr/include/casper \ usr/include/openssl \ usr/include/private/ucl \ + usr/include/private/yaml \ usr/include/private/zstd \ usr/lib \ usr/libdata/pkgconfig \ diff --git a/tools/build/cross-build/include/common/sys/cdefs.h b/tools/build/cross-build/include/common/sys/cdefs.h index 3f9b7866141f..faad5eccb3af 100644 --- a/tools/build/cross-build/include/common/sys/cdefs.h +++ b/tools/build/cross-build/include/common/sys/cdefs.h @@ -270,6 +270,16 @@ #define __ISO_C_VISIBLE 2011 #define __EXT1_VISIBLE 1 +/* + * Macro to test if we're using a specific version of gcc or later. + */ +#if defined(__GNUC__) +#define __GNUC_PREREQ__(ma, mi) \ + (__GNUC__ > (ma) || __GNUC__ == (ma) && __GNUC_MINOR__ >= (mi)) +#else +#define __GNUC_PREREQ__(ma, mi) 0 +#endif + /* Alignment builtins for better type checking and improved code generation. */ /* Provide fallback versions for other compilers (GCC/Clang < 10): */ #if !__has_builtin(__builtin_is_aligned) diff --git a/tools/build/depend-cleanup.sh b/tools/build/depend-cleanup.sh index 22bf34439758..d751118a79a2 100755 --- a/tools/build/depend-cleanup.sh +++ b/tools/build/depend-cleanup.sh @@ -470,3 +470,36 @@ fi # 20250813 4f766afc1ca0 tcopy converted to C++ clean_dep usr.bin/tcopy tcopy c + +# 20250904 aef807876c30 moused binary to directory +if [ -f "$OBJTOP"/usr.sbin/moused/moused ]; then + echo "Removing old moused binary" + run rm -fv "$OBJTOP"/usr.sbin/moused/moused +fi + +if [ ${MACHINE} = riscv ]; then + # 20251031 df21a004be23 libc: scalar strrchr() in RISC-V assembly + clean_dep lib/libc strrchr c + + # 20251031 563efdd3bd5d libc: scalar memchr() in RISC-V assembly + clean_dep lib/libc memchr c + + # 20251031 40a958d5850d libc: scalar memset() in RISC-V assembly + clean_dep lib/libc memset c + + # 20251031 e09c1583eddd libc: scalar strlen() in RISC-V assembly + clean_dep lib/libc strlen c + + # 20251031 25fdd86a4c92 libc: scalar memcpy() in RISC-V assembly + clean_dep lib/libc memcpy c + + # 20251031 5a52f0704435 libc: scalar strnlen() in RISC-V assembly + clean_dep lib/libc strnlen c + + # 20251031 08af0bbc9c7d libc: scalar strchrnul() in RISC-V assembly + clean_dep lib/libc strchrnul c + + # 20251031 b5dbf3de5611 libc/riscv64: implement bcopy() and bzero() through memcpy() and memset() + clean_dep lib/libc bcopy c "libc.string.bcopy.c" + clean_dep lib/libc bzero c "libc.string.bzero.c" +fi diff --git a/tools/build/mk/OptionalObsoleteFiles.inc b/tools/build/mk/OptionalObsoleteFiles.inc index 5eea402c4526..7cf742616e63 100644 --- a/tools/build/mk/OptionalObsoleteFiles.inc +++ b/tools/build/mk/OptionalObsoleteFiles.inc @@ -161,7 +161,26 @@ OLD_FILES+=usr/share/man/man8/bhyveload.8.gz OLD_DIRS+=usr/share/examples/bhyve .endif -.if ${MK_BLACKLIST} == no +.if ${MK_BLOCKLIST} == no +OLD_FILES+=etc/blocklistd.conf +OLD_FILES+=etc/rc.d/blocklistd +OLD_FILES+=usr/include/blocklist.h +OLD_FILES+=usr/lib/libblocklist.a +OLD_FILES+=usr/lib/libblocklist_p.a +OLD_FILES+=usr/lib/libblocklist.so +OLD_LIBS+=usr/lib/libblocklist.so.0 +OLD_FILES+=usr/libexec/blocklistd-helper +OLD_FILES+=usr/sbin/blocklistctl +OLD_FILES+=usr/sbin/blocklistd +OLD_FILES+=usr/share/man/man3/blocklist.3.gz +OLD_FILES+=usr/share/man/man3/blocklist_close.3.gz +OLD_FILES+=usr/share/man/man3/blocklist_open.3.gz +OLD_FILES+=usr/share/man/man3/blocklist_r.3.gz +OLD_FILES+=usr/share/man/man3/blocklist_sa.3.gz +OLD_FILES+=usr/share/man/man3/blocklist_sa_r.3.gz +OLD_FILES+=usr/share/man/man5/blocklistd.conf.5.gz +OLD_FILES+=usr/share/man/man8/blocklistctl.8.gz +OLD_FILES+=usr/share/man/man8/blocklistd.8.gz OLD_FILES+=etc/blacklistd.conf OLD_FILES+=etc/rc.d/blacklistd OLD_FILES+=usr/include/blacklist.h @@ -2045,21 +2064,14 @@ OLD_FILES+=usr/share/man/man8/phttpget.8.gz .endif .if ${MK_FTP} == no -OLD_FILES+=etc/ftpusers -OLD_FILES+=etc/newsyslog.conf.d/ftp.conf OLD_FILES+=etc/pam.d/ftp OLD_FILES+=etc/pam.d/ftpd -OLD_FILES+=etc/rc.d/ftpd -OLD_FILES+=etc/syslog.d/ftp.conf OLD_FILES+=usr/bin/ftp OLD_FILES+=usr/bin/gate-ftp OLD_FILES+=usr/bin/pftp -OLD_FILES+=usr/libexec/ftpd OLD_FILES+=usr/share/man/man1/ftp.1.gz OLD_FILES+=usr/share/man/man1/gate-ftp.1.gz OLD_FILES+=usr/share/man/man1/pftp.1.gz -OLD_FILES+=usr/share/man/man5/ftpchroot.5.gz -OLD_FILES+=usr/share/man/man8/ftpd.8.gz .endif .if ${MK_GAMES} == no @@ -3793,11 +3805,14 @@ OLD_FILES+=usr/share/man/man1/host.1.gz .endif .if ${MK_LEGACY_CONSOLE} == no +OLD_FILES+=etc/moused.conf OLD_FILES+=etc/rc.d/moused +OLD_FILES+=etc/rc.d/msconvd OLD_FILES+=etc/rc.d/syscons OLD_FILES+=usr/sbin/kbdcontrol OLD_FILES+=usr/sbin/kbdmap OLD_FILES+=usr/sbin/moused +OLD_FILES+=usr/sbin/msconvd OLD_FILES+=usr/sbin/vidcontrol OLD_FILES+=usr/sbin/vidfont OLD_FILES+=usr/share/man/man1/kbdcontrol.1.gz @@ -3806,7 +3821,11 @@ OLD_FILES+=usr/share/man/man1/vidcontrol.1.gz OLD_FILES+=usr/share/man/man1/vidfont.1.gz OLD_FILES+=usr/share/man/man5/kbdmap.5.gz OLD_FILES+=usr/share/man/man5/keymap.5.gz +OLD_FILES+=usr/share/man/man5/moused.conf.5.gz OLD_FILES+=usr/share/man/man8/moused.8.gz +OLD_FILES+=usr/share/man/man8/msconvd.8.gz +OLD_FILES+=usr/share/moused/5-generic-touchpad.quirks +OLD_DIRS+=usr/share/moused .endif .for LIBCOMPAT libcompat in ${_ALL_LIBCOMPATS_libcompats} @@ -8196,7 +8215,11 @@ OLD_FILES+=usr/include/atf-c/tc.h OLD_FILES+=usr/include/atf-c/tp.h OLD_FILES+=usr/include/atf-c/utils.h OLD_LIBS+=usr/lib/libprivateatf-c++.so.2 +OLD_FILES+=usr/lib/libprivateatf-c++.so +OLD_FILES+=usr/lib/libprivateatf-c++.a OLD_LIBS+=usr/lib/libprivateatf-c.so.1 +OLD_FILES+=usr/lib/libprivateatf-c.so +OLD_FILES+=usr/lib/libprivateatf-c.a OLD_FILES+=usr/share/examples/kyua/kyua.conf OLD_FILES+=usr/share/examples/kyua/Kyuafile.top OLD_FILES+=usr/share/kyua/misc/context.html diff --git a/tools/build/options/WITHOUT_BLACKLIST b/tools/build/options/WITHOUT_BLACKLIST index c54c83f27553..df9c9a41227f 100644 --- a/tools/build/options/WITHOUT_BLACKLIST +++ b/tools/build/options/WITHOUT_BLACKLIST @@ -1,4 +1,2 @@ -Set this if you do not want to build -.Xr blacklistd 8 -and -.Xr blacklistctl 8 . +This option has been renamed to +.Va WITHOUT_BLOCKLIST . diff --git a/tools/build/options/WITHOUT_BLACKLIST_SUPPORT b/tools/build/options/WITHOUT_BLACKLIST_SUPPORT index 2bf22ea42ab6..cd484727d636 100644 --- a/tools/build/options/WITHOUT_BLACKLIST_SUPPORT +++ b/tools/build/options/WITHOUT_BLACKLIST_SUPPORT @@ -1,7 +1,2 @@ -Build some programs without -.Xr libblacklist 3 -support, like -.Xr fingerd 8 , -.Xr ftpd 8 , -and -.Xr sshd 8 . +This option has been renamed to +.Va WITHOUT_BLOCKLIST_SUPPORT . diff --git a/tools/build/options/WITHOUT_BLOCKLIST b/tools/build/options/WITHOUT_BLOCKLIST new file mode 100644 index 000000000000..c456a98c672f --- /dev/null +++ b/tools/build/options/WITHOUT_BLOCKLIST @@ -0,0 +1,4 @@ +Set this if you do not want to build +.Xr blocklistd 8 +and +.Xr blocklistctl 8 . diff --git a/tools/build/options/WITHOUT_BLOCKLIST_SUPPORT b/tools/build/options/WITHOUT_BLOCKLIST_SUPPORT new file mode 100644 index 000000000000..f06ebc6e4263 --- /dev/null +++ b/tools/build/options/WITHOUT_BLOCKLIST_SUPPORT @@ -0,0 +1,6 @@ +Build some programs without +.Xr libblocklist 3 +support, like +.Xr fingerd 8 +and +.Xr sshd 8 . diff --git a/tools/build/options/WITHOUT_FTP b/tools/build/options/WITHOUT_FTP index 2e55ccc46ef6..a1db09d2fe8f 100644 --- a/tools/build/options/WITHOUT_FTP +++ b/tools/build/options/WITHOUT_FTP @@ -1,4 +1,2 @@ Do not build or install -.Xr ftp 1 -and -.Xr ftpd 8 . +.Xr ftp 1 . diff --git a/tools/build/options/WITHOUT_PAM_SUPPORT b/tools/build/options/WITHOUT_PAM_SUPPORT index 323a83cf6192..89cf0e248f3f 100644 --- a/tools/build/options/WITHOUT_PAM_SUPPORT +++ b/tools/build/options/WITHOUT_PAM_SUPPORT @@ -1,4 +1,3 @@ -Build some programs without PAM support, particularly -.Xr ftpd 8 -and -.Xr ppp 8 . +Build +.Xr ppp 8 +without PAM support. diff --git a/tools/build/options/WITH_PTHREADS_ASSERTIONS b/tools/build/options/WITH_PTHREADS_ASSERTIONS new file mode 100644 index 000000000000..03c15b76fb85 --- /dev/null +++ b/tools/build/options/WITH_PTHREADS_ASSERTIONS @@ -0,0 +1 @@ +Enable debugging assertions in pthreads library. diff --git a/tools/build/options/makeman b/tools/build/options/makeman index ddd08443e61c..88ee5884d180 100755 --- a/tools/build/options/makeman +++ b/tools/build/options/makeman @@ -222,8 +222,11 @@ variables that control the aspects of how the system builds. .Pp The default location of .Nm -is -.Pa /etc/src.conf , +is the top level of the source tree, or +.Pa /etc/src.conf +if no +.Nm +is found in the source tree itself, though an alternative location can be specified in the .Xr make 1 variable diff --git a/tools/coccinelle/pseudofs-create.cocci b/tools/coccinelle/pseudofs-create.cocci new file mode 100644 index 000000000000..ba5870f38732 --- /dev/null +++ b/tools/coccinelle/pseudofs-create.cocci @@ -0,0 +1,35 @@ +@ pfs_create_dir_ret_ident @ + expression _pfn, E1, E2, E3, E4, E5, E6; +@@ +-_pfn = pfs_create_dir(E1, E2, E3, E4, E5, E6); ++pfs_create_dir(E1, &_pfn, E2, E3, E4, E5, E6); + +@ pfs_create_file_ret @ + expression _pfn, E1, E2, E3, E4, E5, E6, E7; +@@ +-_pfn = pfs_create_file(E1, E2, E3, E4, E5, E6, E7); ++pfs_create_file(E1, &_pfn, E2, E3, E4, E5, E6, E7); + +@ pfs_create_link_ret @ + expression _pfn, E1, E2, E3, E4, E5, E6, E7; +@@ +-_pfn = pfs_create_link(E1, E2, E3, E4, E5, E6, E7); ++pfs_create_link(E1, &_pfn, E2, E3, E4, E5, E6, E7); + +@ pfs_create_dir_noret @ + expression E1, E2, E3, E4, E5, E6; +@@ +-pfs_create_dir(E1, E2, E3, E4, E5, E6); ++pfs_create_dir(E1, NULL, E2, E3, E4, E5, E6); + +@ pfs_create_file_noret @ + expression E1, E2, E3, E4, E5, E6, E7; +@@ +-pfs_create_file(E1, E2, E3, E4, E5, E6, E7); ++pfs_create_file(E1, NULL, E2, E3, E4, E5, E6, E7); + +@ pfs_create_link_noret @ + expression E1, E2, E3, E4, E5, E6, E7; +@@ +-pfs_create_link(E1, E2, E3, E4, E5, E6, E7); ++pfs_create_link(E1, NULL, E2, E3, E4, E5, E6, E7); diff --git a/tools/kerneldoc/subsys/Doxyfile-dev_hifn b/tools/kerneldoc/subsys/Doxyfile-dev_hifn deleted file mode 100644 index 2a6402c1eee2..000000000000 --- a/tools/kerneldoc/subsys/Doxyfile-dev_hifn +++ /dev/null @@ -1,19 +0,0 @@ -# Doxyfile 1.5.2 - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- -PROJECT_NAME = "FreeBSD kernel HIFN device code" -OUTPUT_DIRECTORY = $(DOXYGEN_DEST_PATH)/dev_hifn/ -EXTRACT_ALL = YES # for undocumented src, no warnings enabled -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- -INPUT = $(DOXYGEN_SRC_PATH)/dev/hifn/ \ - $(NOTREVIEWED) - -GENERATE_TAGFILE = dev_hifn/dev_hifn.tag - -@INCLUDE_PATH = $(DOXYGEN_INCLUDE_PATH) -@INCLUDE = common-Doxyfile - diff --git a/tools/kerneldoc/subsys/README b/tools/kerneldoc/subsys/README index 6679d5cb9055..2ad9a00625ae 100644 --- a/tools/kerneldoc/subsys/README +++ b/tools/kerneldoc/subsys/README @@ -20,12 +20,12 @@ The following environment variables can be used in the Doxyfile: For the PDF generation you may have to change some limits in the latex configuration (the build may fail and an error about e.g. "pool size" is -shown), for print/teTeX this is done in +shown), for print/texlive-full this is done in /usr/local/share/texmf/web2c/texmf.cnf Programs needed to generate the API docs: - devel/doxygen - - print/teTeX + - print/texlive-full - graphics/graphviz -- diff --git a/tools/regression/priv/main.c b/tools/regression/priv/main.c index dbcb5759f6b9..979e6ed65284 100644 --- a/tools/regression/priv/main.c +++ b/tools/regression/priv/main.c @@ -423,12 +423,10 @@ setup_file(const char *test, char *fpathp, uid_t uid, gid_t gid, mode_t mode) static void set_creds(const char *test, uid_t uid, gid_t gid) { - gid_t gids[1] = { gid }; - if (setgid(gid) < 0) err(-1, "test %s: setegid(%d)", test, gid); - if (setgroups(sizeof(gids)/sizeof(gid_t), gids) < 0) - err(-1, "test %s: setgroups(%d)", test, gid); + if (setgroups(0, NULL) < 0) + err(-1, "test %s: setgroups(NULL)", test); if (setuid(uid) < 0) err(-1, "test %s: seteuid(%d)", test, uid); } diff --git a/tools/regression/sockets/udp_pingpong/udp_pingpong.c b/tools/regression/sockets/udp_pingpong/udp_pingpong.c index 2fe342debdc6..e852f7a7af87 100644 --- a/tools/regression/sockets/udp_pingpong/udp_pingpong.c +++ b/tools/regression/sockets/udp_pingpong/udp_pingpong.c @@ -601,11 +601,9 @@ main(void) test_run(TT_TIMESTAMP, i, 1, "send()/recvmsg(), setsockopt(SO_TIMESTAMP, 1)"); printf("OK\n"); - if (i == 0) { - test_run(TT_BINTIME, i, 1, - "send()/recvmsg(), setsockopt(SO_BINTIME, 1)"); - printf("OK\n"); - } + test_run(TT_BINTIME, i, 1, + "send()/recvmsg(), setsockopt(SO_BINTIME, 1)"); + printf("OK\n"); test_run(TT_REALTIME_MICRO, i, 1, "send()/recvmsg(), setsockopt(SO_TS_CLOCK, SO_TS_REALTIME_MICRO)"); printf("OK\n"); diff --git a/tools/test/stress2/misc/all.exclude b/tools/test/stress2/misc/all.exclude index f9b32db95799..0658bfdc0c1b 100644 --- a/tools/test/stress2/misc/all.exclude +++ b/tools/test/stress2/misc/all.exclude @@ -25,6 +25,7 @@ gnop13.sh https://people.freebsd.org/~pho/stress/log/log0386.txt 20221113 gnop7.sh Waiting for patch commit 20190820 gnop8.sh Waiting for patch commit 20201214 gnop9.sh Waiting for patch commit 20201214 +graid1_3.sh Hang seen 20250915 graid1_8.sh Known issue 20170909 graid1_9.sh panic: Bad effnlink 20180212 lockf5.sh Spinning threads seen 20160718 @@ -74,10 +75,13 @@ syzkaller67.sh panic: ASan: Invalid access, 8-byte read at ... 20230621 syzkaller80.sh panic 20250711 syzkaller81.sh panic 20250711 syzkaller82.sh panic: m_apply, length > size of mbuf chain 20250724 +syzkaller84.sh panic: Assertion !(sb->sb_state & SBS_CANTRCVMORE) 20250810 +syzkaller85.sh panic: Assertion uio->uio_resid < 0 failed 20250928 +syzkaller86.sh Fatal trap 12: page fault while in kernel mode 20251001 +write2.sh panic: sndbuf_acquire: count 255 > free 0 20251003 quota3.sh https://people.freebsd.org/~pho/stress/log/log0604.txt 20250728 quota6.sh https://people.freebsd.org/~pho/stress/log/log0456.txt 20240707 truss3.sh WiP 20200915 -zfs18.sh https://people.freebsd.org/~pho/stress/log/log0560.txt 20241118 zfs9.sh panic: sacked_bytes < 0 20250711 # Test not to run for other reasons: diff --git a/tools/test/stress2/misc/beneath4.sh b/tools/test/stress2/misc/beneath4.sh index 48458f088a96..3ba448cd06c7 100755 --- a/tools/test/stress2/misc/beneath4.sh +++ b/tools/test/stress2/misc/beneath4.sh @@ -88,7 +88,7 @@ main(int argc, char *argv[]) warn("cwd=%s, top=%s. flag=%0.6x. fstatf(%s) = %2d (expect %2d). %4s", cwd, dir, flag, obj, r, exp, s); - return (r == exp ? 0 : errno); + return (r != exp); } EOF cc -o beneath4 -Wall -Wextra -O2 -g beneath4.c || exit 1 @@ -129,5 +129,5 @@ $dir/beneath4 $top $top/.. 0x2000 93 || s=1 $dir/beneath4 $top ../a 0x2000 93 || s=1 printf "\nNo flag\n" $dir/beneath4 $top ../a 0x0000 0 || s=1 -rm -rf $top +rm -rf $dir exit $s diff --git a/tools/test/stress2/misc/fdatasync.sh b/tools/test/stress2/misc/fdatasync.sh index f17e2826ad94..9abd31e5bd94 100755 --- a/tools/test/stress2/misc/fdatasync.sh +++ b/tools/test/stress2/misc/fdatasync.sh @@ -178,7 +178,7 @@ main(int argc, char **argv) if ((pw = getpwnam("nobody")) == NULL) err(1, "failed to resolve nobody"); - if (setgroups(1, &pw->pw_gid) || + if (setgroups(0, NULL) || setegid(pw->pw_gid) || setgid(pw->pw_gid) || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) err(1, "Can't drop privileges to \"nobody\""); diff --git a/tools/test/stress2/misc/fdatasync2.sh b/tools/test/stress2/misc/fdatasync2.sh index 6011eba53698..42ade0cedbd3 100755 --- a/tools/test/stress2/misc/fdatasync2.sh +++ b/tools/test/stress2/misc/fdatasync2.sh @@ -177,7 +177,7 @@ main(int argc, char **argv) if ((pw = getpwnam("nobody")) == NULL) err(1, "failed to resolve nobody"); - if (setgroups(1, &pw->pw_gid) || + if (setgroups(0, NULL) || setegid(pw->pw_gid) || setgid(pw->pw_gid) || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) err(1, "Can't drop privileges to \"nobody\""); diff --git a/tools/test/stress2/misc/fdescfs2.sh b/tools/test/stress2/misc/fdescfs2.sh new file mode 100755 index 000000000000..21b82dcddd5e --- /dev/null +++ b/tools/test/stress2/misc/fdescfs2.sh @@ -0,0 +1,44 @@ +#!/bin/sh + +# +# Copyright (c) 2025 Peter Holm <pho@FreeBSD.org> +# +# SPDX-License-Identifier: BSD-2-Clause +# + +# Test scenario description by: Kyle Evans <kevans@FreeBSD.org> + +# "panic: mtx_lock() of destroyed mutex 0xffffffff83717540 @ /usr/src/sys/fs/fdescfs/fdesc_vnops.c:151" seen + +[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 +. ../default.cfg + +set -u + +kldstat | grep -q fdescfs.ko && { kldunload fdescfs.ko && wasloaded=1; } +while true; do + mount | grep -q "on $mntpoint " || + mount -t fdescfs dummy $mntpoint || continue + ls $mntpoint > /dev/null + if mount | grep -q "on $mntpoint "; then + if ! umount $mntpoint; then + umount -f $mntpoint || break + fi + fi +done > /dev/null 2>&1 & + +start=`date +%s` +while [ $((`date +%s` - start)) -lt 10 ]; do + kldstat | grep -q fdescfs.ko && + kldunload fdescfs.ko 2>/dev/null + sleep .1 + kldstat | grep -q fdescfs.ko || + kldload fdescfs.ko +done +kill %1 +wait +mount | grep -q "on $mntpoint " && umount $mntpoint +sleep .1 +set +u +[ $wasloaded ] || kldunload fdescfs.ko +exit 0 diff --git a/tools/test/stress2/misc/fdescfs3.sh b/tools/test/stress2/misc/fdescfs3.sh new file mode 100755 index 000000000000..eb24a6eac085 --- /dev/null +++ b/tools/test/stress2/misc/fdescfs3.sh @@ -0,0 +1,51 @@ +#!/bin/sh + +# +# Copyright (c) 2025 Peter Holm <pho@FreeBSD.org> +# +# SPDX-License-Identifier: BSD-2-Clause +# + +[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 + +. ../default.cfg + +mounts=15 # Number of parallel scripts +mdstart=$mdstart # Use md unit numbers from this point + +if [ $# -eq 0 ]; then + for i in `jot $mounts`; do + m=$(( i + mdstart - 1 )) + [ ! -d ${mntpoint}$m ] && mkdir ${mntpoint}$m + mount | grep "$mntpoint" | grep -q md$m && umount ${mntpoint}$m + done + ../testcases/swap/swap -t 2m -i 20 & + + # start the parallel tests + touch /tmp/$0 + for i in `jot $mounts`; do + m=$(( i + mdstart - 1 )) + ./$0 $m & + ./$0 find $m > /dev/null 2>&1 & + done + wait +else + if [ $1 = find ]; then + while [ -r /tmp/$0 ]; do + ls -lR ${mntpoint}* + done + else + + # The test: Parallel mount and unmounts + start=`date +%s` + while [ $((`date +%s` - start)) -lt 120 ]; do + m=$1 + mount -t fdescfs null ${mntpoint}$m + while mount | grep -qw $mntpoint$m; do + opt=$([ $((`date '+%s'` % 2)) -eq 0 ] && echo "-f") + umount $opt ${mntpoint}$m > /dev/null 2>&1 + done + done + rm -f /tmp/$0 + fi +fi diff --git a/tools/test/stress2/misc/fifo2.sh b/tools/test/stress2/misc/fifo2.sh index 4a7b986931d9..e84506cbfb01 100755 --- a/tools/test/stress2/misc/fifo2.sh +++ b/tools/test/stress2/misc/fifo2.sh @@ -167,7 +167,7 @@ main(void) if ((pw = getpwnam("nobody")) == NULL) err(1, "no such user: nobody"); - if (setgroups(1, &pw->pw_gid) || + if (setgroups(0, NULL) || setegid(pw->pw_gid) || setgid(pw->pw_gid) || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) err(1, "Can't drop privileges to \"nobody\""); diff --git a/tools/test/stress2/misc/ftruncate.sh b/tools/test/stress2/misc/ftruncate.sh index ddec85b6745a..f9aa1869756f 100755 --- a/tools/test/stress2/misc/ftruncate.sh +++ b/tools/test/stress2/misc/ftruncate.sh @@ -170,7 +170,7 @@ main(int argc, char **argv) if ((pw = getpwnam("nobody")) == NULL) err(1, "failed to resolve nobody"); - if (setgroups(1, &pw->pw_gid) || + if (setgroups(0, NULL) || setegid(pw->pw_gid) || setgid(pw->pw_gid) || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) err(1, "Can't drop privileges to \"nobody\""); diff --git a/tools/test/stress2/misc/ftruncate2.sh b/tools/test/stress2/misc/ftruncate2.sh index 35db3a4c5f8d..94d9b6ca810f 100755 --- a/tools/test/stress2/misc/ftruncate2.sh +++ b/tools/test/stress2/misc/ftruncate2.sh @@ -185,7 +185,7 @@ main(int argc, char **argv) if ((pw = getpwnam("nobody")) == NULL) err(1, "failed to resolve nobody"); - if (setgroups(1, &pw->pw_gid) || + if (setgroups(0, NULL) || setegid(pw->pw_gid) || setgid(pw->pw_gid) || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) err(1, "Can't drop privileges to \"nobody\""); diff --git a/tools/test/stress2/misc/fuzz.sh b/tools/test/stress2/misc/fuzz.sh index 189cdbfebd01..add3d0d19a21 100755 --- a/tools/test/stress2/misc/fuzz.sh +++ b/tools/test/stress2/misc/fuzz.sh @@ -49,6 +49,7 @@ . ../default.cfg D=$diskimage +backup=/tmp/fuzz.sh.diskimage.`date +%Y%m%dT%H%M%S`.gz tst() { rm -f $D @@ -62,6 +63,7 @@ tst() { for i in `jot 50`; do ./fuzz -n 50 $D + gzip < $D > $backup if fsck -f -y /dev/md$mdstart 2>&1 | egrep "^[A-Z]" > /dev/null; then if fsck -f -y /dev/md$mdstart 2>&1 | egrep "^[A-Z]" > /dev/null; then if fsck -f -y /dev/md$mdstart 2>&1 | egrep "^[A-Z]" > /dev/null; then @@ -73,7 +75,7 @@ tst() { sync;sync;sync if mount /dev/md$mdstart $mntpoint; then ls -l $mntpoint > /dev/null - find $mntpoint -exec dd if={} of=/dev/null bs=1m count=3 \; > /dev/null 2>&1 + find $mntpoint -type f -exec dd if={} of=/dev/null bs=1m count=3 \; > /dev/null 2>&1 umount $mntpoint else echo "Giving up at loop $i" @@ -96,7 +98,7 @@ for j in `jot 10`; do date '+%T' tst done -rm -f fuzz +rm -f fuzz $backup exit diff --git a/tools/test/stress2/misc/kevent10.sh b/tools/test/stress2/misc/kevent10.sh index b7f74f487cec..cebbd040c37d 100755 --- a/tools/test/stress2/misc/kevent10.sh +++ b/tools/test/stress2/misc/kevent10.sh @@ -72,15 +72,15 @@ main(void) struct kevent events; char *fn = "/tmp/kevent10.trace"; - if (open(fn, O_RDWR | O_CREAT, 0666) == -1) - err(1, "%s", fn); + if (open(fn, O_RDWR | O_CREAT | O_TRUNC, 0666) == -1) + err(1, "open(%s)", fn); if (ktrace(fn, KTRFLAG_DESCEND | KTROP_SET, KTRFAC_GENIO, 0) == -1) err(1, "ktrace"); memset(&changes, 0, sizeof(struct kevent)); memset(&events, 0, sizeof(struct kevent)); if (kevent(0, &changes, -1, &events, 1, 0) == -1) - if (errno != EBADF) - err(1, "kevent"); + if (errno != EBADF && errno != EINVAL) + warn("kevent"); if (ktrace(fn, KTROP_CLEARFILE, KTRFAC_GENIO, 0) == -1) err(1, "ktrace clear"); diff --git a/tools/test/stress2/misc/kevent16.sh b/tools/test/stress2/misc/kevent16.sh index 23dd222821da..58a8f6971c21 100755 --- a/tools/test/stress2/misc/kevent16.sh +++ b/tools/test/stress2/misc/kevent16.sh @@ -88,5 +88,5 @@ cc -o /tmp/kevent16 -Wall -Wextra -O2 /tmp/kevent16.c || exit 1 /tmp/kevent16; s=$? -rm -f /tmp/kevent16.c kevent16 kevent16.core +rm -f /tmp/kevent16.c /tmp/kevent16 kevent16.core exit $s diff --git a/tools/test/stress2/misc/kevent17.sh b/tools/test/stress2/misc/kevent17.sh new file mode 100755 index 000000000000..e7b8f1a0a00c --- /dev/null +++ b/tools/test/stress2/misc/kevent17.sh @@ -0,0 +1,176 @@ +#!/bin/sh + +# +# Copyright (c) 2025 Peter Holm <pho@FreeBSD.org> +# +# SPDX-License-Identifier: BSD-2-Clause +# + +# A kqueuex(KQUEUE_CPONFORK) test scenario +# Test scenario suggestion by: kib + +. ../default.cfg +[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 + +dir=/tmp +odir=`pwd` +prog=$(basename "$0" .sh) +cd $dir +sed '1,/^EOF/d' < $odir/$0 > $dir/$prog.c +mycc -o $prog -Wall -Wextra -O0 -g $prog.c || exit 1 +rm -f $prog.c +cd $odir + +set -e +mount | grep "on $mntpoint " | grep -q /dev/md && umount -f $mntpoint +[ -c /dev/md$mdstart ] && mdconfig -d -u $mdstart +mdconfig -a -t swap -s 2g -u $mdstart +newfs $newfs_flags md$mdstart > /dev/null +mount /dev/md$mdstart $mntpoint +set +e + +(cd $odir/../testcases/swap; ./swap -t 5m -i 20 -h -l 100 > /dev/null) & +cd $mntpoint +$dir/$prog +s=$? +[ -f $prog.core -a $s -eq 0 ] && + { ls -l $prog.core; mv $prog.core /tmp; s=1; } +cd $odir +while pkill -9 swap; do :; done +wait + +for i in `jot 6`; do + mount | grep -q "on $mntpoint " || break + umount $mntpoint && break || sleep 10 +done +[ $i -eq 6 ] && exit 1 +mdconfig -d -u $mdstart +rm -rf $dir/$prog +exit $s + +EOF +#include <sys/param.h> +#include <sys/event.h> +#include <sys/mman.h> +#include <sys/stat.h> +#include <sys/wait.h> + +#include <machine/atomic.h> + +#include <err.h> +#include <errno.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> +#include <unistd.h> + +static volatile u_int *share; +static int loops; +static char *file = "file"; + +#define MAXLOOPS 100 +#define PARALLEL 1 +#define RUNTIME (2 * 60) +#define SYNC 0 + +static void +test(void) +{ + pid_t pid; + struct kevent ev[2]; + struct timespec ts; + int kq, fd, n; + + if ((fd = open(file, O_RDONLY, 0)) == -1) + err(1, "open(%s). %s:%d", file, __func__, __LINE__); + + atomic_add_int(&share[SYNC], 1); + while (share[SYNC] != PARALLEL) + usleep(10000); + + if ((kq = kqueuex(KQUEUE_CPONFORK)) < 0) + err(1, "kqueuex"); + + ts.tv_sec = 5; + ts.tv_nsec = 0; + n = 0; + EV_SET(&ev[n], fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR, + NOTE_DELETE, 0, 0); + n++; + + if (kevent(kq, ev, n, NULL, 0, NULL) < 0) + err(1, "kevent()"); + if (loops >= MAXLOOPS) { /* start using fork(2) */ + if ((pid = fork()) == 0) { + n = kevent(kq, NULL, 0, ev, 1, &ts); + if (n == -1) + err(1, "kevent() in fork\n"); + close(fd); + close(kq); + _exit(0); + } + if (waitpid(pid, NULL, 0) != pid) + err(1, "waitpid(%d)\n", pid); + } + + n = kevent(kq, NULL, 0, ev, 1, &ts); + if (n == -1) + err(1, "kevent()"); + close(fd); + close(kq); + + _exit(0); +} + +int +main(void) +{ + pid_t pids[PARALLEL]; + size_t len; + time_t start; + int e, fd, i, status; + + e = 0; + len = PAGE_SIZE; + loops = 0; + if ((share = mmap(NULL, len, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_SHARED, -1, 0)) == MAP_FAILED) + err(1, "mmap"); + + start = time(NULL); + while ((time(NULL) - start) < RUNTIME && e == 0) { + loops++; + if ((fd = open(file, O_CREAT | O_TRUNC | O_RDWR, 0660)) == + -1) + err(1, "open(%s)", file); + close(fd); + share[SYNC] = 0; + for (i = 0; i < PARALLEL; i++) { + + if ((pids[i] = fork()) == 0) + test(); + if (pids[i] == -1) + err(1, "fork()"); + } + while (share[SYNC] != PARALLEL) + usleep(10000); + if (unlink(file) == -1) + err(1, "unlink(%s). %s:%d\n", file, + __FILE__, __LINE__); + for (i = 0; i < PARALLEL; i++) { + if (waitpid(pids[i], &status, 0) == -1) + err(1, "waitpid(%d)", pids[i]); + if (status != 0) { + if (WIFSIGNALED(status)) + fprintf(stderr, + "pid %d exit signal %d\n", + pids[i], WTERMSIG(status)); + } + e += status == 0 ? 0 : 1; + } + } + + return (e); +} diff --git a/tools/test/stress2/misc/kevent18.sh b/tools/test/stress2/misc/kevent18.sh new file mode 100755 index 000000000000..1492c49e2921 --- /dev/null +++ b/tools/test/stress2/misc/kevent18.sh @@ -0,0 +1,152 @@ +#!/bin/sh + +# +# Copyright (c) 2025 Peter Holm <pho@FreeBSD.org> +# +# SPDX-License-Identifier: BSD-2-Clause +# + +# A kqueuex(KQUEUE_CPONFORK) test scenario + +# Sleeping thread seen in WiP code: +# https://people.freebsd.org/~pho/stress/log/log0615.txt + +. ../default.cfg + +[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 +ulimit -k 5000 || { echo FAIL; exit 1; } + +odir=`pwd` +prog=$(basename "$0" .sh) + +cd /tmp +sed '1,/^EOF/d' < $odir/$0 > $prog.c +mycc -o $prog -Wall -Wextra -O2 -g $prog.c -lpthread || exit 1 +rm -f $prog.c +cd $odir + +mount | grep "on $mntpoint " | grep -q md$mdstart && umount -f $mntpoint +mdconfig -l | grep -q $mdstart && mdconfig -d -u $mdstart + +mdconfig -a -t swap -s 2g -u $mdstart +newfs $newfs_flags md$mdstart > /dev/null +mount /dev/md$mdstart $mntpoint +chmod 777 $mntpoint + +su $testuser -c "(cd $mntpoint; /tmp/$prog)" & +for i in `jot 99`; do + sleep 1 + kill -0 $! 2>/dev/null || break +done +pkill $prog +wait +umount -f $mntpoint + +while mount | grep -q $mntpoint; do + umount $mntpoint || sleep 1 +done +mdconfig -d -u $mdstart +rm -f /tmp/$prog + +exit 0 +EOF +#include <sys/types.h> +#include <sys/event.h> +#include <sys/mman.h> +#include <sys/wait.h> + +#include <err.h> +#include <errno.h> +#include <fcntl.h> +#include <pthread.h> +#include <sched.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#define PARALLEL 64 + +static int fd; +static char path[80]; + +static void * +spin(void *arg __unused) +{ + int i; + + for (i= 0;; i++) { + snprintf(path, sizeof(path), "file.%06d.%d", getpid(), i); + fd = open(path, O_CREAT | O_TRUNC | O_RDWR, 0622); + if (fd == -1 && errno == ENOTDIR) + break; + if (fd == -1) + err(1, "open(%s)", path); + close(fd); + fd = 0; + unlink(path); + } + fprintf(stderr, "spin loops: %d\n", i + 1); + return (NULL); +} + +static void * +test(void *arg __unused) +{ + struct kevent ev; + struct timespec ts; + pid_t pid; + int i, kq, n; + + for (i = 0; i < 500000; i++) { + if ((kq = kqueuex(KQUEUE_CPONFORK)) < 0) + err(1, "kqueueex(KQUEUE_CPONFORK)"); + + n = 0; + memset(&ev, 0, sizeof(ev)); + EV_SET(&ev, fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR, + NOTE_DELETE|NOTE_RENAME|NOTE_EXTEND, 0, 0); + n++; + + if ((pid = fork()) == 0) { + kevent(kq, &ev, n, NULL, 0, NULL); + _exit(0); + } + if (waitpid(pid, NULL, 0) != pid) + err(1, "waitpid(%d)", pid); + + kevent(kq, &ev, n, NULL, 0, NULL); + memset(&ev, 0, sizeof(ev)); + ts.tv_sec = 0; + ts.tv_nsec = 1000000; + if ((n = kevent(kq, NULL, 0, &ev, 1, &ts)) == -1) + err(1, "kevent()"); + + close(kq); + } + return (NULL); +} + +int +main(void) +{ + pthread_t cp[PARALLEL], sp; + int e, i; + + if ((e = pthread_create(&sp, NULL, spin, NULL)) != 0) + errc(1, e, "pthread_create"); + + for (i = 0; i < PARALLEL; i++) { + if ((e = pthread_create(&cp[i], NULL, test, NULL)) != 0) + errc(1, e, "pthread_create"); + } + + for (i = 0; i < PARALLEL; i++) + pthread_join(cp[i], NULL); + pthread_join(sp, NULL); + + close(fd); + + return (0); +} diff --git a/tools/test/stress2/misc/kevent19.sh b/tools/test/stress2/misc/kevent19.sh new file mode 100755 index 000000000000..0170fe0d93c8 --- /dev/null +++ b/tools/test/stress2/misc/kevent19.sh @@ -0,0 +1,187 @@ +#!/bin/sh + +# A kqueuex(KQUEUE_CPONFORK) test scenario + +set -u +prog=$(basename "$0" .sh) + +cat > /tmp/$prog.c <<EOF +/* \$Id: kqfork.c,v 1.4 2025/08/19 19:42:16 kostik Exp kostik $ */ + +#include <sys/param.h> +#include <sys/event.h> +#include <err.h> +#include <signal.h> +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#ifndef KQUEUE_CPONFORK +#define KQUEUE_CPONFORK 0x2 +#endif + +static pid_t pid_pipe_beat; +static pid_t pid_controller; + +static void +sighup_handler(int sig __unused) +{ + kill(pid_pipe_beat, SIGKILL); + _exit(1); +} + +static void +pipe_beat(int wp) +{ + static const char a[1] = { 'a' }; + ssize_t s; + + for (;;) { + sleep(1); + s = write(wp, a, 1); + if (s < 0) + err(1, "pipe write"); + if (s == 0) + errx(1, "short pipe write"); + } +} + +static void +worker(int kq, int rp) +{ + struct kevent ev[1]; + char a[1]; + ssize_t s; + int n; + + for (;;) { + n = kevent(kq, NULL, 0, ev, nitems(ev), NULL); + if (n == -1) { + kill(pid_controller, SIGHUP); + err(1, "kqueue"); + } + if (n == 0) + continue; // XXXKIB + switch (ev[0].filter) { + case EVFILT_TIMER: + printf("tick\n"); + break; + case EVFILT_READ: + if (ev[0].ident != (uintptr_t)rp) { + kill(pid_controller, SIGHUP); + errx(1, "unknown read ident %d\n", (int)ev[0].ident); + } + s = read(rp, a, sizeof(a)); + if (s == -1) { + kill(pid_controller, SIGHUP); + err(1, "read"); + } + if (s == 0) { + kill(pid_controller, SIGHUP); + errx(1, "EOF"); + } + printf("%c\n", a[0]); + break; + default: + kill(pid_controller, SIGHUP); + errx(1, "unknown fiter %d\n", ev[0].filter); + break; + } + } +} + +static void +usage(void) +{ + fprintf(stderr, "Usage: kqfork [fork]\n"); + exit(2); +} + +int +main(int argc, char *argv[]) +{ + struct kevent ev[2]; + struct sigaction sa; + int kq, n, pp[2]; + pid_t pid_worker; + bool do_fork; + + do_fork = false; + if (argc != 1 && argc != 2) + usage(); + if (argc == 2) { + if (strcmp(argv[1], "fork") != 0) + usage(); + do_fork = true; + } + + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = sighup_handler; + if (sigaction(SIGHUP, &sa, NULL) == -1) + err(1, "sigaction(SIGHUP)"); + + memset(&sa, 0, sizeof(sa)); + sa.sa_flags = SA_NOCLDWAIT | SA_NOCLDSTOP; + sa.sa_handler = SIG_IGN; + if (sigaction(SIGCHLD, &sa, NULL) == -1) + err(1, "sigaction(SIGCHLD)"); + + if (pipe(pp) == -1) + err(1, "pipe"); + + pid_pipe_beat = fork(); + if (pid_pipe_beat == -1) + err(1, "fork"); + if (pid_pipe_beat == 0) { + close(pp[0]); + pipe_beat(pp[1]); + } + + kq = kqueuex(do_fork ? KQUEUE_CPONFORK : 0); + if (kq == -1) + err(1, "kqueuex"); + + EV_SET(&ev[0], 1, EVFILT_TIMER, EV_ADD, NOTE_SECONDS, 1, NULL); + EV_SET(&ev[1], pp[0], EVFILT_READ, EV_ADD, 0, 0, NULL); + n = kevent(kq, ev, nitems(ev), NULL, 0, NULL); + if (n == -1) { + kill(pid_pipe_beat, SIGKILL); + err(1, "kevent reg"); + } + if (n != 0) { + kill(pid_pipe_beat, SIGKILL); + errx(1, "kevent reg %d", n); + } + + pid_controller = getpid(); + + if (do_fork) { + pid_worker = fork(); + if (pid_worker == -1) { + kill(pid_pipe_beat, SIGKILL); + err(1, "fork"); + } + if (pid_worker == 0) { + close(pp[1]); + worker(kq, pp[0]); + } + + for (;;) + pause(); + } else { + worker(kq, pp[0]); + } + exit(0); // unreachable +} +EOF +cc -o /tmp/$prog -Wall -Wextra -O2 /tmp/$prog.c || exit 1 + +echo "--> No fork" +timeout 4s /tmp/$prog +echo "--> fork" +timeout 4s /tmp/$prog fork + +rm -f /tmp/$prog.c $prog +exit 0 diff --git a/tools/test/stress2/misc/kevent7.sh b/tools/test/stress2/misc/kevent7.sh index 8b58c35551f7..4c7718c6ae5f 100755 --- a/tools/test/stress2/misc/kevent7.sh +++ b/tools/test/stress2/misc/kevent7.sh @@ -236,7 +236,7 @@ main(void) if ((pw = getpwnam("nobody")) == NULL) err(1, "no such user: nobody"); - if (setgroups(1, &pw->pw_gid) || + if (setgroups(0, NULL) || setegid(pw->pw_gid) || setgid(pw->pw_gid) || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) err(1, "Can't drop privileges to \"nobody\""); diff --git a/tools/test/stress2/misc/killpg.sh b/tools/test/stress2/misc/killpg.sh index c6af55a3d593..ea99f5e0d0fd 100755 --- a/tools/test/stress2/misc/killpg.sh +++ b/tools/test/stress2/misc/killpg.sh @@ -113,7 +113,7 @@ killer(void) if ((pw = getpwnam("nobody")) == NULL) err(1, "no such user: nobody"); - if (setgroups(1, &pw->pw_gid) || + if (setgroups(0, NULL) || setegid(pw->pw_gid) || setgid(pw->pw_gid) || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) err(1, "Can't drop privileges to \"nobody\""); diff --git a/tools/test/stress2/misc/killpg2.sh b/tools/test/stress2/misc/killpg2.sh index 5e986f059637..cf186d686dfd 100755 --- a/tools/test/stress2/misc/killpg2.sh +++ b/tools/test/stress2/misc/killpg2.sh @@ -77,7 +77,7 @@ looper(void) if ((pw = getpwnam("TUSER")) == NULL) err(1, "no such user: TUSER"); - if (setgroups(1, &pw->pw_gid) || + if (setgroups(0, NULL) || setegid(pw->pw_gid) || setgid(pw->pw_gid) || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) err(1, "Can't drop privileges to \"TUSER\""); diff --git a/tools/test/stress2/misc/killpg3.sh b/tools/test/stress2/misc/killpg3.sh index 304b3e320f2f..4fcb4fa7a643 100755 --- a/tools/test/stress2/misc/killpg3.sh +++ b/tools/test/stress2/misc/killpg3.sh @@ -109,7 +109,7 @@ looper(void) if ((pw = getpwnam("TUSER")) == NULL) err(1, "no such user: TUSER"); - if (setgroups(1, &pw->pw_gid) || + if (setgroups(0, NULL) || setegid(pw->pw_gid) || setgid(pw->pw_gid) || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) err(1, "Can't drop privileges to \"TUSER\""); diff --git a/tools/test/stress2/misc/maxproc.sh b/tools/test/stress2/misc/maxproc.sh index c425c307e06b..3241e275375e 100755 --- a/tools/test/stress2/misc/maxproc.sh +++ b/tools/test/stress2/misc/maxproc.sh @@ -32,12 +32,12 @@ . ../default.cfg +[ `sysctl -n kern.maxproc` -gt 37028 ] && exit 0 # Excessive run time here=`pwd` cd /tmp sed '1,/^EOF/d' < $here/$0 > maxproc.c mycc -o maxproc -Wall -Wextra maxproc.c -lkvm || exit 1 rm -f maxproc.c -[ `sysctl -n kern.maxproc` -gt 37028 ] && exit 0 # Excessive run time cd $here /tmp/maxproc @@ -103,7 +103,7 @@ t1(int priv) err(1, "no such user: nobody"); if (priv == 0) { - if (setgroups(1, &pw->pw_gid) || + if (setgroups(0, NULL) || setegid(pw->pw_gid) || setgid(pw->pw_gid) || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) err(1, "Can't drop privileges to \"nobody\""); diff --git a/tools/test/stress2/misc/mlockall3.sh b/tools/test/stress2/misc/mlockall3.sh index 0ff1e24eaa7f..aa53e75166a5 100755 --- a/tools/test/stress2/misc/mlockall3.sh +++ b/tools/test/stress2/misc/mlockall3.sh @@ -130,7 +130,7 @@ main(void) if ((pw = getpwnam("nobody")) == NULL) err(1, "no such user: nobody"); - if (setgroups(1, &pw->pw_gid) || + if (setgroups(0, NULL) || setegid(pw->pw_gid) || setgid(pw->pw_gid) || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) err(1, "Can't drop privileges to \"nobody\""); diff --git a/tools/test/stress2/misc/mlockall7.sh b/tools/test/stress2/misc/mlockall7.sh index 987e312f19e7..5a927043cb56 100755 --- a/tools/test/stress2/misc/mlockall7.sh +++ b/tools/test/stress2/misc/mlockall7.sh @@ -179,7 +179,7 @@ testing(unsigned long maxl) maxlock = maxl; if ((pw = getpwnam("nobody")) == NULL) err(1, "failed to resolve nobody"); - if (setgroups(1, &pw->pw_gid) || + if (setgroups(0, NULL) || setegid(pw->pw_gid) || setgid(pw->pw_gid) || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) err(1, "Can't drop privileges to \"nobody\""); diff --git a/tools/test/stress2/misc/mmap43.sh b/tools/test/stress2/misc/mmap43.sh index 8508d5865aef..424e189b8b84 100755 --- a/tools/test/stress2/misc/mmap43.sh +++ b/tools/test/stress2/misc/mmap43.sh @@ -180,7 +180,7 @@ cd $here umount $mntpoint mdconfig -d -u $mdstart -rm /tmp/$prog /tmp/$prog.c /tmp/$prog.sort +rm /tmp/$prog /tmp/$prog.c /tmp/$prog.sort /tmp/$prog.serial.c /tmp/$prog.serial $log [ $s -eq 0 ] && printf "OK File size is %9d, tail is %4d bytes. (%3d loops)\n" $size $tail $counter || printf "FAIL File size is %9d, tail is %4d bytes. (%3d loops)\n" $size $tail $counter diff --git a/tools/test/stress2/misc/mountu.sh b/tools/test/stress2/misc/mountu.sh index abd3c744d160..95043e634ef1 100755 --- a/tools/test/stress2/misc/mountu.sh +++ b/tools/test/stress2/misc/mountu.sh @@ -241,7 +241,7 @@ main(int argc __unused, char **argv) if ((pw = getpwnam("nobody")) == NULL) err(1, "no such user: nobody"); - if (setgroups(1, &pw->pw_gid) || + if (setgroups(0, NULL) || setegid(pw->pw_gid) || setgid(pw->pw_gid) || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) err(1, "Can't drop privileges to \"nobody\""); diff --git a/tools/test/stress2/misc/msync.sh b/tools/test/stress2/misc/msync.sh index 326c7e723774..df05875afb45 100755 --- a/tools/test/stress2/misc/msync.sh +++ b/tools/test/stress2/misc/msync.sh @@ -166,7 +166,7 @@ main(void) if ((pw = getpwnam("nobody")) == NULL) err(1, "no such user: nobody"); - if (setgroups(1, &pw->pw_gid) || + if (setgroups(0, NULL) || setegid(pw->pw_gid) || setgid(pw->pw_gid) || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) err(1, "Can't drop privileges to \"nobody\""); diff --git a/tools/test/stress2/misc/nfs_halfpage.sh b/tools/test/stress2/misc/nfs_halfpage.sh index 8d02ca8ebbcf..b2f606e9607b 100755 --- a/tools/test/stress2/misc/nfs_halfpage.sh +++ b/tools/test/stress2/misc/nfs_halfpage.sh @@ -35,6 +35,11 @@ # https://reviews.freebsd.org/D11697 # Committed as r321580 + r321581. +[ -z "$nfs_export" ] && exit 0 +ping -c 2 `echo $nfs_export | sed 's/:.*//'` > /dev/null 2>&1 || + exit 0 + +mount | grep "$mntpoint" | grep -q nfs && umount $mntpoint dir=/tmp odir=`pwd` cd $dir @@ -43,11 +48,6 @@ mycc -o nfs_halfpage -Wall -Wextra -O0 -g nfs_halfpage.c || exit 1 rm -f nfs_halfpage.c cd $odir -[ -z "$nfs_export" ] && exit 0 -ping -c 2 `echo $nfs_export | sed 's/:.*//'` > /dev/null 2>&1 || - exit 0 - -mount | grep "$mntpoint" | grep -q nfs && umount $mntpoint mount -t nfs -o tcp -o retrycnt=3 -o intr,soft -o rw $nfs_export $mntpoint file=$mntpoint/nfs_halfpage.file diff --git a/tools/test/stress2/misc/nfs_halfpage2.sh b/tools/test/stress2/misc/nfs_halfpage2.sh index b916531c7a9d..8ca907f25e09 100755 --- a/tools/test/stress2/misc/nfs_halfpage2.sh +++ b/tools/test/stress2/misc/nfs_halfpage2.sh @@ -35,6 +35,10 @@ # https://reviews.freebsd.org/D11697 # Committed as r321580 + r321581. +[ -z "$nfs_export" ] && exit 0 +ping -c 2 `echo $nfs_export | sed 's/:.*//'` > /dev/null 2>&1 || + exit 0 + dir=/tmp odir=`pwd` cd $dir @@ -43,10 +47,6 @@ mycc -o nfs_halfpage -Wall -Wextra -O0 -g nfs_halfpage.c || exit 1 rm -f nfs_halfpage.c cd $odir -[ -z "$nfs_export" ] && exit 0 -ping -c 2 `echo $nfs_export | sed 's/:.*//'` > /dev/null 2>&1 || - exit 0 - mount | grep "$mntpoint" | grep -q nfs && umount $mntpoint mount -t nfs -o tcp -o retrycnt=3 -o intr,soft -o rw $nfs_export $mntpoint diff --git a/tools/test/stress2/misc/nullfs29.sh b/tools/test/stress2/misc/nullfs29.sh index aa606fd5f526..977e3c087523 100755 --- a/tools/test/stress2/misc/nullfs29.sh +++ b/tools/test/stress2/misc/nullfs29.sh @@ -73,5 +73,5 @@ while mount | grep $mp1 | grep -q /dev/md; do [ $n -gt 30 ] && { echo FAIL; s=2; } done mdconfig -d -u $mdstart -rm -f /tmp/nullfs29.c +rm -f /tmp/nullfs29.c /tmp/nullfs29 exit $s diff --git a/tools/test/stress2/misc/pread.sh b/tools/test/stress2/misc/pread.sh index 24ee2efb696a..985d3f643df1 100755 --- a/tools/test/stress2/misc/pread.sh +++ b/tools/test/stress2/misc/pread.sh @@ -170,7 +170,7 @@ main(int argc __unused, char **argv) if ((pw = getpwnam("nobody")) == NULL) err(1, "no such user: nobody"); - if (setgroups(1, &pw->pw_gid) || + if (setgroups(0, NULL) || setegid(pw->pw_gid) || setgid(pw->pw_gid) || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) err(1, "Can't drop privileges to \"nobody\""); diff --git a/tools/test/stress2/misc/rsync.sh b/tools/test/stress2/misc/rsync.sh index fa52f98c6f02..1e677c7c1f6c 100755 --- a/tools/test/stress2/misc/rsync.sh +++ b/tools/test/stress2/misc/rsync.sh @@ -31,7 +31,7 @@ if [ $s -eq 0 ]; then fi if [ $s -eq 0 ]; then - diff -rq /usr/src/sys $mntpoint/usr/src/sys > $log; s=$? + diff --no-dereference -rq /usr/src/sys $mntpoint/usr/src/sys > $log; s=$? [ $s -ne 0 ] && { echo "/usr/src $mntpoint/usr/src differ!"; head -10 $log; } fi diff --git a/tools/test/stress2/misc/rsync3.sh b/tools/test/stress2/misc/rsync3.sh index 1d77bdfbcaa5..e5e4db128b0f 100755 --- a/tools/test/stress2/misc/rsync3.sh +++ b/tools/test/stress2/misc/rsync3.sh @@ -30,7 +30,7 @@ if [ $s -eq 0 ]; then fi if [ $s -eq 0 ]; then - diff -rq /usr/src/sys $mntpoint/usr/src/sys > $log; s=$? + diff --no-dereference -rq /usr/src/sys $mntpoint/usr/src/sys > $log; s=$? [ $s -ne 0 ] && { echo "/usr/src $mntpoint/usr/src differ!"; head -10 $log; } fi diff --git a/tools/test/stress2/misc/sched.sh b/tools/test/stress2/misc/sched.sh index 1a1db70eb38a..8b33d7b16094 100755 --- a/tools/test/stress2/misc/sched.sh +++ b/tools/test/stress2/misc/sched.sh @@ -107,7 +107,7 @@ work(void) if ((pw = getpwnam("nobody")) == NULL) err(1, "no such user: nobody"); - if (setgroups(1, &pw->pw_gid) || + if (setgroups(0, NULL) || setegid(pw->pw_gid) || setgid(pw->pw_gid) || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) err(1, "Can't drop privileges to \"nobody\""); diff --git a/tools/test/stress2/misc/setrlimit2.sh b/tools/test/stress2/misc/setrlimit2.sh index 4eea25ef3ee4..8c717fe72458 100755 --- a/tools/test/stress2/misc/setrlimit2.sh +++ b/tools/test/stress2/misc/setrlimit2.sh @@ -114,5 +114,5 @@ h1=`md5 < $data` ./setrlimit2 $data h2=`md5 < $data` -rm -f /tmp/setrlimit2 /tmp/setrlimit2.c +rm -f /tmp/setrlimit2 /tmp/setrlimit2.c $data [ $h1 = $h2 ] && exit 1 || exit 0 diff --git a/tools/test/stress2/misc/sigreturn3.sh b/tools/test/stress2/misc/sigreturn3.sh index 271ade287e9a..6795c4fd0846 100755 --- a/tools/test/stress2/misc/sigreturn3.sh +++ b/tools/test/stress2/misc/sigreturn3.sh @@ -121,7 +121,7 @@ main(int argc, char **argv) fprintf(stderr, "Running syscall4 as root for %s.\n", argv[1]); else { - if (setgroups(1, &pw->pw_gid) || + if (setgroups(0, NULL) || setegid(pw->pw_gid) || setgid(pw->pw_gid) || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) err(1, "Can't drop privileges to \"nobody\""); @@ -177,5 +177,5 @@ start=`date +%s` while [ $((`date +%s` - start)) -lt 300 ]; do ./$prog > /dev/null 2>&1 done -rm -f /tmp/$prog /tmp/$ptog.c /tmp/$prog.core +rm -f /tmp/$prog /tmp/$prog.c /tmp/$prog.core exit 0 diff --git a/tools/test/stress2/misc/sigreturn4.sh b/tools/test/stress2/misc/sigreturn4.sh index 9e2a6a32715c..90ee16777e03 100755 --- a/tools/test/stress2/misc/sigreturn4.sh +++ b/tools/test/stress2/misc/sigreturn4.sh @@ -147,7 +147,7 @@ main(int argc, char **argv) fprintf(stderr, "Running sigreturn4 as root for %s.\n", argv[1]); else { - if (setgroups(1, &pw->pw_gid) || + if (setgroups(0, NULL) || setegid(pw->pw_gid) || setgid(pw->pw_gid) || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) err(1, "Can't drop privileges to \"nobody\""); @@ -203,5 +203,5 @@ start=`date +%s` while [ $((`date +%s` - start)) -lt 300 ]; do ./$prog > /dev/null 2>&1 done -rm -f /tmp/$prog /tmp/$ptog.c /tmp/$prog.core +rm -f /tmp/$prog /tmp/$prog.c /tmp/$prog.core exit 0 diff --git a/tools/test/stress2/misc/syscall4.sh b/tools/test/stress2/misc/syscall4.sh index 3937d45c0303..92150c782ac1 100755 --- a/tools/test/stress2/misc/syscall4.sh +++ b/tools/test/stress2/misc/syscall4.sh @@ -318,7 +318,7 @@ main(int argc, char **argv) fprintf(stderr, "Running syscall4 as root for %s.\n", argv[1]); else { - if (setgroups(1, &pw->pw_gid) || + if (setgroups(0, NULL) || setegid(pw->pw_gid) || setgid(pw->pw_gid) || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) err(1, "Can't drop privileges to \"nobody\""); diff --git a/tools/test/stress2/misc/syzkaller13.sh b/tools/test/stress2/misc/syzkaller13.sh index 9b46ebd290af..fe15652b0a25 100755 --- a/tools/test/stress2/misc/syzkaller13.sh +++ b/tools/test/stress2/misc/syzkaller13.sh @@ -246,4 +246,5 @@ pkill -9 syzkaller13 wait rm -f /tmp/syzkaller13 /tmp/syzkaller13.* /tmp/file0 +rm -rf /tmp/syzkaller.* exit 0 diff --git a/tools/test/stress2/misc/syzkaller21.sh b/tools/test/stress2/misc/syzkaller21.sh index 3a7eeb05ef6c..07eef4bc5861 100755 --- a/tools/test/stress2/misc/syzkaller21.sh +++ b/tools/test/stress2/misc/syzkaller21.sh @@ -398,6 +398,6 @@ if pgrep -q syzkaller21; then fi wait -rm -rf /tmp/syzkaller21.* +rm -rf /tmp/syzkaller21.* /tmp/syzkaller.* rm -f /tmp/syzkaller21 exit 0 diff --git a/tools/test/stress2/misc/syzkaller61.sh b/tools/test/stress2/misc/syzkaller61.sh index a25ae4cf00d8..d07f12b05b1a 100755 --- a/tools/test/stress2/misc/syzkaller61.sh +++ b/tools/test/stress2/misc/syzkaller61.sh @@ -1,15 +1,7 @@ #!/bin/sh -# Seen: -# [root@mercat1 /usr/src/tools/test/stress2/misc]# pgrep syzkaller61 | xargs procstat -k -# PID TID COMM TDNAME KSTACK -# 13332 106396 syzkaller61 - mi_switch thread_suspend_check ast_suspend ast_handler ast doreti_ast -# 13332 560662 syzkaller61 - mi_switch sleepq_switch sleepq_catch_signals sleepq_wait_sig _sleep umtxq_sleep do_wait __umtx_op_wait_uint_private sys__umtx_op amd64_syscall fast_syscall_common -# 13332 560776 syzkaller61 - mi_switch thread_suspend_switch thread_single fork1 sys_rfork amd64_syscall fast_syscall_common -# 13662 356440 syzkaller61 - mi_switch thread_suspend_check ast_suspend ast_handler ast doreti_ast -# 13662 561098 syzkaller61 - mi_switch sleepq_switch sleepq_catch_signals sleepq_wait_sig _sleep umtxq_sleep do_wait __umtx_op_wait_uint_private sys__umtx_op amd64_syscall fast_syscall_common -# 13662 561160 syzkaller61 - mi_switch thread_suspend_switch thread_single fork1 sys_rfork amd64_syscall fast_syscall_common -# [root@mercat1 /usr/src/tools/test/stress2/misc]# +# "panic: inconsistent boundary count 2" seen. +# Fixed by: 8321d0da2ce2 - main - kern/kern_thread.c: improve assert in thread_single_end() [ `uname -p` != "amd64" ] && exit 0 @@ -276,7 +268,7 @@ void execute_call(int call) { switch (call) { case 0: - NONFAILING(*(uint32_t*)0x20001f00 = 0x16); + NONFAILING(*(uint32_t*)0x20001f00 = 0x16); /* SIGTTOU */ NONFAILING(*(uint32_t*)0x20001f04 = 0); NONFAILING(*(uint32_t*)0x20001f08 = 0); NONFAILING(*(uint32_t*)0x20001f0c = 0); @@ -302,18 +294,16 @@ mycc -o /tmp/syzkaller61 -Wall -Wextra -O0 /tmp/syzkaller61.c -lpthread || (cd ../testcases/swap; ./swap -t 3m -i 10 -l 100 > /dev/null 2>&1) & for i in `jot 300`; do - (cd /tmp; timeout -k 3s 2s ./syzkaller61) & + (cd /tmp; su -m $testuser -c ./syzkaller61) & pids="$pids $!" done sleep 5 -pkill -9 syzkaller61 swap; sleep 1 -pgrep -q syzkaller61 && { pgrep syzkaller61 | xargs ps -lHp; exit 1; } -for pid in $pids; do - wait $pid -done +kill -9 $pids +wait $pids +while pkill -9 syzkaller61; do :; done while pkill swap; do :; done wait rm -rf /tmp/syzkaller61 /tmp/syzkaller61.c /tmp/syzkaller61.core \ /tmp/syzkaller.?????? -exit 0 +exit 0 diff --git a/tools/test/stress2/misc/syzkaller73.sh b/tools/test/stress2/misc/syzkaller73.sh index 776ace385f21..fa07dc7ff26f 100755 --- a/tools/test/stress2/misc/syzkaller73.sh +++ b/tools/test/stress2/misc/syzkaller73.sh @@ -533,5 +533,5 @@ done while pkill swap; do :; done wait -rm -rf /tmp/$prog /tmp/$prog.c /tmp/$prog.core +rm -rf /tmp/$prog /tmp/$prog.c /tmp/$prog.core /tmp/syzkaller.* exit 0 diff --git a/tools/test/stress2/misc/syzkaller74.sh b/tools/test/stress2/misc/syzkaller74.sh index 886c6047585b..0c2b4e1d5325 100755 --- a/tools/test/stress2/misc/syzkaller74.sh +++ b/tools/test/stress2/misc/syzkaller74.sh @@ -465,5 +465,5 @@ mycc -o /tmp/$prog -Wall -Wextra -O0 /tmp/$prog.c -lpthread || exit 1 cd /tmp timeout 3m /tmp/$prog > /dev/null 2>&1 -rm -rf /tmp/$prog /tmp/$prog.c /tmp/$prog.core /tmp/$prog.?????? +rm -rf /tmp/$prog /tmp/$prog.c /tmp/$prog.core /tmp/$prog.?????? /tmp/syzkaller.* exit 0 diff --git a/tools/test/stress2/misc/syzkaller84.sh b/tools/test/stress2/misc/syzkaller84.sh new file mode 100755 index 000000000000..a7976be2eeb6 --- /dev/null +++ b/tools/test/stress2/misc/syzkaller84.sh @@ -0,0 +1,402 @@ +#!/bin/sh + +# panic: Assertion !(sb->sb_state & SBS_CANTRCVMORE) failed at ../../../kern/uipc_usrreq.c:1549 +# cpuid = 6 +# time = 1754809105 +# KDB: stack backtrace: +# db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame 0xfffffe0176ef6a80 +# vpanic() at vpanic+0x136/frame 0xfffffe0176ef6bb0 +# panic() at panic+0x43/frame 0xfffffe0176ef6c10 +# uipc_soreceive_stream_or_seqpacket() at uipc_soreceive_stream_or_seqpacket+0x968/frame 0xfffffe0176ef6cd0 +# soreceive() at soreceive+0x45/frame 0xfffffe0176ef6cf0 +# kern_recvit() at kern_recvit+0x181/frame 0xfffffe0176ef6da0 +# sys_recvmsg() at sys_recvmsg+0x67/frame 0xfffffe0176ef6e00 +# amd64_syscall() at amd64_syscall+0x169/frame 0xfffffe0176ef6f30 +# fast_syscall_common() at fast_syscall_common+0xf8/frame 0xfffffe0176ef6f30 +# --- syscall (0, FreeBSD ELF64, syscall), rip = 0x821d3da8a, rsp = 0x824440f68, rbp = 0x824440f90 --- +# KDB: enter: panic +# [ thread pid 17448 tid 292963 ] +# Stopped at kdb_enter+0x33: movq $0,0x12304a2(%rip) +# db> x/s version +# version: FreeBSD 15.0-PRERELEASE #0 main-n279510-db7c0e32a05d-dirty: Sat Aug 9 17:21:54 CEST 2025 +# pho@mercat1.netperf.freebsd.org:/usr/src/sys/amd64/compile/PHO +# db> + +[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 + +. ../default.cfg +set -u +prog=$(basename "$0" .sh) +cat > /tmp/$prog.c <<EOF +// https://syzkaller.appspot.com/bug?id=79d6de939eb5c7de69e8e4993b6239aa0ae67335 +// autogenerated by syzkaller (https://github.com/google/syzkaller) +// syzbot+ffcc3612ea266e36604e@syzkaller.appspotmail.com + +#define _GNU_SOURCE + +#include <sys/types.h> + +#include <errno.h> +#include <pthread.h> +#include <pwd.h> +#include <signal.h> +#include <stdarg.h> +#include <stdbool.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/endian.h> +#include <sys/resource.h> +#include <sys/syscall.h> +#include <sys/wait.h> +#include <time.h> +#include <unistd.h> + +static unsigned long long procid; + +static void kill_and_wait(int pid, int* status) +{ + kill(pid, SIGKILL); + while (waitpid(-1, status, 0) != pid) { + } +} + +static void sleep_ms(uint64_t ms) +{ + usleep(ms * 1000); +} + +static uint64_t current_time_ms(void) +{ + struct timespec ts; + if (clock_gettime(CLOCK_MONOTONIC, &ts)) + exit(1); + return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000; +} + +static void thread_start(void* (*fn)(void*), void* arg) +{ + pthread_t th; + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setstacksize(&attr, 128 << 10); + int i = 0; + for (; i < 100; i++) { + if (pthread_create(&th, &attr, fn, arg) == 0) { + pthread_attr_destroy(&attr); + return; + } + if (errno == EAGAIN) { + usleep(50); + continue; + } + break; + } + exit(1); +} + +typedef struct { + pthread_mutex_t mu; + pthread_cond_t cv; + int state; +} event_t; + +static void event_init(event_t* ev) +{ + if (pthread_mutex_init(&ev->mu, 0)) + exit(1); + if (pthread_cond_init(&ev->cv, 0)) + exit(1); + ev->state = 0; +} + +static void event_reset(event_t* ev) +{ + ev->state = 0; +} + +static void event_set(event_t* ev) +{ + pthread_mutex_lock(&ev->mu); + if (ev->state) + exit(1); + ev->state = 1; + pthread_mutex_unlock(&ev->mu); + pthread_cond_broadcast(&ev->cv); +} + +static void event_wait(event_t* ev) +{ + pthread_mutex_lock(&ev->mu); + while (!ev->state) + pthread_cond_wait(&ev->cv, &ev->mu); + pthread_mutex_unlock(&ev->mu); +} + +static int event_isset(event_t* ev) +{ + pthread_mutex_lock(&ev->mu); + int res = ev->state; + pthread_mutex_unlock(&ev->mu); + return res; +} + +static int event_timedwait(event_t* ev, uint64_t timeout) +{ + uint64_t start = current_time_ms(); + uint64_t now = start; + pthread_mutex_lock(&ev->mu); + for (;;) { + if (ev->state) + break; + uint64_t remain = timeout - (now - start); + struct timespec ts; + ts.tv_sec = remain / 1000; + ts.tv_nsec = (remain % 1000) * 1000 * 1000; + pthread_cond_timedwait(&ev->cv, &ev->mu, &ts); + now = current_time_ms(); + if (now - start > timeout) + break; + } + int res = ev->state; + pthread_mutex_unlock(&ev->mu); + return res; +} + +static void sandbox_common() +{ + struct rlimit rlim; + rlim.rlim_cur = rlim.rlim_max = 128 << 20; + setrlimit(RLIMIT_AS, &rlim); + rlim.rlim_cur = rlim.rlim_max = 8 << 20; + setrlimit(RLIMIT_MEMLOCK, &rlim); + rlim.rlim_cur = rlim.rlim_max = 1 << 20; + setrlimit(RLIMIT_FSIZE, &rlim); + rlim.rlim_cur = rlim.rlim_max = 1 << 20; + setrlimit(RLIMIT_STACK, &rlim); + rlim.rlim_cur = rlim.rlim_max = 0; + setrlimit(RLIMIT_CORE, &rlim); + rlim.rlim_cur = rlim.rlim_max = 256; + setrlimit(RLIMIT_NOFILE, &rlim); +} + +static void loop(); + +static int do_sandbox_none(void) +{ + sandbox_common(); + loop(); + return 0; +} + +struct thread_t { + int created, call; + event_t ready, done; +}; + +static struct thread_t threads[16]; +static void execute_call(int call); +static int running; + +static void* thr(void* arg) +{ + struct thread_t* th = (struct thread_t*)arg; + for (;;) { + event_wait(&th->ready); + event_reset(&th->ready); + execute_call(th->call); + __atomic_fetch_sub(&running, 1, __ATOMIC_RELAXED); + event_set(&th->done); + } + return 0; +} + +static void execute_one(void) +{ + if (write(1, "executing program\n", sizeof("executing program\n") - 1)) { + } + int i, call, thread; + for (call = 0; call < 4; call++) { + for (thread = 0; thread < (int)(sizeof(threads) / sizeof(threads[0])); + thread++) { + struct thread_t* th = &threads[thread]; + if (!th->created) { + th->created = 1; + event_init(&th->ready); + event_init(&th->done); + event_set(&th->done); + thread_start(thr, th); + } + if (!event_isset(&th->done)) + continue; + event_reset(&th->done); + th->call = call; + __atomic_fetch_add(&running, 1, __ATOMIC_RELAXED); + event_set(&th->ready); + event_timedwait(&th->done, 50); + break; + } + } + for (i = 0; i < 100 && __atomic_load_n(&running, __ATOMIC_RELAXED); i++) + sleep_ms(1); +} + +static void execute_one(void); + +#define WAIT_FLAGS 0 + +static void loop(void) +{ +// int iter = 0; + for (;; /*iter++*/) { + int pid = fork(); + if (pid < 0) + exit(1); + if (pid == 0) { + execute_one(); + exit(0); + } + int status = 0; + uint64_t start = current_time_ms(); + for (;;) { + sleep_ms(10); + if (waitpid(-1, &status, WNOHANG | WAIT_FLAGS) == pid) + break; + if (current_time_ms() - start < 5000) + continue; + kill_and_wait(pid, &status); + break; + } + } +} + +uint64_t r[2] = {0xffffffffffffffff, 0xffffffffffffffff}; + +void execute_call(int call) +{ + intptr_t res = 0; + switch (call) { + case 0: + // socketpair\$unix arguments: [ + // domain: const = 0x1 (8 bytes) + // type: unix_socket_type = 0x5 (8 bytes) + // proto: const = 0x0 (1 bytes) + // fds: ptr[out, unix_pair] { + // unix_pair { + // fd0: sock_unix (resource) + // fd1: sock_unix (resource) + // } + // } + // ] + res = syscall(SYS_socketpair, /*domain=*/1ul, /*type=SOCK_SEQPACKET*/ 5ul, + /*proto=*/0, /*fds=*/0x200000000440ul); + if (res != -1) { + r[0] = *(uint32_t*)0x200000000440; + r[1] = *(uint32_t*)0x200000000444; + } + break; + case 1: + // sendmsg arguments: [ + // fd: sock (resource) + // msg: ptr[in, send_msghdr] { + // send_msghdr { + // msg_name: nil + // msg_namelen: len = 0x0 (4 bytes) + // pad = 0x0 (4 bytes) + // msg_iov: nil + // msg_iovlen: len = 0x0 (8 bytes) + // msg_control: ptr[inout, array[ANYUNION]] { + // array[ANYUNION] { + // union ANYUNION { + // ANYBLOB: buffer: {04 01 00 00 ff ff 00 00 01} (length 0x9) + // } + // } + // } + // msg_controllen: bytesize = 0x104 (8 bytes) + // msg_flags: const = 0x0 (4 bytes) + // pad = 0x0 (4 bytes) + // } + // } + // f: send_flags = 0x0 (8 bytes) + // ] + *(uint64_t*)0x200000000000 = 0; + *(uint32_t*)0x200000000008 = 0; + *(uint64_t*)0x200000000010 = 0; + *(uint64_t*)0x200000000018 = 0; + *(uint64_t*)0x200000000020 = 0x2000000007c0; + memcpy((void*)0x2000000007c0, "\x04\x01\x00\x00\xff\xff\x00\x00\x01", 9); + *(uint64_t*)0x200000000028 = 0x104; + *(uint32_t*)0x200000000030 = 0; + syscall(SYS_sendmsg, /*fd=*/r[1], /*msg=*/0x200000000000ul, /*f=*/0ul); + for (int i = 0; i < 32; i++) { + syscall(SYS_sendmsg, /*fd=*/r[1], /*msg=*/0x200000000000ul, /*f=*/0ul); + } + break; + case 2: + // close arguments: [ + // fd: fd (resource) + // ] + syscall(SYS_close, /*fd=*/r[1]); + break; + case 3: + // recvmsg arguments: [ + // fd: sock (resource) + // msg: ptr[inout, recv_msghdr] { + // recv_msghdr { + // msg_name: nil + // msg_namelen: len = 0x0 (4 bytes) + // pad = 0x0 (4 bytes) + // msg_iov: nil + // msg_iovlen: len = 0x0 (8 bytes) + // msg_control: ptr[out, buffer] { + // buffer: (DirOut) + // } + // msg_controllen: len = 0x19 (8 bytes) + // msg_flags: const = 0x0 (4 bytes) + // pad = 0x0 (4 bytes) + // } + // } + // f: recv_flags = 0x80 (8 bytes) + // ] + *(uint64_t*)0x2000000005c0 = 0; + *(uint32_t*)0x2000000005c8 = 0; + *(uint64_t*)0x2000000005d0 = 0; + *(uint64_t*)0x2000000005d8 = 0; + *(uint64_t*)0x2000000005e0 = 0x200000000580; + *(uint64_t*)0x2000000005e8 = 0x19; + *(uint32_t*)0x2000000005f0 = 0; + syscall(SYS_recvmsg, /*fd=*/r[0], /*msg=*/0x2000000005c0ul, + /*f=MSG_DONTWAIT*/ 0x80ul); + break; + } +} +int main(void) +{ + syscall(SYS_mmap, /*addr=*/0x200000000000ul, /*len=*/0x1000000ul, + /*prot=PROT_WRITE|PROT_READ|PROT_EXEC*/ 7ul, + /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x1012ul, + /*fd=*/(intptr_t)-1, /*offset=*/0ul); + const char* reason; + (void)reason; + for (procid = 0; procid < 4; procid++) { + if (fork() == 0) { + do_sandbox_none(); + } + } + sleep(1000000); + return 0; +} +EOF +mycc -o /tmp/$prog -Wall -Wextra -O0 /tmp/$prog.c -pthread || exit 1 + +work=/tmp/$prog.dir +rm -rf $work +mkdir $work +cd /tmp/$prog.dir +kldstat | grep -q sctp || { kldload sctp.ko && loaded=1; } +timeout 3m /tmp/$prog > /dev/null 2>&1 + +rm -rf /tmp/$prog /tmp/$prog.c /tmp/$prog.core $work +[ $loaded ] && kldunload sctp.ko +exit 0 diff --git a/tools/test/stress2/misc/syzkaller85.sh b/tools/test/stress2/misc/syzkaller85.sh new file mode 100755 index 000000000000..1772c0dc58b8 --- /dev/null +++ b/tools/test/stress2/misc/syzkaller85.sh @@ -0,0 +1,499 @@ +#!/bin/sh + +# panic: Assertion uio->uio_resid < 0 failed at ../../../netlink/netlink_domain.c:808 +# cpuid = 8 +# time = 1759044376 +# KDB: stack backtrace: +# db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame 0xfffffe0184d17a70 +# vpanic() at vpanic+0x136/frame 0xfffffe0184d17ba0 +# panic() at panic+0x43/frame 0xfffffe0184d17c00 +# nl_soreceive() at nl_soreceive+0x433/frame 0xfffffe0184d17ca0 +# soreceive() at soreceive+0x45/frame 0xfffffe0184d17cc0 +# kern_recvit() at kern_recvit+0x181/frame 0xfffffe0184d17d70 +# sys_recvfrom() at sys_recvfrom+0xa2/frame 0xfffffe0184d17e00 +# amd64_syscall() at amd64_syscall+0x169/frame 0xfffffe0184d17f30 +# fast_syscall_common() at fast_syscall_common+0xf8/frame 0xfffffe0184d17f30 +# --- syscall (0, FreeBSD ELF64, syscall), rip = 0x822882cca, rsp = 0x823572e88, rbp = 0x823572f90 --- +# KDB: enter: panic +# [ thread pid 11012 tid 138112 ] +# Stopped at $0,0x121a722(%rip) +# db> x/s version +# version: FreeBSD 16.0-CURRENT #0 main-n280667-52eb7e394a7e-dirty: Sun Sep 28 08:56:14 CEST 2025 +# pho@mercat1.netperf.freebsd.org:/usr/src/sys/amd64/compile/PHO +# db> + +[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 + +. ../default.cfg +set -u +prog=$(basename "$0" .sh) +cat > /tmp/$prog.c <<EOF +// https://syzkaller.appspot.com/bug?id=e33cdff88b17af77553159c4b372cac4e4bcd652 +// autogenerated by syzkaller (https://github.com/google/syzkaller) +// syzbot+194f95f2c5fdffef1ef5@syzkaller.appspotmail.com + +#define _GNU_SOURCE + +#include <sys/types.h> + +#include <dirent.h> +#include <errno.h> +#include <pthread.h> +#include <pwd.h> +#include <setjmp.h> +#include <signal.h> +#include <stdarg.h> +#include <stdbool.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/endian.h> +#include <sys/resource.h> +#include <sys/stat.h> +#include <sys/syscall.h> +#include <sys/wait.h> +#include <time.h> +#include <unistd.h> + +static unsigned long long procid; + +static __thread int clone_ongoing; +static __thread int skip_segv; +static __thread jmp_buf segv_env; + +static void segv_handler(int sig, siginfo_t* info, void* ctx __unused) +{ + if (__atomic_load_n(&clone_ongoing, __ATOMIC_RELAXED) != 0) { + exit(sig); + } + uintptr_t addr = (uintptr_t)info->si_addr; + const uintptr_t prog_start = 1 << 20; + const uintptr_t prog_end = 100 << 20; + int skip = __atomic_load_n(&skip_segv, __ATOMIC_RELAXED) != 0; + int valid = addr < prog_start || addr > prog_end; + if (sig == SIGBUS) + valid = 1; + if (skip && valid) { + _longjmp(segv_env, 1); + } + exit(sig); +} + +static void install_segv_handler(void) +{ + struct sigaction sa; + memset(&sa, 0, sizeof(sa)); + sa.sa_sigaction = segv_handler; + sa.sa_flags = SA_NODEFER | SA_SIGINFO; + sigaction(SIGSEGV, &sa, NULL); + sigaction(SIGBUS, &sa, NULL); +} + +#define NONFAILING(...) \ + ({ \ + int ok = 1; \ + __atomic_fetch_add(&skip_segv, 1, __ATOMIC_SEQ_CST); \ + if (_setjmp(segv_env) == 0) { \ + __VA_ARGS__; \ + } else \ + ok = 0; \ + __atomic_fetch_sub(&skip_segv, 1, __ATOMIC_SEQ_CST); \ + ok; \ + }) + +static void kill_and_wait(int pid, int* status) +{ + kill(pid, SIGKILL); + while (waitpid(-1, status, 0) != pid) { + } +} + +static void sleep_ms(uint64_t ms) +{ + usleep(ms * 1000); +} + +static uint64_t current_time_ms(void) +{ + struct timespec ts; + if (clock_gettime(CLOCK_MONOTONIC, &ts)) + exit(1); + return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000; +} + +static void use_temporary_dir(void) +{ + char tmpdir_template[] = "./syzkaller.XXXXXX"; + char* tmpdir = mkdtemp(tmpdir_template); + if (!tmpdir) + exit(1); + if (chmod(tmpdir, 0777)) + exit(1); + if (chdir(tmpdir)) + exit(1); +} + +static void reset_flags(const char* filename) +{ + struct stat st; + if (lstat(filename, &st)) + exit(1); + st.st_flags &= ~(SF_NOUNLINK | UF_NOUNLINK | SF_IMMUTABLE | UF_IMMUTABLE | + SF_APPEND | UF_APPEND); + if (lchflags(filename, st.st_flags)) + exit(1); +} +static void __attribute__((noinline)) remove_dir(const char* dir) +{ + DIR* dp = opendir(dir); + if (dp == NULL) { + if (errno == EACCES) { + if (rmdir(dir)) + exit(1); + return; + } + exit(1); + } + struct dirent* ep = 0; + while ((ep = readdir(dp))) { + if (strcmp(ep->d_name, ".") == 0 || strcmp(ep->d_name, "..") == 0) + continue; + char filename[FILENAME_MAX]; + snprintf(filename, sizeof(filename), "%s/%s", dir, ep->d_name); + struct stat st; + if (lstat(filename, &st)) + exit(1); + if (S_ISDIR(st.st_mode)) { + remove_dir(filename); + continue; + } + if (unlink(filename)) { + if (errno == EPERM) { + reset_flags(filename); + reset_flags(dir); + if (unlink(filename) == 0) + continue; + } + exit(1); + } + } + closedir(dp); + while (rmdir(dir)) { + if (errno == EPERM) { + reset_flags(dir); + if (rmdir(dir) == 0) + break; + } + exit(1); + } +} + +static void thread_start(void* (*fn)(void*), void* arg) +{ + pthread_t th; + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setstacksize(&attr, 128 << 10); + int i = 0; + for (; i < 100; i++) { + if (pthread_create(&th, &attr, fn, arg) == 0) { + pthread_attr_destroy(&attr); + return; + } + if (errno == EAGAIN) { + usleep(50); + continue; + } + break; + } + exit(1); +} + +typedef struct { + pthread_mutex_t mu; + pthread_cond_t cv; + int state; +} event_t; + +static void event_init(event_t* ev) +{ + if (pthread_mutex_init(&ev->mu, 0)) + exit(1); + if (pthread_cond_init(&ev->cv, 0)) + exit(1); + ev->state = 0; +} + +static void event_reset(event_t* ev) +{ + ev->state = 0; +} + +static void event_set(event_t* ev) +{ + pthread_mutex_lock(&ev->mu); + if (ev->state) + exit(1); + ev->state = 1; + pthread_mutex_unlock(&ev->mu); + pthread_cond_broadcast(&ev->cv); +} + +static void event_wait(event_t* ev) +{ + pthread_mutex_lock(&ev->mu); + while (!ev->state) + pthread_cond_wait(&ev->cv, &ev->mu); + pthread_mutex_unlock(&ev->mu); +} + +static int event_isset(event_t* ev) +{ + pthread_mutex_lock(&ev->mu); + int res = ev->state; + pthread_mutex_unlock(&ev->mu); + return res; +} + +static int event_timedwait(event_t* ev, uint64_t timeout) +{ + uint64_t start = current_time_ms(); + uint64_t now = start; + pthread_mutex_lock(&ev->mu); + for (;;) { + if (ev->state) + break; + uint64_t remain = timeout - (now - start); + struct timespec ts; + ts.tv_sec = remain / 1000; + ts.tv_nsec = (remain % 1000) * 1000 * 1000; + pthread_cond_timedwait(&ev->cv, &ev->mu, &ts); + now = current_time_ms(); + if (now - start > timeout) + break; + } + int res = ev->state; + pthread_mutex_unlock(&ev->mu); + return res; +} + +static void sandbox_common() +{ + struct rlimit rlim; + rlim.rlim_cur = rlim.rlim_max = 128 << 20; + setrlimit(RLIMIT_AS, &rlim); + rlim.rlim_cur = rlim.rlim_max = 8 << 20; + setrlimit(RLIMIT_MEMLOCK, &rlim); + rlim.rlim_cur = rlim.rlim_max = 1 << 20; + setrlimit(RLIMIT_FSIZE, &rlim); + rlim.rlim_cur = rlim.rlim_max = 1 << 20; + setrlimit(RLIMIT_STACK, &rlim); + rlim.rlim_cur = rlim.rlim_max = 0; + setrlimit(RLIMIT_CORE, &rlim); + rlim.rlim_cur = rlim.rlim_max = 256; + setrlimit(RLIMIT_NOFILE, &rlim); +} + +static void loop(); + +static int do_sandbox_none(void) +{ + sandbox_common(); + loop(); + return 0; +} + +struct thread_t { + int created, call; + event_t ready, done; +}; + +static struct thread_t threads[16]; +static void execute_call(int call); +static int running; + +static void* thr(void* arg) +{ + struct thread_t* th = (struct thread_t*)arg; + for (;;) { + event_wait(&th->ready); + event_reset(&th->ready); + execute_call(th->call); + __atomic_fetch_sub(&running, 1, __ATOMIC_RELAXED); + event_set(&th->done); + } + return 0; +} + +static void execute_one(void) +{ + if (write(1, "executing program\n", sizeof("executing program\n") - 1)) { + } + int i, call, thread; + for (call = 0; call < 3; call++) { + for (thread = 0; thread < (int)(sizeof(threads) / sizeof(threads[0])); + thread++) { + struct thread_t* th = &threads[thread]; + if (!th->created) { + th->created = 1; + event_init(&th->ready); + event_init(&th->done); + event_set(&th->done); + thread_start(thr, th); + } + if (!event_isset(&th->done)) + continue; + event_reset(&th->done); + th->call = call; + __atomic_fetch_add(&running, 1, __ATOMIC_RELAXED); + event_set(&th->ready); + event_timedwait(&th->done, 50); + break; + } + } + for (i = 0; i < 100 && __atomic_load_n(&running, __ATOMIC_RELAXED); i++) + sleep_ms(1); +} + +static void execute_one(void); + +#define WAIT_FLAGS 0 + +static void loop(void) +{ + int iter = 0; + for (;; iter++) { + char cwdbuf[32]; + sprintf(cwdbuf, "./%d", iter); + if (mkdir(cwdbuf, 0777)) + exit(1); + int pid = fork(); + if (pid < 0) + exit(1); + if (pid == 0) { + if (chdir(cwdbuf)) + exit(1); + execute_one(); + exit(0); + } + int status = 0; + uint64_t start = current_time_ms(); + for (;;) { + sleep_ms(10); + if (waitpid(-1, &status, WNOHANG | WAIT_FLAGS) == pid) + break; + if (current_time_ms() - start < 5000) + continue; + kill_and_wait(pid, &status); + break; + } + remove_dir(cwdbuf); + } +} + +uint64_t r[1] = {0xffffffffffffffff}; + +void execute_call(int call) +{ + intptr_t res = 0; + switch (call) { + case 0: + // socket arguments: [ + // domain: socket_domain = 0x26 (8 bytes) + // type: socket_type = 0x2 (8 bytes) + // proto: int8 = 0x0 (1 bytes) + // ] + // returns sock + res = syscall(SYS_socket, /*domain=AF_INET|0x24*/ 0x26ul, + /*type=SOCK_DGRAM*/ 2ul, /*proto=*/0); + if (res != -1) + r[0] = res; + break; + case 1: + // bind arguments: [ + // fd: sock (resource) + // addr: ptr[in, sockaddr_storage] { + // union sockaddr_storage { + // in6: sockaddr_in6 { + // len: len = 0x22 (1 bytes) + // family: const = 0x1c (1 bytes) + // port: proc = 0x3 (2 bytes) + // flow: int32 = 0x0 (4 bytes) + // addr: union ipv6_addr { + // mcast1: ipv6_addr_multicast1 { + // a0: const = 0xff (1 bytes) + // a1: const = 0x1 (1 bytes) + // a2: buffer: {00 00 00 00 00 00 00 00 00 00 00 00 00} (length + // 0xd) a3: const = 0x1 (1 bytes) + // } + // } + // scope: int32 = 0x0 (4 bytes) + // } + // } + // } + // addrlen: len = 0xc (8 bytes) + // ] + NONFAILING(*(uint8_t*)0x200000000040 = 0x22); + NONFAILING(*(uint8_t*)0x200000000041 = 0x1c); + NONFAILING(*(uint16_t*)0x200000000042 = htobe16(0x4e23 + procid * 4)); + NONFAILING(*(uint32_t*)0x200000000044 = 0); + NONFAILING(*(uint8_t*)0x200000000048 = -1); + NONFAILING(*(uint8_t*)0x200000000049 = 1); + NONFAILING(memset((void*)0x20000000004a, 0, 13)); + NONFAILING(*(uint8_t*)0x200000000057 = 1); + NONFAILING(*(uint32_t*)0x200000000058 = 0); + syscall(SYS_bind, /*fd=*/r[0], /*addr=*/0x200000000040ul, + /*addrlen=*/0xcul); + break; + case 2: + // recvfrom\$inet arguments: [ + // fd: sock_in (resource) + // buf: nil + // len: len = 0x51 (8 bytes) + // f: recv_flags = 0x401313ab1a02f21f (8 bytes) + // addr: nil + // addrlen: len = 0x0 (8 bytes) + // ] + syscall(SYS_recvfrom, /*fd=*/r[0], /*buf=*/0ul, /*len=*/0x51ul, + /*f=MSG_PEEK|MSG_OOB|0x401313ab1a02f21c*/ 0x401313ab1a02f21ful, + /*addr=*/0ul, /*addrlen=*/0ul); + break; + } +} +int main(void) +{ + syscall(SYS_mmap, /*addr=*/0x200000000000ul, /*len=*/0x1000000ul, + /*prot=PROT_WRITE|PROT_READ|PROT_EXEC*/ 7ul, + /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x1012ul, + /*fd=*/(intptr_t)-1, /*offset=*/0ul); + const char* reason; + (void)reason; + install_segv_handler(); + for (procid = 0; procid < 4; procid++) { + if (fork() == 0) { + use_temporary_dir(); + do_sandbox_none(); + } + } + sleep(1000000); + return 0; +} +EOF +mycc -o /tmp/$prog -Wall -Wextra -O0 /tmp/$prog.c -pthread || exit 1 + +(cd ../testcases/swap; ./swap -t 5m -i 20 -l 100 > /dev/null 2>&1) & +sleep 5 + +work=/tmp/$prog.dir +rm -rf $work +mkdir $work +cd /tmp/$prog.dir + +timeout 5m /tmp/$prog > /dev/null 2>&1 + +while pkill swap; do :; done +wait + +rm -rf /tmp/$prog /tmp/$prog.c /tmp/$prog.core /tmp/syzkaller.?????? $work +exit 0 diff --git a/tools/test/stress2/misc/syzkaller86.sh b/tools/test/stress2/misc/syzkaller86.sh new file mode 100755 index 000000000000..12922a2d05fa --- /dev/null +++ b/tools/test/stress2/misc/syzkaller86.sh @@ -0,0 +1,555 @@ +#!/bin/sh + +# Fatal trap 12: page fault while in kernel mode +# cpuid = 1; apic id = 01 +# fault virtual address = 0x18 +# fault code = supervisor read data, page not present +# instruction pointer = 0x20:0xffffffff80b69835 +# stack pointer = 0x28:0xfffffe00ff8e7d90 +# frame pointer = 0x28:0xfffffe00ff8e7d90 +# code segment = base 0x0, limit 0xfffff, type 0x1b +# = DPL 0, pres 1, long 1, def32 0, gran 1 +# processor eflags = interrupt enabled, resume, IOPL = 0 +# current process = 0 (thread taskq) +# rdi: 0000000000000018 rsi: 0000000000000004 rdx: ffffffff812b3f65 +# rcx: 00000000000008ba r8: fffff800044b8780 r9: fffff80003397000 +# rax: 0000000000000001 rbx: fffff8004221fa00 rbp: fffffe00ff8e7d90 +# r10: 0000000000000001 r11: fffffe00dc47b000 r12: fffffe0177ed0000 +# r13: fffff800044b8780 r14: fffff8004221f800 r15: fffff8004221f800 +# trap number = 12 +# panic: page fault +# cpuid = 1 +# time = 1759322830 +# KDB: stack backtrace: +# db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame 0xfffffe00ff8e7ac0 +# vpanic() at vpanic+0x136/frame 0xfffffe00ff8e7bf0 +# panic() at panic+0x43/frame 0xfffffe00ff8e7c50 +# trap_pfault() at trap_pfault+0x47c/frame 0xfffffe00ff8e7cc0 +# calltrap() at calltrap+0x8/frame 0xfffffe00ff8e7cc0 +# --- trap 0xc, rip = 0xffffffff80b69835, rsp = 0xfffffe00ff8e7d90, rbp = 0xfffffe00ff8e7d90 --- +# __mtx_assert() at __mtx_assert+0x35/frame 0xfffffe00ff8e7d90 +# ktls_check_rx() at ktls_check_rx+0x2f/frame 0xfffffe00ff8e7dd0 +# socantrcvmore() at socantrcvmore+0x5e/frame 0xfffffe00ff8e7df0 +# unp_gc() at unp_gc+0x5df/frame 0xfffffe00ff8e7e40 +# taskqueue_run_locked() at taskqueue_run_locked+0x1c2/frame 0xfffffe00ff8e7ec0 +# taskqueue_thread_loop() at taskqueue_thread_loop+0xd3/frame 0xfffffe00ff8e7ef0 +# fork_exit() at fork_exit+0x82/frame 0xfffffe00ff8e7f30 +# fork_trampoline() at fork_trampoline+0xe/frame 0xfffffe00ff8e7f30 +# --- trap 0, rip = 0, rsp = 0, rbp = 0 --- +# KDB: enter: panic +# [ thread pid 0 tid 100045 ] +# Stopped at kdb_enter+0x33: movq $0,0x121a9e2(%rip) +# db> x/s version +# version: FreeBSD 16.0-CURRENT #0 vmfqe-n280784-b7f165e45d6d: Wed Oct 1 13:48:43 CEST 2025 +# pho@mercat1.netperf.freebsd.org:/var/tmp/deviant3/sys/amd64/compile/PHO +# db> + +[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 + +. ../default.cfg +set -u +prog=$(basename "$0" .sh) +cat > /tmp/$prog.c <<EOF +// https://syzkaller.appspot.com/bug?id=ec40fe3e3e2b41218d1d417bc10d0be2517bf751 +// autogenerated by syzkaller (https://github.com/google/syzkaller) +// syzbot+a62883292a5c257703be@syzkaller.appspotmail.com + +#define _GNU_SOURCE + +#include <sys/types.h> + +#include <dirent.h> +#include <errno.h> +#include <pthread.h> +#include <pwd.h> +#include <signal.h> +#include <stdarg.h> +#include <stdbool.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/endian.h> +#include <sys/resource.h> +#include <sys/stat.h> +#include <sys/syscall.h> +#include <sys/wait.h> +#include <time.h> +#include <unistd.h> + +static unsigned long long procid; + +static void kill_and_wait(int pid, int* status) +{ + kill(pid, SIGKILL); + while (waitpid(-1, status, 0) != pid) { + } +} + +static void sleep_ms(uint64_t ms) +{ + usleep(ms * 1000); +} + +static uint64_t current_time_ms(void) +{ + struct timespec ts; + if (clock_gettime(CLOCK_MONOTONIC, &ts)) + exit(1); + return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000; +} + +static void use_temporary_dir(void) +{ + char tmpdir_template[] = "./syzkaller.XXXXXX"; + char* tmpdir = mkdtemp(tmpdir_template); + if (!tmpdir) + exit(1); + if (chmod(tmpdir, 0777)) + exit(1); + if (chdir(tmpdir)) + exit(1); +} + +static void reset_flags(const char* filename) +{ + struct stat st; + if (lstat(filename, &st)) + exit(1); + st.st_flags &= ~(SF_NOUNLINK | UF_NOUNLINK | SF_IMMUTABLE | UF_IMMUTABLE | + SF_APPEND | UF_APPEND); + if (lchflags(filename, st.st_flags)) + exit(1); +} +static void __attribute__((noinline)) remove_dir(const char* dir) +{ + DIR* dp = opendir(dir); + if (dp == NULL) { + if (errno == EACCES) { + if (rmdir(dir)) + exit(1); + return; + } + exit(1); + } + struct dirent* ep = 0; + while ((ep = readdir(dp))) { + if (strcmp(ep->d_name, ".") == 0 || strcmp(ep->d_name, "..") == 0) + continue; + char filename[FILENAME_MAX]; + snprintf(filename, sizeof(filename), "%s/%s", dir, ep->d_name); + struct stat st; + if (lstat(filename, &st)) + exit(1); + if (S_ISDIR(st.st_mode)) { + remove_dir(filename); + continue; + } + if (unlink(filename)) { + if (errno == EPERM) { + reset_flags(filename); + reset_flags(dir); + if (unlink(filename) == 0) + continue; + } + exit(1); + } + } + closedir(dp); + while (rmdir(dir)) { + if (errno == EPERM) { + reset_flags(dir); + if (rmdir(dir) == 0) + break; + } + exit(1); + } +} + +static void thread_start(void* (*fn)(void*), void* arg) +{ + pthread_t th; + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setstacksize(&attr, 128 << 10); + int i = 0; + for (; i < 100; i++) { + if (pthread_create(&th, &attr, fn, arg) == 0) { + pthread_attr_destroy(&attr); + return; + } + if (errno == EAGAIN) { + usleep(50); + continue; + } + break; + } + exit(1); +} + +typedef struct { + pthread_mutex_t mu; + pthread_cond_t cv; + int state; +} event_t; + +static void event_init(event_t* ev) +{ + if (pthread_mutex_init(&ev->mu, 0)) + exit(1); + if (pthread_cond_init(&ev->cv, 0)) + exit(1); + ev->state = 0; +} + +static void event_reset(event_t* ev) +{ + ev->state = 0; +} + +static void event_set(event_t* ev) +{ + pthread_mutex_lock(&ev->mu); + if (ev->state) + exit(1); + ev->state = 1; + pthread_mutex_unlock(&ev->mu); + pthread_cond_broadcast(&ev->cv); +} + +static void event_wait(event_t* ev) +{ + pthread_mutex_lock(&ev->mu); + while (!ev->state) + pthread_cond_wait(&ev->cv, &ev->mu); + pthread_mutex_unlock(&ev->mu); +} + +static int event_isset(event_t* ev) +{ + pthread_mutex_lock(&ev->mu); + int res = ev->state; + pthread_mutex_unlock(&ev->mu); + return res; +} + +static int event_timedwait(event_t* ev, uint64_t timeout) +{ + uint64_t start = current_time_ms(); + uint64_t now = start; + pthread_mutex_lock(&ev->mu); + for (;;) { + if (ev->state) + break; + uint64_t remain = timeout - (now - start); + struct timespec ts; + ts.tv_sec = remain / 1000; + ts.tv_nsec = (remain % 1000) * 1000 * 1000; + pthread_cond_timedwait(&ev->cv, &ev->mu, &ts); + now = current_time_ms(); + if (now - start > timeout) + break; + } + int res = ev->state; + pthread_mutex_unlock(&ev->mu); + return res; +} + +static void sandbox_common() +{ + struct rlimit rlim; + rlim.rlim_cur = rlim.rlim_max = 128 << 20; + setrlimit(RLIMIT_AS, &rlim); + rlim.rlim_cur = rlim.rlim_max = 8 << 20; + setrlimit(RLIMIT_MEMLOCK, &rlim); + rlim.rlim_cur = rlim.rlim_max = 1 << 20; + setrlimit(RLIMIT_FSIZE, &rlim); + rlim.rlim_cur = rlim.rlim_max = 1 << 20; + setrlimit(RLIMIT_STACK, &rlim); + rlim.rlim_cur = rlim.rlim_max = 0; + setrlimit(RLIMIT_CORE, &rlim); + rlim.rlim_cur = rlim.rlim_max = 256; + setrlimit(RLIMIT_NOFILE, &rlim); +} + +static void loop(); + +static int do_sandbox_none(void) +{ + sandbox_common(); + loop(); + return 0; +} + +struct thread_t { + int created, call; + event_t ready, done; +}; + +static struct thread_t threads[16]; +static void execute_call(int call); +static int running; + +static void* thr(void* arg) +{ + struct thread_t* th = (struct thread_t*)arg; + for (;;) { + event_wait(&th->ready); + event_reset(&th->ready); + execute_call(th->call); + __atomic_fetch_sub(&running, 1, __ATOMIC_RELAXED); + event_set(&th->done); + } + return 0; +} + +static void execute_one(void) +{ + if (write(1, "executing program\n", sizeof("executing program\n") - 1)) { + } + int i, call, thread; + for (call = 0; call < 8; call++) { + for (thread = 0; thread < (int)(sizeof(threads) / sizeof(threads[0])); + thread++) { + struct thread_t* th = &threads[thread]; + if (!th->created) { + th->created = 1; + event_init(&th->ready); + event_init(&th->done); + event_set(&th->done); + thread_start(thr, th); + } + if (!event_isset(&th->done)) + continue; + event_reset(&th->done); + th->call = call; + __atomic_fetch_add(&running, 1, __ATOMIC_RELAXED); + event_set(&th->ready); + event_timedwait(&th->done, 50); + break; + } + } + for (i = 0; i < 100 && __atomic_load_n(&running, __ATOMIC_RELAXED); i++) + sleep_ms(1); +} + +static void execute_one(void); + +#define WAIT_FLAGS 0 + +static void loop(void) +{ + int iter = 0; + for (;; iter++) { + char cwdbuf[32]; + sprintf(cwdbuf, "./%d", iter); + if (mkdir(cwdbuf, 0777)) + exit(1); + int pid = fork(); + if (pid < 0) + exit(1); + if (pid == 0) { + if (chdir(cwdbuf)) + exit(1); + execute_one(); + exit(0); + } + int status = 0; + uint64_t start = current_time_ms(); + for (;;) { + sleep_ms(10); + if (waitpid(-1, &status, WNOHANG | WAIT_FLAGS) == pid) + break; + if (current_time_ms() - start < 5000) + continue; + kill_and_wait(pid, &status); + break; + } + remove_dir(cwdbuf); + } +} + +uint64_t r[3] = {0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff}; + +void execute_call(int call) +{ + intptr_t res = 0; + switch (call) { + case 0: + // freebsd10_pipe arguments: [ + // pipefd: ptr[out, pipefd] { + // pipefd { + // rfd: fd (resource) + // wfd: fd (resource) + // } + // } + // ] + res = syscall(SYS_freebsd10_pipe, /*pipefd=*/0x2000000001c0ul); + if (res != -1) + r[0] = *(uint32_t*)0x2000000001c4; + break; + case 1: + // close arguments: [ + // fd: fd (resource) + // ] + syscall(SYS_close, /*fd=*/r[0]); + break; + case 2: + // socket\$unix arguments: [ + // domain: const = 0x1 (8 bytes) + // type: unix_socket_type = 0x5 (8 bytes) + // proto: const = 0x0 (1 bytes) + // ] + // returns sock_unix + res = syscall(SYS_socket, /*domain=*/1ul, /*type=SOCK_SEQPACKET*/ 5ul, + /*proto=*/0); + if (res != -1) + r[1] = res; + break; + case 3: + // bind\$unix arguments: [ + // fd: sock_unix (resource) + // addr: ptr[in, sockaddr_un] { + // union sockaddr_un { + // file: sockaddr_un_file { + // len: len = 0xa (1 bytes) + // family: unix_socket_family = 0x1 (1 bytes) + // path: buffer: {2e 2f 66 69 6c 65 31 00} (length 0x8) + // } + // } + // } + // addrlen: len = 0xa (8 bytes) + // ] + *(uint8_t*)0x2000000002c0 = 0xa; + *(uint8_t*)0x2000000002c1 = 1; + memcpy((void*)0x2000000002c2, "./file1\000", 8); + syscall(SYS_bind, /*fd=*/r[1], /*addr=*/0x2000000002c0ul, + /*addrlen=*/0xaul); + break; + case 4: + // listen arguments: [ + // fd: sock (resource) + // backlog: int32 = 0xfffffffe (4 bytes) + // ] + syscall(SYS_listen, /*fd=*/r[1], /*backlog=*/0xfffffffe); + break; + case 5: + // sendmsg\$unix arguments: [ + // fd: sock_unix (resource) + // msg: ptr[in, msghdr_un] { + // msghdr_un { + // addr: nil + // addrlen: len = 0x0 (4 bytes) + // pad = 0x0 (4 bytes) + // vec: nil + // vlen: len = 0x0 (8 bytes) + // ctrl: ptr[inout, array[ANYUNION]] { + // array[ANYUNION] { + // union ANYUNION { + // ANYBLOB: buffer: {89 00 00 00 ff ff 00 00 01} (length 0x9) + // } + // } + // } + // ctrllen: bytesize = 0x9 (8 bytes) + // f: send_flags = 0x0 (4 bytes) + // pad = 0x0 (4 bytes) + // } + // } + // f: send_flags = 0x0 (8 bytes) + // ] + *(uint64_t*)0x200000000080 = 0; + *(uint32_t*)0x200000000088 = 0; + *(uint64_t*)0x200000000090 = 0; + *(uint64_t*)0x200000000098 = 0; + *(uint64_t*)0x2000000000a0 = 0x200000000000; + memcpy((void*)0x200000000000, "\x89\x00\x00\x00\xff\xff\x00\x00\x01", 9); + *(uint64_t*)0x2000000000a8 = 9; + *(uint32_t*)0x2000000000b0 = 0; + syscall(SYS_sendmsg, /*fd=*/(intptr_t)-1, /*msg=*/0x200000000080ul, + /*f=*/0ul); + break; + case 6: + // socketpair\$unix arguments: [ + // domain: const = 0x1 (8 bytes) + // type: unix_socket_type = 0x2 (8 bytes) + // proto: const = 0x0 (1 bytes) + // fds: ptr[out, unix_pair] { + // unix_pair { + // fd0: sock_unix (resource) + // fd1: sock_unix (resource) + // } + // } + // ] + res = syscall(SYS_socketpair, /*domain=*/1ul, /*type=SOCK_DGRAM*/ 2ul, + /*proto=*/0, /*fds=*/0x200000000040ul); + if (res != -1) + r[2] = *(uint32_t*)0x200000000040; + break; + case 7: + // sendmsg arguments: [ + // fd: sock (resource) + // msg: ptr[in, send_msghdr] { + // send_msghdr { + // msg_name: nil + // msg_namelen: len = 0x32c (4 bytes) + // pad = 0x0 (4 bytes) + // msg_iov: nil + // msg_iovlen: len = 0x0 (8 bytes) + // msg_control: ptr[in, array[cmsghdr]] { + // array[cmsghdr] { + // } + // } + // msg_controllen: bytesize = 0x90 (8 bytes) + // msg_flags: const = 0x0 (4 bytes) + // pad = 0x0 (4 bytes) + // } + // } + // f: send_flags = 0x0 (8 bytes) + // ] + *(uint64_t*)0x200000000380 = 0; + *(uint32_t*)0x200000000388 = 0x32c; + *(uint64_t*)0x200000000390 = 0; + *(uint64_t*)0x200000000398 = 0; + *(uint64_t*)0x2000000003a0 = 0x200000000000; + *(uint64_t*)0x2000000003a8 = 0x90; + *(uint32_t*)0x2000000003b0 = 0; + syscall(SYS_sendmsg, /*fd=*/r[2], /*msg=*/0x200000000380ul, /*f=*/0ul); + break; + } +} +int main(void) +{ + syscall(SYS_mmap, /*addr=*/0x200000000000ul, /*len=*/0x1000000ul, + /*prot=PROT_WRITE|PROT_READ|PROT_EXEC*/ 7ul, + /*flags=MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE*/ 0x1012ul, + /*fd=*/(intptr_t)-1, /*offset=*/0ul); + const char* reason; + (void)reason; + for (procid = 0; procid < 4; procid++) { + if (fork() == 0) { + use_temporary_dir(); + do_sandbox_none(); + } + } + sleep(1000000); + return 0; +} +EOF +mycc -o /tmp/$prog -Wall -Wextra -O0 /tmp/$prog.c -pthread || exit 1 + +work=/tmp/$prog.dir +rm -rf $work +mkdir $work +cd /tmp/$prog.dir +for i in `jot 30`; do + ( + mkdir d$i + cd d$i + timeout 3m /tmp/$prog > /dev/null 2>&1 & + ) +done +while pgrep -q $prog; do sleep 2; done +wait + +rm -rf /tmp/$prog /tmp/$prog.c /tmp/$prog.core $work +exit 0 diff --git a/tools/test/stress2/misc/temp.sh b/tools/test/stress2/misc/temp.sh index 5c1a73cd18e1..4cddd48079ec 100755 --- a/tools/test/stress2/misc/temp.sh +++ b/tools/test/stress2/misc/temp.sh @@ -32,6 +32,10 @@ . ../default.cfg [ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 +[ -z "$nfs_export" ] && exit 0 +ping -c 2 `echo $nfs_export | sed 's/:.*//'` > /dev/null 2>&1 || + exit 0 + export LANG=C dir=/tmp odir=`pwd` @@ -41,10 +45,6 @@ mycc -o temp -Wall -Wextra -O0 -g temp.c || exit 1 rm -f temp.c cd $odir -[ -z "$nfs_export" ] && exit 0 -ping -c 2 `echo $nfs_export | sed 's/:.*//'` > /dev/null 2>&1 || - exit 0 - mount | grep "on $mntpoint " | grep -q nfs && umount $mntpoint mount -t nfs -o tcp -o retrycnt=3 -o soft -o rw $nfs_export $mntpoint mp2=$mntpoint/temp.`jot -rc 8 a z | tr -d '\n'`/temp.dir diff --git a/tools/test/stress2/misc/tmpfs16.sh b/tools/test/stress2/misc/tmpfs16.sh index 8cc3c3596a4e..683817ce6497 100755 --- a/tools/test/stress2/misc/tmpfs16.sh +++ b/tools/test/stress2/misc/tmpfs16.sh @@ -181,7 +181,7 @@ main(int argc, char **argv) if ((pw = getpwnam("nobody")) == NULL) err(1, "failed to resolve nobody"); - if (setgroups(1, &pw->pw_gid) || + if (setgroups(0, NULL) || setegid(pw->pw_gid) || setgid(pw->pw_gid) || seteuid(pw->pw_uid) || setuid(pw->pw_uid)) err(1, "Can't drop privileges to \"nobody\""); diff --git a/tools/test/stress2/misc/unionfs20.sh b/tools/test/stress2/misc/unionfs20.sh new file mode 100755 index 000000000000..0c87bc0d80aa --- /dev/null +++ b/tools/test/stress2/misc/unionfs20.sh @@ -0,0 +1,206 @@ +#!/bin/sh + +# +# Copyright (c) 2025 Peter Holm <pho@FreeBSD.org> +# +# SPDX-License-Identifier: BSD-2-Clause +# + +# Bug 289700 - unionfs: page fault in unionfs_find_node_status when closing a file within a socket's receive buffer + +# "Fatal trap 12: page fault while in kernel mode" seen: +# https://people.freebsd.org/~pho/stress/log/log0618.txt + +. ../default.cfg + +prog=$(basename "$0" .sh) +here=`pwd` +log=/tmp/$prog.log +md1=$mdstart +md2=$((md1 + 1)) +mp1=/mnt$md1 +mp2=/mnt$md2 + +set -eu +mdconfig -l | grep -q md$md1 && mdconfig -d -u $md1 +mdconfig -l | grep -q md$md2 && mdconfig -d -u $md2 + +mdconfig -s 2g -u $md1 +newfs $newfs_flags /dev/md$md1 > /dev/null +mdconfig -s 2g -u $md2 +newfs $newfs_flags /dev/md$md2 > /dev/null + +mkdir -p $mp1 $mp2 +mount /dev/md$md1 $mp1 +mount /dev/md$md2 $mp2 +mount -t unionfs -o noatime $mp1 $mp2 +set +e + +cd /tmp +sed '1,/^EOF/d' < $here/$0 > $prog.c +mycc -o $prog -Wall -Wextra -O2 $prog.c +rm -f $prog.c +[ -d $RUNDIR ] || mkdir -p $RUNDIR +cd $RUNDIR + +n=3 +for i in `jot $n`; do + mkdir $mp2/d$i +done +(cd $here/../testcases/swap; ./swap -t 3m -i 20 -l 100 -h > /dev/null) & +sleep 2 +for i in `jot $n`; do + (cd $mp2/d$i; /tmp/$prog) & +done +while pgrep -q $prog; do sleep .5; done +while pkill swap; do :; done +wait + +cd $here +umount $mp2 # The unionfs mount +umount $mp2 +umount $mp1 + +mdconfig -d -u $md1 +mdconfig -d -u $md2 +rm -f /tmp/$prog +exit 0 +EOF +#include <sys/param.h> +#include <sys/mman.h> +#include <sys/socket.h> +#include <sys/uio.h> +#include <sys/wait.h> + +#include <stdio.h> +#include <errno.h> +#include <err.h> +#include <stdlib.h> +#include <time.h> +#include <unistd.h> +#include <fcntl.h> +#include <poll.h> +#include <stdatomic.h> +#include <string.h> + +#define PARALLEL 2 +#define SYNC 0 + +static int debug; +static _Atomic(int) *share; + +int +send_fd(int socket, int fd_to_send) +{ + struct cmsghdr *cmsg; + struct msghdr msg = {0}; + struct iovec iov; + char buf[1] = {0}; // dummy data + char cmsgbuf[CMSG_SPACE(sizeof(fd_to_send))]; + + memset(cmsgbuf, 0, sizeof(cmsgbuf)); + + iov.iov_base = buf; + iov.iov_len = sizeof(buf); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + + msg.msg_control = cmsgbuf; + msg.msg_controllen = sizeof(cmsgbuf); + + cmsg = CMSG_FIRSTHDR(&msg); + cmsg->cmsg_level = SOL_SOCKET; + cmsg->cmsg_type = SCM_RIGHTS; + cmsg->cmsg_len = CMSG_LEN(sizeof(fd_to_send)); + + memcpy(CMSG_DATA(cmsg), &fd_to_send, sizeof(fd_to_send)); + + return (sendmsg(socket, &msg, 0)); +} + +int +recv_fd(int socket) +{ + struct cmsghdr *cmsg; + struct msghdr msg = {0}; + struct iovec iov; + char buf[1]; + int received_fd; + char cmsgbuf[CMSG_SPACE(sizeof(received_fd))]; + + memset(cmsgbuf, 0, sizeof(cmsgbuf)); + + iov.iov_base = buf; + iov.iov_len = sizeof(buf); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + + msg.msg_control = cmsgbuf; + msg.msg_controllen = sizeof(cmsgbuf); + + if (recvmsg(socket, &msg, 0) < 0) + err(1, "recvmsg()"); + + cmsg = CMSG_FIRSTHDR(&msg); + if (cmsg == NULL || cmsg->cmsg_len != CMSG_LEN(sizeof(received_fd))) { + fprintf(stderr, "No passed fd\n"); + return (-1); + } + + if (cmsg->cmsg_level != SOL_SOCKET || cmsg->cmsg_type != SCM_RIGHTS) { + fprintf(stderr, "Invalid cmsg_level or cmsg_type\n"); + return (-1); + } + + memcpy(&received_fd, CMSG_DATA(cmsg), sizeof(received_fd)); + return (received_fd); +} + +int +main(void) +{ + pid_t pid; + time_t start; + size_t len; + int fd, pair[2], status; + + fd = -1; + len = PAGE_SIZE; + if ((share = mmap(NULL, len, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_SHARED, -1, 0)) == MAP_FAILED) + err(1, "mmap"); + + if (socketpair(AF_LOCAL, SOCK_DGRAM, 0, pair) == -1) + err(1, "socketpair"); + + start = time(NULL); + while (time(NULL) - start < 180) { + share[SYNC] = 0; + if ((pid = fork()) == -1) + err(1, "fork"); + if (pid == 0) { + close(pair[0]); + atomic_fetch_add(&share[SYNC], 1); + while (share[SYNC] != PARALLEL) + usleep(1000); + // Not calling recv_fd() triggers the issue +// fd = recv_fd(pair[1]); + if (debug) + fprintf(stderr, "Received fd=%d\n", fd); + _exit(0); + } + fd = open("foo", O_RDWR|O_CREAT|O_TRUNC, 0666); + if (fd == -1) + err(1, "open"); + if (debug) + fprintf(stderr, "Sending fd=%d\n", fd); + atomic_fetch_add(&share[SYNC], 1); + while (share[SYNC] != PARALLEL) + usleep(1000); + send_fd(pair[0], fd); + usleep(arc4random() % 1000); + wait(&status); + close(fd); + unlink("foo"); + } +} diff --git a/tools/test/stress2/misc/unionfs7.sh b/tools/test/stress2/misc/unionfs7.sh index 6adcd01a5f83..9c00ba73e5c2 100755 --- a/tools/test/stress2/misc/unionfs7.sh +++ b/tools/test/stress2/misc/unionfs7.sh @@ -61,8 +61,8 @@ set +e mount | grep -E "$mp1|$mp2" set `df -ik $mp2 | tail -1 | awk '{print $4,$7}'` -export KBLOCKS=$(($1 / 4)) -export INODES=$(($2 / 4)) +export KBLOCKS=$(($1 / 6)) +export INODES=$(($2 / 6)) export CTRLDIR=$mp2/stressX.control export INCARNATIONS=10 @@ -95,7 +95,7 @@ export TESTPROGS=`echo $TESTPROGS | sed 's/\n/ /g'` set +e chmod 777 $mp2 su $testuser -c \ - "(cd $mp2/stress2; ./testcases/run/run $TESTPROGS)" + "(cd $mp2/stress2; ./testcases/run/run $TESTPROGS > /dev/null 2>&1)" while mount | grep -Eq "on $mp2 .*unionfs"; do umount $mp2 && break diff --git a/tools/tools/crypto/Makefile b/tools/tools/crypto/Makefile index d1aa55526248..0a7db998d57b 100644 --- a/tools/tools/crypto/Makefile +++ b/tools/tools/crypto/Makefile @@ -25,8 +25,7 @@ # SUCH DAMAGE. # -PROGS= cryptocheck cryptotest cryptostats \ - hifnstats ipsecstats safestats +PROGS= cryptocheck cryptostats ipsecstats safestats MAN= BINDIR?= /usr/local/bin @@ -34,10 +33,7 @@ BINDIR?= /usr/local/bin LIBADD.cryptocheck+= crypto util # cryptostats: dump statistics kept by the core crypto code -# hifnstats: print statistics kept by the HIFN driver # safestats: statistics kept by the SafeNet driver # ipsecstats: print statistics kept by fast ipsec -CLEANFILES+= core a.out - .include <bsd.progs.mk> diff --git a/tools/tools/crypto/cryptocheck.c b/tools/tools/crypto/cryptocheck.c index 6506671455ac..46a364b0453c 100644 --- a/tools/tools/crypto/cryptocheck.c +++ b/tools/tools/crypto/cryptocheck.c @@ -362,9 +362,11 @@ enable_user_soft(void) size_t cursize = sizeof(curstate); if (sysctlbyname(CRYPT_SOFT_ALLOW, &curstate, &cursize, - &on, sizeof(on)) == 0) { + &on, sizeof(on)) == 0) { if (curstate == 0) atexit(reset_user_soft); + } else { + err(1, "sysctl(%s)", CRYPT_SOFT_ALLOW); } } @@ -373,7 +375,10 @@ crlookup(const char *devname) { struct crypt_find_op find; - if (strncmp(devname, "soft", 4) == 0) { + if (strncmp(devname, "soft", 4) == 0 || + strncmp(devname, "ossl", 4) == 0 || + strncmp(devname, "aesni", 5) == 0 || + strncmp(devname, "armv8crypto", 11) == 0) { enable_user_soft(); return CRYPTO_FLAG_SOFTWARE; } diff --git a/tools/tools/crypto/cryptorun.sh b/tools/tools/crypto/cryptorun.sh deleted file mode 100755 index 8761b16c4d96..000000000000 --- a/tools/tools/crypto/cryptorun.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/sh -# -# A simple test runner for cryptotest -# -# Althought cryptotest itself has a -z mode to test all algorithms at -# a variety of sizes, this script allows us to be more selective. -# Threads and buffer sizes move in powers of two from 1, for threads, -# and 256 for buffer sizes. -# -# e.g. cryptorun.sh aes 4 512 -# -# Test aes with 1, 2 and 4 processes, and at sizes of 256 and 512 bytes. -# -# - -threads=1 -size=256 -iterations=1000000 -crypto="/tank/users/gnn/Repos/svn/FreeBSD.HEAD/tools/tools/crypto/cryptotest" -max_threads=$2 -max_size=$3 - -while [ "$threads" -le "$max_threads" ]; do - echo "Testing with $threads processes." - while [ "$size" -le "$max_size" ]; do - $crypto -t $threads -a $1 $iterations $size - size=$(($size * 2)) - done - size=256 - threads=$(($threads * 2)) -done diff --git a/tools/tools/crypto/cryptotest.c b/tools/tools/crypto/cryptotest.c deleted file mode 100644 index 7845c3994d0c..000000000000 --- a/tools/tools/crypto/cryptotest.c +++ /dev/null @@ -1,658 +0,0 @@ -/*- - * Copyright (c) 2004 Sam Leffler, Errno Consulting - * All rights reserved. - * - * 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, - * without modification. - * 2. Redistributions in binary form must reproduce at minimum a disclaimer - * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any - * redistribution must be conditioned upon including a substantially - * similar Disclaimer requirement for further binary redistribution. - * 3. Neither the names of the above-listed copyright holders nor the names - * of any contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * NO WARRANTY - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 DAMAGES. - */ - -/* - * Simple tool for testing hardware/system crypto support. - * - * cryptotest [-czsbv] [-a algorithm] [count] [size ...] - * - * Run count iterations of a crypt+decrypt or mac operation on a buffer of - * size bytes. A random key and iv are used. Options: - * -c check the results - * -d dev pin work on device dev - * -z run all available algorithms on a variety of buffer sizes - * -v be verbose - * -b mark operations for batching - * -p profile kernel crypto operations (must be root) - * -t n fork n threads and run tests concurrently - * Known algorithms are: - * null null cbc - * des des cbc - * 3des 3des cbc - * blf blowfish cbc - * cast cast cbc - * skj skipjack cbc - * aes rijndael/aes 128-bit cbc - * aes192 rijndael/aes 192-bit cbc - * aes256 rijndael/aes 256-bit cbc - * chacha20 Chacha20 stream cipher - * blake2b Blake2b - * blake2s Blake2s - * md5 md5 hmac - * sha1 sha1 hmac - * sha256 256-bit sha2 hmac - * sha384 384-bit sha2 hmac - * sha512 512--bit sha2 hmac - * - * For a test of how fast a crypto card is, use something like: - * cryptotest -z 1024 - * This will run a series of tests using the available crypto/cipher - * algorithms over a variety of buffer sizes. The 1024 says to do 1024 - * iterations. Extra arguments can be used to specify one or more buffer - * sizes to use in doing tests. - * - * To fork multiple processes all doing the same work, specify -t X on the - * command line to get X "threads" running simultaneously. No effort is made - * to synchronize the threads or otherwise maximize load. - * - * If the kernel crypto code is built with CRYPTO_TIMING and you run as root, - * then you can specify the -p option to get a "profile" of the time spent - * processing crypto operations. At present this data is only meaningful for - * symmetric operations. To get meaningful numbers you must run on an idle - * machine. - * - * Expect ~400 Mb/s for a Broadcom 582x for 8K buffers on a reasonable CPU - * (64-bit PCI helps). Hifn 7811 parts top out at ~110 Mb/s. - */ - -#include <sys/param.h> -#include <sys/cpuset.h> -#include <sys/ioctl.h> -#include <sys/mman.h> -#include <sys/sysctl.h> -#include <sys/time.h> -#include <sys/wait.h> - -#include <err.h> -#include <fcntl.h> -#include <paths.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sysexits.h> -#include <unistd.h> - -#include <crypto/cryptodev.h> - -#define CHUNK 64 /* how much to display */ -#define streq(a,b) (strcasecmp(a,b) == 0) - -void hexdump(char *, int); - -int verbose = 0; -int opflags = 0; -int verify = 0; -int crid = CRYPTO_FLAG_HARDWARE; - -struct alg { - const char* name; - int ishash; - int blocksize; - int minkeylen; - int maxkeylen; - int code; -} algorithms[] = { -#ifdef CRYPTO_NULL_CBC - { "null", 0, 8, 1, 256, CRYPTO_NULL_CBC }, -#endif - { "des", 0, 8, 8, 8, CRYPTO_DES_CBC }, - { "3des", 0, 8, 24, 24, CRYPTO_3DES_CBC }, - { "blf", 0, 8, 5, 56, CRYPTO_BLF_CBC }, - { "cast", 0, 8, 5, 16, CRYPTO_CAST_CBC }, - { "skj", 0, 8, 10, 10, CRYPTO_SKIPJACK_CBC }, - { "rij", 0, 16, 16, 16, CRYPTO_RIJNDAEL128_CBC}, - { "aes", 0, 16, 16, 16, CRYPTO_AES_CBC}, - { "aes192", 0, 16, 24, 24, CRYPTO_AES_CBC}, - { "aes256", 0, 16, 32, 32, CRYPTO_AES_CBC}, - { "chacha20", 0, 1, 32, 32, CRYPTO_CHACHA20}, - { "blake2b", 1, 128, 64, 64, CRYPTO_BLAKE2B }, - { "blake2s", 1, 64, 32, 32, CRYPTO_BLAKE2S }, - { "md5", 1, 8, 16, 16, CRYPTO_MD5_HMAC }, - { "sha1", 1, 8, 20, 20, CRYPTO_SHA1_HMAC }, - { "sha256", 1, 8, 32, 32, CRYPTO_SHA2_256_HMAC }, - { "sha384", 1, 8, 48, 48, CRYPTO_SHA2_384_HMAC }, - { "sha512", 1, 8, 64, 64, CRYPTO_SHA2_512_HMAC }, -}; - -void -usage(const char* cmd) -{ - printf("usage: %s [-czsbv] [-d dev] [-a algorithm] [count] [size ...]\n", - cmd); - printf("where algorithm is one of:\n"); - printf(" null des 3des (default) blowfish cast skipjack rij\n"); - printf(" aes aes192 aes256 chacha20 md5 sha1 sha256 sha384 sha512\n"); - printf(" blake2b blake2s\n"); - printf(" or an encryption algorithm concatented with authentication\n"); - printf(" algorithm with '+' in the middle, e.g., aes+sha1.\n"); - printf("count is the number of encrypt/decrypt ops to do\n"); - printf("size is the number of bytes of text to encrypt+decrypt\n"); - printf("\n"); - printf("-c check the results (slows timing)\n"); - printf("-d use specific device, specify 'soft' for testing software implementations\n"); - printf("\tNOTE: to use software you must set:\n\t sysctl kern.cryptodevallowsoft=1\n"); - printf("-z run all available algorithms on a variety of sizes\n"); - printf("-v be verbose\n"); - printf("-b mark operations for batching\n"); - printf("-p profile kernel crypto operation (must be root)\n"); - printf("-t n for n threads and run tests concurrently\n"); - exit(-1); -} - -struct alg* -getalgbycode(int cipher) -{ - int i; - - for (i = 0; i < nitems(algorithms); i++) - if (cipher == algorithms[i].code) - return &algorithms[i]; - return NULL; -} - -struct alg* -getalgbyname(const char* name) -{ - int i; - - for (i = 0; i < nitems(algorithms); i++) - if (streq(name, algorithms[i].name)) - return &algorithms[i]; - return NULL; -} - -int -devcrypto(void) -{ - int fd = -1; - - if (fd < 0) { - fd = open(_PATH_DEV "crypto", O_RDWR, 0); - if (fd < 0) - err(1, _PATH_DEV "crypto"); - if (fcntl(fd, F_SETFD, 1) == -1) - err(1, "fcntl(F_SETFD) (devcrypto)"); - } - return fd; -} - -int -crlookup(const char *devname) -{ - struct crypt_find_op find; - - if (strncmp(devname, "soft", 4) == 0) - return CRYPTO_FLAG_SOFTWARE; - - find.crid = -1; - strlcpy(find.name, devname, sizeof(find.name)); - if (ioctl(devcrypto(), CIOCFINDDEV, &find) == -1) - err(1, "ioctl(CIOCFINDDEV)"); - return find.crid; -} - -const char * -crfind(int crid) -{ - static struct crypt_find_op find; - - bzero(&find, sizeof(find)); - find.crid = crid; - if (ioctl(devcrypto(), CIOCFINDDEV, &find) == -1) - err(1, "ioctl(CIOCFINDDEV): crid %d", crid); - return find.name; -} - -char -rdigit(void) -{ - const char a[] = { - 0x10,0x54,0x11,0x48,0x45,0x12,0x4f,0x13,0x49,0x53,0x14,0x41, - 0x15,0x16,0x4e,0x55,0x54,0x17,0x18,0x4a,0x4f,0x42,0x19,0x01 - }; - return 0x20+a[random()%nitems(a)]; -} - -void -runtest(struct alg *ealg, struct alg *alg, int count, int size, u_long cmd, struct timeval *tv) -{ - int i, fd = devcrypto(); - struct timeval start, stop, dt; - char *cleartext, *ciphertext, *originaltext, *key; - struct session2_op sop; - struct crypt_op cop; - char iv[EALG_MAX_BLOCK_LEN]; - char digest[512/8]; - - /* Canonicalize 'ealg' to crypt alg and 'alg' to authentication alg. */ - if (ealg == NULL && !alg->ishash) { - ealg = alg; - alg = NULL; - } - - bzero(&sop, sizeof(sop)); - if (ealg != NULL) { - sop.keylen = (ealg->minkeylen + ealg->maxkeylen)/2; - key = (char *) malloc(sop.keylen); - if (key == NULL) - err(1, "malloc (key)"); - for (i = 0; i < sop.keylen; i++) - key[i] = rdigit(); - sop.key = key; - sop.cipher = ealg->code; - } - if (alg != NULL) { - sop.mackeylen = (alg->minkeylen + alg->maxkeylen)/2; - key = (char *) malloc(sop.mackeylen); - if (key == NULL) - err(1, "malloc (mac)"); - for (i = 0; i < sop.mackeylen; i++) - key[i] = rdigit(); - sop.mackey = key; - sop.mac = alg->code; - } - - sop.crid = crid; - if (ioctl(fd, cmd, &sop) < 0) { - if (cmd == CIOCGSESSION || cmd == CIOCGSESSION2) { - close(fd); - if (verbose) { - printf("cipher %s%s%s", ealg? ealg->name : "", - (ealg && alg) ? "+" : "", - alg? alg->name : ""); - - if (alg->ishash) - printf(" mackeylen %u\n", sop.mackeylen); - else - printf(" keylen %u\n", sop.keylen); - perror("CIOCGSESSION"); - } - /* hardware doesn't support algorithm; skip it */ - return; - } - printf("cipher %s%s%s keylen %u mackeylen %u\n", - ealg? ealg->name : "", (ealg && alg) ? "+" : "", - alg? alg->name : "", sop.keylen, sop.mackeylen); - err(1, "CIOCGSESSION"); - } - - originaltext = malloc(3*size); - if (originaltext == NULL) - err(1, "malloc (text)"); - cleartext = originaltext+size; - ciphertext = cleartext+size; - for (i = 0; i < size; i++) - cleartext[i] = rdigit(); - memcpy(originaltext, cleartext, size); - for (i = 0; i < nitems(iv); i++) - iv[i] = rdigit(); - - if (verbose) { - printf("session = 0x%x\n", sop.ses); - printf("device = %s\n", crfind(sop.crid)); - printf("count = %d, size = %d\n", count, size); - if (ealg) { - printf("iv:"); - hexdump(iv, sizeof iv); - } - printf("cleartext:"); - hexdump(cleartext, MIN(size, CHUNK)); - } - - gettimeofday(&start, NULL); - if (ealg) { - for (i = 0; i < count; i++) { - cop.ses = sop.ses; - cop.op = COP_ENCRYPT; - cop.flags = opflags | COP_F_CIPHER_FIRST; - cop.len = size; - cop.src = cleartext; - cop.dst = ciphertext; - if (alg) - cop.mac = digest; - else - cop.mac = 0; - cop.iv = iv; - - if (ioctl(fd, CIOCCRYPT, &cop) < 0) - err(1, "ioctl(CIOCCRYPT)"); - - if (verify && bcmp(ciphertext, cleartext, size) == 0) { - printf("cipher text unchanged:"); - hexdump(ciphertext, size); - } - - memset(cleartext, 'x', MIN(size, CHUNK)); - cop.ses = sop.ses; - cop.op = COP_DECRYPT; - cop.flags = opflags; - cop.len = size; - cop.src = ciphertext; - cop.dst = cleartext; - if (alg) - cop.mac = digest; - else - cop.mac = 0; - cop.iv = iv; - - if (ioctl(fd, CIOCCRYPT, &cop) < 0) - err(1, "ioctl(CIOCCRYPT)"); - - if (verify && bcmp(cleartext, originaltext, size) != 0) { - printf("decrypt mismatch:\n"); - printf("original:"); - hexdump(originaltext, size); - printf("cleartext:"); - hexdump(cleartext, size); - } - } - } else { - for (i = 0; i < count; i++) { - cop.ses = sop.ses; - cop.op = 0; - cop.flags = opflags; - cop.len = size; - cop.src = cleartext; - cop.dst = 0; - cop.mac = ciphertext; - cop.iv = 0; - - if (ioctl(fd, CIOCCRYPT, &cop) < 0) - err(1, "ioctl(CIOCCRYPT)"); - } - } - gettimeofday(&stop, NULL); - - if (ioctl(fd, CIOCFSESSION, &sop.ses) < 0) - perror("ioctl(CIOCFSESSION)"); - - if (verbose) { - printf("cleartext:"); - hexdump(cleartext, MIN(size, CHUNK)); - } - timersub(&stop, &start, tv); - - free(originaltext); - - close(fd); -} - -#ifdef __FreeBSD__ -void -resetstats() -{ - struct cryptostats stats; - size_t slen; - - slen = sizeof (stats); - if (sysctlbyname("kern.crypto_stats", &stats, &slen, NULL, 0) < 0) { - perror("kern.crypto_stats"); - return; - } - bzero(&stats.cs_invoke, sizeof (stats.cs_invoke)); - bzero(&stats.cs_done, sizeof (stats.cs_done)); - bzero(&stats.cs_cb, sizeof (stats.cs_cb)); - bzero(&stats.cs_finis, sizeof (stats.cs_finis)); - stats.cs_invoke.min.tv_sec = 10000; - stats.cs_done.min.tv_sec = 10000; - stats.cs_cb.min.tv_sec = 10000; - stats.cs_finis.min.tv_sec = 10000; - if (sysctlbyname("kern.crypto_stats", NULL, NULL, &stats, sizeof (stats)) < 0) - perror("kern.cryptostats"); -} - -void -printt(const char* tag, struct cryptotstat *ts) -{ - uint64_t avg, min, max; - - if (ts->count == 0) - return; - avg = (1000000000LL*ts->acc.tv_sec + ts->acc.tv_nsec) / ts->count; - min = 1000000000LL*ts->min.tv_sec + ts->min.tv_nsec; - max = 1000000000LL*ts->max.tv_sec + ts->max.tv_nsec; - printf("%16.16s: avg %6llu ns : min %6llu ns : max %7llu ns [%u samps]\n", - tag, avg, min, max, ts->count); -} -#endif - -void -runtests(struct alg *ealg, struct alg *alg, int count, int size, u_long cmd, int threads, int profile) -{ - int i, status; - double t; - void *region; - struct timeval *tvp; - struct timeval total; - int otiming; - - if (size % alg->blocksize || (ealg && size % ealg->blocksize)) { - if (verbose) - printf("skipping blocksize %u 'cuz not a multiple of " - "%s blocksize %u (or %s blocksize %u)\n", - size, alg->name, alg->blocksize, - ealg ? ealg->name : "n/a", - ealg ? ealg->blocksize : 0); - return; - } - - region = mmap(NULL, threads * sizeof (struct timeval), - PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0); - if (region == MAP_FAILED) { - perror("mmap"); - return; - } - tvp = (struct timeval *) region; -#ifdef __FreeBSD__ - if (profile) { - size_t tlen = sizeof (otiming); - int timing = 1; - - resetstats(); - if (sysctlbyname("debug.crypto_timing", &otiming, &tlen, - &timing, sizeof (timing)) < 0) - perror("debug.crypto_timing"); - } -#endif - - if (threads > 1) { - for (i = 0; i < threads; i++) - if (fork() == 0) { - cpuset_t mask; - CPU_ZERO(&mask); - CPU_SET(i, &mask); - cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, - -1, sizeof(mask), &mask); - runtest(ealg, alg, count, size, cmd, &tvp[i]); - exit(0); - } - while (waitpid(WAIT_MYPGRP, &status, 0) != -1) - ; - } else - runtest(ealg, alg, count, size, cmd, tvp); - - t = 0; - for (i = 0; i < threads; i++) - t += (((double)tvp[i].tv_sec * 1000000 + tvp[i].tv_usec) / 1000000); - if (t) { - int nops = alg->ishash ? count : 2*count; - - nops *= threads; - printf("%8.3lf sec, %7d %6s%s%6s crypts, %7d bytes, %8.0lf byte/sec, %7.1lf Mb/sec\n", - t, nops, alg->name, ealg? "+" : "", ealg? ealg->name : "", - size, (double)nops*size / t, - (double)nops*size / t * 8 / 1024 / 1024); - } -#ifdef __FreeBSD__ - if (profile) { - struct cryptostats stats; - size_t slen = sizeof (stats); - - if (sysctlbyname("debug.crypto_timing", NULL, NULL, - &otiming, sizeof (otiming)) < 0) - perror("debug.crypto_timing"); - if (sysctlbyname("kern.crypto_stats", &stats, &slen, NULL, 0) < 0) - perror("kern.cryptostats"); - if (stats.cs_invoke.count) { - printt("dispatch->invoke", &stats.cs_invoke); - printt("invoke->done", &stats.cs_done); - printt("done->cb", &stats.cs_cb); - printt("cb->finis", &stats.cs_finis); - } - } -#endif - fflush(stdout); -} - -int -main(int argc, char **argv) -{ - struct alg *alg = NULL, *ealg = NULL; - char *tmp; - int count = 1; - int sizes[128], nsizes = 0; - u_long cmd = CIOCGSESSION2; - int testall = 0; - int maxthreads = 1; - int profile = 0; - int i, ch; - - while ((ch = getopt(argc, argv, "cpzsva:bd:t:")) != -1) { - switch (ch) { -#ifdef CIOCGSSESSION - case 's': - cmd = CIOCGSSESSION; - break; -#endif - case 'v': - verbose++; - break; - case 'a': - tmp = strchr(optarg, '+'); - if (tmp != NULL) { - *tmp = '\0'; - ealg = getalgbyname(optarg); - if (ealg == NULL || ealg->ishash) - usage(argv[0]); - optarg = tmp + 1; - } - - alg = getalgbyname(optarg); - if (alg == NULL) { - if (streq(optarg, "rijndael")) - alg = getalgbyname("aes"); - else - usage(argv[0]); - } else if (ealg != NULL && !alg->ishash) - usage(argv[0]); - break; - case 'd': - crid = crlookup(optarg); - break; - case 't': - maxthreads = atoi(optarg); - break; - case 'z': - testall = 1; - break; - case 'p': - profile = 1; - break; - case 'b': - opflags |= COP_F_BATCH; - break; - case 'c': - verify = 1; - break; - default: - usage(argv[0]); - } - } - argc -= optind, argv += optind; - if (argc > 0) - count = atoi(argv[0]); - while (argc > 1) { - int s = atoi(argv[1]); - if (nsizes < nitems(sizes)) { - sizes[nsizes++] = s; - } else { - printf("Too many sizes, ignoring %u\n", s); - } - argc--, argv++; - } - if (maxthreads > CPU_SETSIZE) - errx(EX_USAGE, "Too many threads, %d, choose fewer.", maxthreads); - - if (nsizes == 0) { - if (alg) - sizes[nsizes++] = alg->blocksize; - else - sizes[nsizes++] = 8; - if (testall) { - while (sizes[nsizes-1] < 8*1024) { - sizes[nsizes] = sizes[nsizes-1]<<1; - nsizes++; - } - } - } - - if (testall) { - for (i = 0; i < nitems(algorithms); i++) { - int j; - alg = &algorithms[i]; - for (j = 0; j < nsizes; j++) - runtests(ealg, alg, count, sizes[j], cmd, maxthreads, profile); - } - } else { - if (alg == NULL) - alg = getalgbycode(CRYPTO_3DES_CBC); - for (i = 0; i < nsizes; i++) - runtests(ealg, alg, count, sizes[i], cmd, maxthreads, profile); - } - - return (0); -} - -void -hexdump(char *p, int n) -{ - int i, off; - - for (off = 0; n > 0; off += 16, n -= 16) { - printf("%s%04x:", off == 0 ? "\n" : "", off); - i = (n >= 16 ? 16 : n); - do { - printf(" %02x", *p++ & 0xff); - } while (--i); - printf("\n"); - } -} diff --git a/tools/tools/crypto/hifnstats.c b/tools/tools/crypto/hifnstats.c deleted file mode 100644 index 71c826f8e66e..000000000000 --- a/tools/tools/crypto/hifnstats.c +++ /dev/null @@ -1,63 +0,0 @@ -/*- - * Copyright (c) 2002, 2003 Sam Leffler, Errno Consulting - * All rights reserved. - * - * 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. - */ - -#include <sys/types.h> -#include <sys/sysctl.h> - -#include <err.h> -#include <stdio.h> - -#include "../../../sys/dev/hifn/hifn7751var.h" - -/* - * Little program to dump the statistics block for the hifn driver. - */ -int -main(int argc, char *argv[]) -{ - struct hifn_stats stats; - size_t slen; - - slen = sizeof (stats); - if (sysctlbyname("hw.hifn.stats", &stats, &slen, NULL, 0) < 0) - err(1, "kern.hifn.stats"); - - printf("input %llu bytes %u packets\n", - stats.hst_ibytes, stats.hst_ipackets); - printf("output %llu bytes %u packets\n", - stats.hst_obytes, stats.hst_opackets); - printf("invalid %u nomem %u abort %u\n", - stats.hst_invalid, stats.hst_nomem, stats.hst_abort); - printf("noirq %u unaligned %u\n", - stats.hst_noirq, stats.hst_unaligned); - printf("totbatch %u maxbatch %u\n", - stats.hst_totbatch, stats.hst_maxbatch); - printf("nomem: map %u load %u mbuf %u mcl %u cr %u sd %u\n", - stats.hst_nomem_map, stats.hst_nomem_load, - stats.hst_nomem_mbuf, stats.hst_nomem_mcl, - stats.hst_nomem_cr, stats.hst_nomem_sd); - return 0; -} diff --git a/tools/tools/git/git-arc.sh b/tools/tools/git/git-arc.sh index 22df0c61293a..fa618cdcbc22 100644 --- a/tools/tools/git/git-arc.sh +++ b/tools/tools/git/git-arc.sh @@ -242,7 +242,7 @@ title2diff() { local title - title=$(echo $1 | sed 's/"/\\"/g') + title=$(echo "$1" | sed 's/"/\\"/g') arc_list --no-ansi | awk -F': ' '{ if (substr($0, index($0, FS) + length(FS)) == "'"$title"'") { @@ -470,7 +470,7 @@ gitarc__list() title=$(git show -s --format=%s "$commit") diff=$(echo "$openrevs" | \ awk -F'D[1-9][0-9]*: ' \ - '{if ($2 == "'"$(echo $title | sed 's/"/\\"/g')"'") print $0}') + '{if ($2 == "'"$(echo "$title" | sed 's/"/\\"/g')"'") print $0}') if [ -z "$diff" ]; then echo "No Review : $title" elif [ "$(echo "$diff" | wc -l)" -ne 1 ]; then diff --git a/tools/tools/git/mfc-candidates.lua b/tools/tools/git/mfc-candidates.lua index d2865a892971..cbf7dcb3a257 100755 --- a/tools/tools/git/mfc-candidates.lua +++ b/tools/tools/git/mfc-candidates.lua @@ -117,7 +117,7 @@ end local function usage(from_branch, to_branch, author) local script_name = arg[0]:match("([^/]+)$") - print(script_name .. " [-ah] [-f from_branch] [-t to_branch] [-u user] [-X exclude_file] [path ...]") + print(script_name .. " [-ah] [-F git-show-fmt] [-f from_branch] [-t to_branch] [-u user] [-X exclude_file] [path ...]") print() params(from_branch, to_branch, author) end @@ -129,16 +129,18 @@ local function main() local author = os.getenv("USER") or "" local dirspec = nil - local url = exec_command("git remote get-url freebsd") - local freebsd_repo = string.match(url, "[^/]+$") - freebsd_repo = string.gsub(freebsd_repo, ".git$", "") + local url = exec_command("git remote get-url freebsd 2>/dev/null") + local freebsd_repo + if url and url ~= "" then + freebsd_repo = string.match(url, "[^/]+$") + freebsd_repo = string.gsub(freebsd_repo, "%.git$", "") + end if freebsd_repo == "ports" or freebsd_repo == "freebsd-ports" then local year = os.date("%Y") local month = os.date("%m") local qtr = math.ceil(month / 3) to_branch = "freebsd/" .. year .. "Q" .. qtr elseif freebsd_repo == "src" or freebsd_repo == "freebsd-src" then - to_branch = "freebsd/stable/14" -- If pwd is a stable or release branch tree, default to it. local cur_branch = exec_command("git symbolic-ref --short HEAD") if string.match(cur_branch, "^stable/") then @@ -147,6 +149,11 @@ local function main() to_branch = cur_branch local major = string.match(cur_branch, "%d+") from_branch = "freebsd/stable/" .. major + else + -- Use latest stable branch. + to_branch = exec_command("git for-each-ref --sort=-v:refname " .. + "--format='%(refname:lstrip=2)' " .. + "refs/remotes/freebsd/stable/* --count=1") end else print("pwd is not under a ports or src repository.") @@ -155,6 +162,7 @@ local function main() local do_help = false local exclude_file = nil + local gitshowfmt = '%h %s' local i = 1 while i <= #arg and arg[i] do local opt = arg[i] @@ -174,6 +182,9 @@ local function main() i = i + 1 elseif opt == "-v" then verbose = verbose + 1 + elseif opt == "-F" then + gitshowfmt = arg[i + 1] + i = i + 1 elseif opt == "-X" then exclude_file = arg[i + 1] i = i + 1 @@ -210,7 +221,7 @@ local function main() -- Print the result for _, hash in ipairs(result_hashes) do - print(exec_command("git show --pretty='%h %s' --no-patch " .. hash)) + print(exec_command("git show --pretty='" .. gitshowfmt .. "' --no-patch " .. hash)) end end diff --git a/tools/tools/nanobsd/defaults.sh b/tools/tools/nanobsd/defaults.sh index 59ae8d92f4af..588758154c98 100755 --- a/tools/tools/nanobsd/defaults.sh +++ b/tools/tools/nanobsd/defaults.sh @@ -209,30 +209,29 @@ SRC_ENV_CONF=/dev/null # ####################################################################### -# Export values into the shell. Must use { } instead of ( ) like -# other functions to avoid a subshell. +# Export values into the shell. # We set __MAKE_CONF as a global since it is easier to get quoting # right for paths with spaces in them. -make_export ( ) { +make_export() { # Similar to export_var, except puts the data out to stdout - var=$1 + local var=$1 eval val=\$$var echo "Setting variable: $var=\"$val\"" export $1 } -nano_make_build_env ( ) { +nano_make_build_env() { __MAKE_CONF="${NANO_MAKE_CONF_BUILD}" make_export __MAKE_CONF } -nano_make_install_env ( ) { +nano_make_install_env() { __MAKE_CONF="${NANO_MAKE_CONF_INSTALL}" make_export __MAKE_CONF } # Extra environment variables for kernel builds -nano_make_kernel_env ( ) { +nano_make_kernel_env() { if [ -f "${NANO_KERNEL}" ] ; then KERNCONFDIR="$(realpath $(dirname ${NANO_KERNEL}))" KERNCONF="$(basename ${NANO_KERNEL})" @@ -244,17 +243,17 @@ nano_make_kernel_env ( ) { fi } -nano_global_make_env ( ) ( +nano_global_make_env() { # global settings for the make.conf file, if set [ -z "${NANO_ARCH}" ] || echo TARGET_ARCH="${NANO_ARCH}" [ -z "${NANO_CPUTYPE}" ] || echo TARGET_CPUTYPE="${NANO_CPUTYPE}" -) +} # # Create empty files in the target tree, and record the fact. All paths # are relative to NANO_WORLDDIR. # -tgt_touch ( ) ( +tgt_touch() ( cd "${NANO_WORLDDIR}" for i; do touch $i @@ -268,9 +267,9 @@ tgt_touch ( ) ( # directory is removed and a symlink is created. If we're doing # a nopriv build, then append this fact to the metalog # -tgt_dir2symlink ( ) ( - dir=$1 - symlink=$2 +tgt_dir2symlink() ( + local dir=$1 + local symlink=$2 cd "${NANO_WORLDDIR}" rm -xrf "$dir" @@ -281,25 +280,25 @@ tgt_dir2symlink ( ) ( ) # run in the world chroot, errors fatal -CR ( ) { +CR() { chroot "${NANO_WORLDDIR}" /bin/sh -exc "$*" } # run in the world chroot, errors not fatal -CR0 ( ) { +CR0() { chroot "${NANO_WORLDDIR}" /bin/sh -c "$*" || true } -clean_build ( ) ( +clean_build() { pprint 2 "Clean and create object directory (${MAKEOBJDIRPREFIX})" if ! rm -xrf ${MAKEOBJDIRPREFIX}/ > /dev/null 2>&1 ; then chflags -R noschg ${MAKEOBJDIRPREFIX}/ rm -xr ${MAKEOBJDIRPREFIX}/ fi -) +} -make_conf_build ( ) ( +make_conf_build() { pprint 2 "Construct build make.conf ($NANO_MAKE_CONF_BUILD)" mkdir -p ${MAKEOBJDIRPREFIX} @@ -312,9 +311,9 @@ make_conf_build ( ) ( echo "${CONF_WORLD}" echo "${CONF_BUILD}" ) > ${NANO_MAKE_CONF_BUILD} -) +} -build_world ( ) ( +build_world() { pprint 2 "run buildworld" pprint 3 "log: ${MAKEOBJDIRPREFIX}/_.bw" @@ -324,9 +323,9 @@ build_world ( ) ( cd "${NANO_SRC}" ${NANO_PMAKE} buildworld ) > ${MAKEOBJDIRPREFIX}/_.bw 2>&1 -) +} -build_kernel ( ) ( +build_kernel() { pprint 2 "build kernel ($NANO_KERNEL)" pprint 3 "log: ${MAKEOBJDIRPREFIX}/_.bk" @@ -342,9 +341,9 @@ build_kernel ( ) ( cd "${NANO_SRC}" ${NANO_PMAKE} buildkernel ) > ${MAKEOBJDIRPREFIX}/_.bk 2>&1 -) +} -clean_world ( ) ( +clean_world() { if [ "${NANO_OBJ}" != "${MAKEOBJDIRPREFIX}" ]; then pprint 2 "Clean and create object directory (${NANO_OBJ})" if ! rm -xrf ${NANO_OBJ}/ > /dev/null 2>&1 ; then @@ -361,9 +360,9 @@ clean_world ( ) ( fi mkdir -p "${NANO_WORLDDIR}" fi -) +} -make_conf_install ( ) ( +make_conf_install() { pprint 2 "Construct install make.conf ($NANO_MAKE_CONF_INSTALL)" # Make sure we get all the global settings that NanoBSD wants @@ -377,9 +376,9 @@ make_conf_install ( ) ( echo METALOG=${NANO_METALOG} fi ) > ${NANO_MAKE_CONF_INSTALL} -) +} -install_world ( ) ( +install_world() { pprint 2 "installworld" pprint 3 "log: ${NANO_LOG}/_.iw" @@ -390,9 +389,9 @@ install_world ( ) ( ${NANO_MAKE} installworld DESTDIR="${NANO_WORLDDIR}" DB_FROM_SRC=yes chflags -R noschg "${NANO_WORLDDIR}" ) > ${NANO_LOG}/_.iw 2>&1 -) +} -install_etc ( ) ( +install_etc() { pprint 2 "install /etc" pprint 3 "log: ${NANO_LOG}/_.etc" @@ -405,9 +404,9 @@ install_etc ( ) ( # so they can spam it. cp /dev/null "${NANO_WORLDDIR}"/etc/make.conf ) > ${NANO_LOG}/_.etc 2>&1 -) +} -install_kernel ( ) ( +install_kernel() { pprint 2 "install kernel ($NANO_KERNEL)" pprint 3 "log: ${NANO_LOG}/_.ik" @@ -426,9 +425,9 @@ install_kernel ( ) ( ${NANO_MAKE} installkernel DESTDIR="${NANO_WORLDDIR}" DB_FROM_SRC=yes ) > ${NANO_LOG}/_.ik 2>&1 -) +} -native_xtools ( ) ( +native_xtools() { pprint 2 "Installing the optimized native build tools for cross env" pprint 3 "log: ${NANO_LOG}/_.native_xtools" @@ -441,13 +440,13 @@ native_xtools ( ) ( ${NANO_MAKE} native-xtools-install DESTDIR="${NANO_WORLDDIR}" ) > ${NANO_LOG}/_.native_xtools 2>&1 -) +} # # Run the requested set of early customization scripts, run before # buildworld. # -run_early_customize ( ) { +run_early_customize() { pprint 2 "run early customize scripts" for c in $NANO_EARLY_CUSTOMIZE do @@ -467,7 +466,7 @@ run_early_customize ( ) { # done an installworld, installed the etc files, installed the kernel # and tweaked them in the standard way. # -run_customize ( ) ( +run_customize() { pprint 2 "run customize scripts" for c in $NANO_CUSTOMIZE @@ -477,13 +476,13 @@ run_customize ( ) ( pprint 4 "`type $c`" ( set -o xtrace ; $c ) > ${NANO_LOG}/_.cust.$c 2>&1 done -) +} # # Run any last-minute customization commands after we've had a chance to # setup nanobsd, prune empty dirs from /usr, etc # -run_late_customize ( ) ( +run_late_customize() { pprint 2 "run late customize scripts" for c in $NANO_LATE_CUSTOMIZE do @@ -492,7 +491,7 @@ run_late_customize ( ) ( pprint 4 "`type $c`" ( set -o xtrace ; $c ) > ${NANO_LOG}/_.late_cust.$c 2>&1 done -) +} # # Hook called after we run all the late customize commands, but @@ -501,7 +500,7 @@ run_late_customize ( ) ( # have been recording their actions. It's not anticipated that # a user's cfg file would override this. # -fixup_before_diskimage ( ) ( +fixup_before_diskimage() { # Run the deduplication script that takes the metalog journal and # combines multiple entries for the same file (see source for # details). We take the extra step of removing the size keywords. This @@ -517,9 +516,9 @@ fixup_before_diskimage ( ) ( cat ${NANO_METALOG}.pre | ${NANO_TOOLS}/mtree-dedup.awk | \ sed -e 's/ size=[0-9][0-9]*//' | sort >> ${NANO_METALOG} fi -) +} -setup_nanobsd ( ) ( +setup_nanobsd() { pprint 2 "configure nanobsd setup" pprint 3 "log: ${NANO_LOG}/_.dl" @@ -564,9 +563,9 @@ setup_nanobsd ( ) ( tgt_dir2symlink tmp var/tmp ) > ${NANO_LOG}/_.dl 2>&1 -) +} -setup_nanobsd_etc ( ) ( +setup_nanobsd_etc() { pprint 2 "configure nanobsd /etc" ( @@ -623,18 +622,18 @@ EOF # Create directory for eventual /usr/local/etc contents mkdir -p etc/local ) -) +} -prune_usr ( ) ( +prune_usr() { # Remove all empty directories in /usr find "${NANO_WORLDDIR}"/usr -type d -depth -print | while read d do rmdir $d > /dev/null 2>&1 || true done -) +} -newfs_part ( ) ( +newfs_part() { local dev mnt lbl dev=$1 mnt=$2 @@ -642,15 +641,15 @@ newfs_part ( ) ( echo newfs ${NANO_NEWFS} ${NANO_LABEL:+-L${NANO_LABEL}${lbl}} ${dev} newfs ${NANO_NEWFS} ${NANO_LABEL:+-L${NANO_LABEL}${lbl}} ${dev} mount -o async ${dev} ${mnt} -) +} # Convenient spot to work around any umount issues that your build environment # hits by overriding this method. -nano_umount ( ) ( +nano_umount() { umount ${1} -) +} -populate_slice ( ) ( +populate_slice() { local dev dir mnt lbl dev=$1 dir=$2 @@ -665,23 +664,23 @@ populate_slice ( ) ( fi df -i ${mnt} nano_umount ${mnt} -) +} -populate_cfg_slice ( ) ( +populate_cfg_slice() { populate_slice "$1" "$2" "$3" "$4" -) +} -populate_data_slice ( ) ( +populate_data_slice() { populate_slice "$1" "$2" "$3" "$4" -) +} -last_orders ( ) ( +last_orders() { # Redefine this function with any last orders you may have # after the build completed, for instance to copy the finished # image to a more convenient place: # cp ${NANO_DISKIMGDIR}/${NANO_IMG1NAME} /home/ftp/pub/nanobsd.disk true -) +} ####################################################################### # @@ -693,7 +692,7 @@ last_orders ( ) ( # Common Flash device geometries # -FlashDevice ( ) { +FlashDevice() { if [ -d ${NANO_TOOLS} ] ; then . ${NANO_TOOLS}/FlashDevice.sub else @@ -722,8 +721,8 @@ FlashDevice ( ) { # The generic-hdd device is preferred for flash devices larger than 1GB. # -UsbDevice ( ) { - a1=`echo $1 | tr '[:upper:]' '[:lower:]'` +UsbDevice() { + local a1=`echo $1 | tr '[:upper:]' '[:lower:]'` case $a1 in generic-fdd) NANO_HEADS=64 @@ -745,7 +744,7 @@ UsbDevice ( ) { ####################################################################### # Setup serial console -cust_comconsole ( ) ( +cust_comconsole() { # Enable getty on console sed -i "" -e '/^tty[du]0/s/off/onifconsole/' ${NANO_WORLDDIR}/etc/ttys @@ -754,20 +753,20 @@ cust_comconsole ( ) ( # Tell loader to use serial console early. echo "${NANO_BOOT2CFG}" > ${NANO_WORLDDIR}/boot.config -) +} ####################################################################### # Allow root login via ssh -cust_allow_ssh_root ( ) ( +cust_allow_ssh_root() { sed -i "" -E 's/^#?PermitRootLogin.*/PermitRootLogin yes/' \ ${NANO_WORLDDIR}/etc/ssh/sshd_config -) +} ####################################################################### # Install the stuff under ./Files -cust_install_files ( ) ( +cust_install_files() ( cd "${NANO_TOOLS}/Files" find . -print | grep -Ev '/(CVS|\.svn|\.hg|\.git)/' | cpio ${CPIO_SYMLINK} -Ldumpv ${NANO_WORLDDIR} @@ -779,7 +778,7 @@ cust_install_files ( ) ( ####################################################################### # Install packages from ${NANO_PACKAGE_DIR} -cust_pkgng ( ) ( +cust_pkgng() { mkdir -p ${NANO_WORLDDIR}/usr/local/etc local PKG_CONF="${NANO_WORLDDIR}/usr/local/etc/pkg.conf" local PKGCMD="env BATCH=YES ASSUME_ALWAYS_YES=YES PKG_DBDIR=${NANO_PKG_META_BASE}/pkg SIGNATURE_TYPE=none /usr/sbin/pkg" @@ -841,14 +840,14 @@ cust_pkgng ( ) ( umount ${NANO_WORLDDIR}/dev umount ${NANO_WORLDDIR}/_.p rm -xrf ${NANO_WORLDDIR}/_.p -) +} ####################################################################### # Convenience function: # Register all args as early customize function to run just before # build commences. -early_customize_cmd ( ) { +early_customize_cmd() { NANO_EARLY_CUSTOMIZE="$NANO_EARLY_CUSTOMIZE $*" } @@ -856,7 +855,7 @@ early_customize_cmd ( ) { # Convenience function: # Register all args as customize function. -customize_cmd ( ) { +customize_cmd() { NANO_CUSTOMIZE="$NANO_CUSTOMIZE $*" } @@ -865,7 +864,7 @@ customize_cmd ( ) { # Register all args as late customize function to run just before # image creation. -late_customize_cmd ( ) { +late_customize_cmd() { NANO_LATE_CUSTOMIZE="$NANO_LATE_CUSTOMIZE $*" } @@ -877,16 +876,16 @@ late_customize_cmd ( ) { # Progress Print # Print $2 at level $1. -pprint ( ) ( +pprint() { if [ "$1" -le $PPLEVEL ]; then runtime=$(( `date +%s` - $NANO_STARTTIME )) printf "%s %.${1}s %s\n" "`date -u -r $runtime +%H:%M:%S`" "#####" "$2" 1>&3 fi -) +} -usage ( ) { +usage() { ( - echo "Usage: $0 [-BbfhIiKknqvWwX] [-c config_file]" + echo "Usage: $0 [-BbfhIiKknpqvWwX] [-c config_file]" echo " -B suppress installs (both kernel and world)" echo " -b suppress builds (both kernel and world)" echo " -c specify config file" @@ -897,6 +896,7 @@ usage ( ) { echo " -K suppress installkernel" echo " -k suppress buildkernel" echo " -n add -DNO_CLEAN to buildworld, buildkernel, etc" + echo " -p suppress preparing the image" echo " -q make output more quiet" echo " -v make output more verbose" echo " -W suppress installworld" @@ -910,7 +910,7 @@ usage ( ) { # Setup and Export Internal variables # -export_var ( ) { # Don't want a subshell +export_var() { var=$1 # Lookup value of the variable. eval val=\$$var @@ -919,8 +919,7 @@ export_var ( ) { # Don't want a subshell } # Call this function to set defaults _after_ parsing options. -# don't want a subshell otherwise variable setting is thrown away. -set_defaults_and_export ( ) { +set_defaults_and_export() { : ${NANO_OBJ:=/usr/obj/nanobsd.${NANO_NAME}${NANO_LAYOUT:+.${NANO_LAYOUT}}} : ${MAKEOBJDIRPREFIX:=${NANO_OBJ}} : ${NANO_DISKIMGDIR:=${NANO_OBJ}} diff --git a/tools/tools/nanobsd/embedded/common b/tools/tools/nanobsd/embedded/common index 4aecd3602f6f..132ca9e2ba5b 100644 --- a/tools/tools/nanobsd/embedded/common +++ b/tools/tools/nanobsd/embedded/common @@ -1,4 +1,4 @@ - +#!/bin/sh #- # Copyright (c) 2015 M. Warner Losh <imp@FreeBSD.org> # Copyright (c) 2010-2011 iXsystems, Inc. @@ -113,18 +113,18 @@ NANO_FAT_DIR=${NANO_LOG}/_.fat customize_cmd cust_allow_ssh_root -add_etc_make_conf ( ) ( +add_etc_make_conf() { touch ${NANO_WORLDDIR}/etc/make.conf -) +} customize_cmd add_etc_make_conf -cust_install_machine_files ( ) ( +cust_install_machine_files() { echo "cd ${NANO_CFG_BASE}/Files" cd ${NANO_CFG_BASE}/Files find . -print | grep -Ev '/(CVS|\.svn|\.hg|\.git)' | cpio -dumpv ${NANO_WORLDDIR} -) +} customize_cmd cust_install_files -customize_cmd cust_install_machine_files +customize_cmd cust_install_machine_files CONF_BUILD=" LOCAL_XTOOL_DIRS=usr.bin/mkimg @@ -173,13 +173,13 @@ NANO_PACKAGE_ONLY=1 # Creates images for all the formats that use MBR / GPT # split later if the #ifdef soup gets too bad. -create_diskimage_gpt ( ) ( +create_diskimage_gpt() { pprint 2 "build diskimage gpt ${NANO_NAME}" create_diskimage_mbr $* -) +} -create_diskimage_mbr ( ) ( +create_diskimage_mbr() { local fmt @@ -314,7 +314,7 @@ create_diskimage_mbr ( ) ( rm -f ${out}.xz xz -9 --keep ${out} ) > ${NANO_LOG}/_.di 2>&1 -) +} die( ) { echo "$*" @@ -373,7 +373,7 @@ $var=$val" fi done -typical_embedded ( ) ( +typical_embedded() { # Need to create rc.conf before we copy over /etc to /conf/base/etc # so now's a good time. @@ -388,10 +388,10 @@ typical_embedded ( ) ( # Make sure that firstboot scripts run so growfs works. # Note: still some issues remvoing this XXX touch ${NANO_WORLDDIR}/firstboot -) +} customize_cmd typical_embedded -fix_pkg ( ) ( +fix_pkg() { chdir ${NANO_WORLDDIR} mkdir -p pkg mkdir -p pkg/db @@ -410,20 +410,20 @@ fix_pkg ( ) ( echo "./pkg/db type=dir uname=root gname=wheel mode=0755" echo "./pkg/tmp type=dir uname=root gname=wheel mode=0755" ) >> ${NANO_METALOG} -) +} customize_cmd fix_pkg -save_build ( ) ( +save_build() { VERSION_FILE=${NANO_WORLDDIR}/etc/version if [ "${SVNREVISION}" = "${REVISION}" ]; then echo "${NANO_NAME}" > "${VERSION_FILE}" else echo "${NANO_NAME} (${SVNREVISION})" > "${VERSION_FILE}" fi -) +} customize_cmd save_build -shrink_md_fbsize ( ) ( +shrink_md_fbsize() { # We have a lot of little files on our memory disks. Let's decrease # the block and frag size to fit more little files on them (this # halves our space requirement by ~50% on /etc and /var on 8.x -- @@ -431,12 +431,12 @@ shrink_md_fbsize ( ) ( # are 4 times larger). sed -i '' -e 's,-S -i 4096,-S -i 4096 -b 4096 -f 512,' \ ${NANO_WORLDDIR}/etc/rc.initdiskless -) +} customize_cmd shrink_md_fbsize customize_cmd cust_comconsole -dos_boot_part ( ) ( +dos_boot_part() { local d=/usr/local/share/u-boot/${NANO_BOOT_PKG} local f=${NANO_FAT_DIR} @@ -453,7 +453,7 @@ dos_boot_part ( ) ( # Now we need to copy over dtb files from the build. cp ${NANO_WORLDDIR}/boot/dtb/*.dtb . -) +} if [ -n "$NANO_BOOT_PKG" ]; then d=/usr/local/share/u-boot/${NANO_BOOT_PKG} @@ -468,7 +468,7 @@ if [ -n "$NANO_BOOT_PKG" ]; then customize_cmd dos_boot_part fi -product_custom ( ) ( +product_custom() { # not quite ready to tweak these in nopriv build if [ -z ${NANO_NOPRIV_BUILD} ]; then # Last second tweaks -- generally not needed @@ -480,7 +480,7 @@ product_custom ( ) ( chown root:wheel ${NANO_WORLDDIR}/ chown root:wheel ${NANO_WORLDDIR}/usr fi -) +} late_customize_cmd product_custom # @@ -615,19 +615,19 @@ esac NANO_SLICE_DATA= # Not included # These don't make any sense to this strategy, so stub them out. -calculate_partitioning ( ) ( -) +calculate_partitioning() { +} # These don't make any sense to this strategy, so stub them out. -create_code_slice ( ) ( -) +create_code_slice() { +} # Each major disk scheme has its own routine. Generally # this is for mbr, gpt, etc. These are generally are widely # shared, but some specialized formats won't be shared. -create_diskimage ( ) ( +create_diskimage() { eval create_diskimage_${NANO_DISK_SCHEME} -) +} # Set the path to the same path we use for buldworld to use latest mkimg NANO_TARGET=$(cd ${NANO_SRC}; ${NANO_MAKE} TARGET_ARCH=${NANO_ARCH} -V _TARGET) diff --git a/tools/tools/nanobsd/legacy.sh b/tools/tools/nanobsd/legacy.sh index 2f689212263e..cbe56d6f560c 100644 --- a/tools/tools/nanobsd/legacy.sh +++ b/tools/tools/nanobsd/legacy.sh @@ -34,7 +34,7 @@ # Functions and variable definitions used by the legacy nanobsd # image building system. -calculate_partitioning ( ) ( +calculate_partitioning() { echo $NANO_MEDIASIZE $NANO_IMAGES \ $NANO_SECTS $NANO_HEADS \ $NANO_CODESIZE $NANO_CONFSIZE $NANO_DATASIZE | @@ -90,9 +90,9 @@ calculate_partitioning ( ) ( } } ' > ${NANO_LOG}/_.partitioning -) +} -create_code_slice ( ) ( +create_code_slice() { pprint 2 "build code slice" pprint 3 "log: ${NANO_OBJ}/_.cs" @@ -142,10 +142,10 @@ create_code_slice ( ) ( trap - 1 2 15 EXIT ) > ${NANO_OBJ}/_.cs 2>&1 -) +} -create_diskimage ( ) ( +create_diskimage() { pprint 2 "build diskimage" pprint 3 "log: ${NANO_OBJ}/_.di" @@ -243,4 +243,4 @@ create_diskimage ( ) ( trap - 1 2 15 EXIT ) > ${NANO_LOG}/_.di 2>&1 -) +} diff --git a/tools/tools/nanobsd/nanobsd.sh b/tools/tools/nanobsd/nanobsd.sh index 4c390d8ca371..208bc646122d 100755 --- a/tools/tools/nanobsd/nanobsd.sh +++ b/tools/tools/nanobsd/nanobsd.sh @@ -49,7 +49,7 @@ do_prep_image=true . "${topdir}/legacy.sh" set +e -args=`getopt BKXWbc:fhiIknqvw $*` +args=`getopt BKXWbc:fhiIknpqvw $*` if [ $? -ne 0 ] ; then usage exit 2 @@ -66,6 +66,15 @@ do do_installkernel=false shift ;; + -I) + do_world=false + do_kernel=false + do_installworld=false + do_installkernel=false + do_prep_image=false + do_image=true + shift + ;; -K) do_installkernel=false shift @@ -112,6 +121,10 @@ do do_clean=false shift ;; + -p) + do_prep_image=false + shift + ;; -q) PPLEVEL=$(($PPLEVEL - 1)) shift @@ -124,15 +137,6 @@ do do_world=false shift ;; - -I) - do_world=false - do_kernel=false - do_installworld=false - do_installkernel=false - do_prep_image=false - do_image=true - shift - ;; --) shift break @@ -158,7 +162,11 @@ fi pprint 1 "NanoBSD image ${NANO_NAME} build starting" -run_early_customize +if $do_prep_image ; then + run_early_customize +else + pprint 2 "Skipping early customization for image prep (as instructed)" +fi if $do_world ; then if $do_clean ; then diff --git a/tools/tools/nanobsd/rescue/Files/root/ZFS_Create.txt b/tools/tools/nanobsd/rescue/Files/root/ZFS_Create.txt index 1f475c957c0c..ece050bfab55 100644 --- a/tools/tools/nanobsd/rescue/Files/root/ZFS_Create.txt +++ b/tools/tools/nanobsd/rescue/Files/root/ZFS_Create.txt @@ -25,10 +25,10 @@ zfs_load="YES" vfs.root.mountfrom="zfs:boot/ROOT/root" #ZFS optional vm.kmem_size="8G" -vfs.zfs.arc_min="1G" -vfs.zfs.arc_max="2G" -vfs.zfs.prefetch_disable="1" -vfs.zfs.zil_disable=1 +vfs.zfs.arc.min="1G" +vfs.zfs.arc.max="2G" +vfs.zfs.prefetch.disable="1" +vfs.zfs.zil.replay_disable=1 vfs.zfs.zio.use_uma=0 #Power savings hw.pci.do_power_nodriver=3 diff --git a/tools/tools/nanobsd/rescue/common b/tools/tools/nanobsd/rescue/common index 15bf10f5e67d..a145a1ded32a 100644 --- a/tools/tools/nanobsd/rescue/common +++ b/tools/tools/nanobsd/rescue/common @@ -1,5 +1,5 @@ -# -# +#!/bin/sh + #NANO_SRC=$(pwd) #NANO_SRC=${NANO_SRC%/tools/tools/nanobsd/rescue} #NANO_OBJ=${NANO_SRC}/../nanobsd-builds/${NANO_NAME}/obj @@ -24,12 +24,12 @@ NANO_MD_BACKING=file # Options to put in make.conf during buildworld only CONF_BUILD=' ' -# Options to put in make.conf during installworld only +# Options to put in make.conf during installworld only CONF_INSTALL=' ' -# Options to put in make.conf during both build- & installworld. -CONF_WORLD=' -CFLAGS=-O -pipe +# Options to put in make.conf during both build- & installworld. +CONF_WORLD=' +CFLAGS=-O -pipe # We do not need these for rescue WITHOUT_TESTS=true WITHOUT_DEBUG_FILES=true @@ -71,9 +71,9 @@ customize_cmd cust_install_files #customize_cmd cust_pkgng -cust_etc_cfg () ( - cd ${NANO_WORLDDIR} -# mkdir -pv scratch +cust_etc_cfg() { + cd ${NANO_WORLDDIR} + # mkdir -pv scratch echo "hostname=\"rescue\"" > etc/rc.conf echo "font8x14=\"iso15-8x14\"" >> etc/rc.conf echo "font8x16=\"iso15-8x16\"" >> etc/rc.conf @@ -85,12 +85,12 @@ cust_etc_cfg () ( echo "/dev/${NANO_DRIVE}s3 /cfg ufs rw,noauto 2 2" >> etc/fstab echo "tmpfs /boot/zfs tmpfs rw,size=1048576,mode=777 0 0" >> etc/fstab echo "ports:/usr/ports /usr/ports nfs rw,noauto,noatime,bg,soft,intr,nfsv3 0 0" >> etc/fstab -# echo "/dev/ad1s1a /scratch ufs rw,noauto,noatime 0 0" >> etc/fstab + # echo "/dev/ad1s1a /scratch ufs rw,noauto,noatime 0 0" >> etc/fstab /usr/sbin/pwd_mkdb -d etc etc/master.passwd -) +} customize_cmd cust_etc_cfg -setup_nanobsd_etc ( ) ( +setup_nanobsd_etc() { pprint 2 "configure nanobsd /etc" ( cd ${NANO_WORLDDIR} @@ -102,8 +102,8 @@ setup_nanobsd_etc ( ) ( echo "NANO_DRIVE=${NANO_DRIVE}" > etc/nanobsd.conf mkdir -p cfg ) -) -last_orders () ( +} +last_orders() { pprint 2 "last orders" ( cd ${NANO_WORLDDIR} @@ -112,7 +112,7 @@ last_orders () ( echo "/dev/iso9660/${BIGLABEL} / cd9660 ro,noatime 0 0" > etc/fstab echo "tmpfs /boot/zfs tmpfs rw,size=1048576,mode=777 0 0" >> etc/fstab echo "ports:/usr/ports /usr/ports nfs rw,noauto,noatime,bg,soft,intr,nfsv3 0 0" >> etc/fstab -# echo "/dev/ad1s1a /scratch ufs rw,noauto,noatime 0 0" >> etc/fstab + # echo "/dev/ad1s1a /scratch ufs rw,noauto,noatime 0 0" >> etc/fstab rm -f conf/default/etc/remount touch conf/default/etc/.keepme touch conf/default/var/.keepme @@ -125,4 +125,4 @@ last_orders () ( -o label="${BIGLABEL}" -o publisher="RMX" \ -o bootimage="i386;_.w/boot/cdboot" -o no-emul-boot _.disk.iso _.w/ ) -) +} diff --git a/tools/tools/net80211/Makefile b/tools/tools/net80211/Makefile index b4b32899cd26..e87b754c4635 100644 --- a/tools/tools/net80211/Makefile +++ b/tools/tools/net80211/Makefile @@ -1,3 +1,3 @@ -SUBDIR= stumbler w00t wesside wlaninject wlanstats wlantxtime wlanwatch wlanwds +SUBDIR= stumbler w00t wesside wlaninject wlantxtime wlanwatch wlanwds .include <bsd.subdir.mk> diff --git a/tools/tools/net80211/README b/tools/tools/net80211/README index a73f086f5589..b34bcfedec73 100644 --- a/tools/tools/net80211/README +++ b/tools/tools/net80211/README @@ -8,7 +8,6 @@ stumbler view nearby networks using raw packet interface w00t variety of programs that use the raw packet interface wesside WEP frag attack tool using raw packet interface wlaninject inject 802.11 packets using the raw packet interface -wlanstats dump net80211 statistics wlanwatch monitor net80211 events via the routing socket wlanwds handling of WDS dynamic links using vaps diff --git a/tools/tools/netrate/tcpp/README b/tools/tools/netrate/tcpp/README index 6817bdf8ca25..ec0313a62eb8 100644 --- a/tools/tools/netrate/tcpp/README +++ b/tools/tools/netrate/tcpp/README @@ -84,7 +84,7 @@ In my testing, I use loader.conf entries of: kern.ipc.maxsockets=1000000 net.inet.tcp.maxtcptw=3000000 -kern.ipc.somaxconn=49152 +kern.ipc.soacceptqueue=49152 kern.ipc.nmbjumbo16=262144 kern.ipc.nmbjumbo9=262144 kern.ipc.nmbjumbop=262144 diff --git a/tools/tools/sysdoc/tunables.mdoc b/tools/tools/sysdoc/tunables.mdoc index 20b59f450cf2..397fe632322d 100644 --- a/tools/tools/sysdoc/tunables.mdoc +++ b/tools/tools/sysdoc/tunables.mdoc @@ -806,7 +806,7 @@ kern.ipc.nsfbufs kern.ipc.numopensockets --- -kern.ipc.somaxconn +kern.ipc.soacceptqueue int The maximum pending socket connection queue size. |
