Index: head/tests/sys/kern/Makefile =================================================================== --- head/tests/sys/kern/Makefile (revision 360018) +++ head/tests/sys/kern/Makefile (revision 360019) @@ -1,72 +1,80 @@ # $FreeBSD$ +PACKAGE= tests + TESTSRC= ${SRCTOP}/contrib/netbsd-tests/kernel .PATH: ${SRCTOP}/sys/kern TESTSDIR= ${TESTSBASE}/sys/kern #ATF_TESTS_C+= kcov ATF_TESTS_C+= kern_copyin ATF_TESTS_C+= kern_descrip_test ATF_TESTS_C+= kill_zombie ATF_TESTS_C+= memfd_test ATF_TESTS_C+= ptrace_test TEST_METADATA.ptrace_test+= timeout="15" ATF_TESTS_C+= reaper ATF_TESTS_C+= sigaltstack PLAIN_TESTS_C+= subr_unit_test ATF_TESTS_C+= sys_getrandom ATF_TESTS_C+= unix_passfd_test ATF_TESTS_C+= unix_seqpacket_test TEST_METADATA.unix_seqpacket_test+= timeout="15" ATF_TESTS_C+= unix_socketpair_test ATF_TESTS_C+= waitpid_nohang ATF_TESTS_C+= pdeathsig ATF_TESTS_SH+= coredump_phnum_test +ATF_TESTS_SH+= sonewconn_overflow +TEST_METADATA.sonewconn_overflow+= required_programs="python" +TEST_METADATA.sonewconn_overflow+= required_user="root" + +${PACKAGE}FILES+= sonewconn_overflow.py +${PACKAGE}FILESMODE_sonewconn_overflow.py=0555 BINDIR= ${TESTSDIR} PROGS+= coredump_phnum_helper PROGS+= pdeathsig_helper CFLAGS.sys_getrandom+= -I${SRCTOP}/sys/contrib/zstd/lib LIBADD.sys_getrandom+= zstd LIBADD.sys_getrandom+= c LIBADD.sys_getrandom+= pthread LIBADD.ptrace_test+= pthread LIBADD.unix_seqpacket_test+= pthread LIBADD.kcov+= pthread NETBSD_ATF_TESTS_C+= lockf_test NETBSD_ATF_TESTS_C+= mqueue_test NETBSD_ATF_TESTS_C+= sysv_test CFLAGS.mqueue_test+= -I${SRCTOP}/tests LIBADD.mqueue_test+= rt .if ${MACHINE_ARCH} == "amd64" || \ ${MACHINE_ARCH} == "i386" || \ ${MACHINE_ARCH} == "aarch64" ATF_TESTS_C+= libkern_crc32 .if ${MACHINE_ARCH} == "amd64" || ${MACHINE_ARCH} == "i386" LDADD.libkern_crc32+= ${SRCTOP}/sys/libkern/x86/crc32_sse42.c .else LDADD.libkern_crc32+= ${SRCTOP}/sys/libkern/arm64/crc32c_armv8.S .endif .endif # subr_unit.c contains functions whose prototypes lie in headers that cannot be # included in userland. But as far as subr_unit_test goes, they're effectively # static. So it's ok to disable -Wmissing-prototypes for this program. CFLAGS.subr_unit.c+= -Wno-missing-prototypes SRCS.subr_unit_test+= subr_unit.c WARNS?= 3 TESTS_SUBDIRS+= acct TESTS_SUBDIRS+= execve TESTS_SUBDIRS+= pipe .include .include Index: head/tests/sys/kern/sonewconn_overflow.py =================================================================== --- head/tests/sys/kern/sonewconn_overflow.py (nonexistent) +++ head/tests/sys/kern/sonewconn_overflow.py (revision 360019) @@ -0,0 +1,156 @@ +#!/usr/bin/env python +#- +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2020 Netflix, Inc. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ +# + +import socket +import os +import sys +from subprocess import check_output +from time import sleep + +V4HOST = '127.0.0.1' +V6HOST = '::1' +TCPPORT = 65432 +UNIXSOCK = '/tmp/testsock' +TYPE = socket.SOCK_STREAM + +class GenericTest(object): + def __init__(self): + raise NotImplementedError("Subclass must override the __init__ method") + def setup(self, af, addr): + self.sockets = [] + self.ls = None + self.ls = socket.socket(af, TYPE) + self.ls.bind(addr) + self.ls.listen(2) + self.af = af + self.addr = addr + def doTest(self, cnt): + rv = 0 + for i in range(0, cnt): + try: + s = socket.socket(self.af, TYPE) + s.connect(self.addr) + except: + continue + self.sockets.append(s) + rv += 1 + return rv + def __del__(self): + for s in self.sockets: + s.close() + if self.ls is not None: + self.ls.close() + +class IPv4Test(GenericTest): + def __init__(self): + super(IPv4Test, self).setup(socket.AF_INET, (V4HOST, TCPPORT)) + +class IPv6Test(GenericTest): + def __init__(self): + super(IPv6Test, self).setup(socket.AF_INET6, (V6HOST, TCPPORT)) + +class UnixTest(GenericTest): + def __init__(self): + super(UnixTest, self).setup(socket.AF_UNIX, UNIXSOCK) + def __del__(self): + super(UnixTest, self).__del__() + os.remove(UNIXSOCK) + +class LogChecker(): + def __init__(self): + # Figure out how big the dmesg buffer is. + self.dmesgOff = len(check_output("/sbin/dmesg")) + + def checkForMsg(self, expected): + newOff = self.dmesgOff + for i in range(0, 3): + dmesg = check_output("/sbin/dmesg") + newOff = len(dmesg) + if newOff >= self.dmesgOff: + dmesg = dmesg[self.dmesgOff:] + for line in dmesg.splitlines(): + try: + if str(line).find(expected) >= 0: + self.dmesgOff = newOff + return True + except: + pass + sleep(0.5) + self.dmesgOff = newOff + return False + +def main(): + ip4 = IPv4Test() + ip6 = IPv6Test() + lcl = UnixTest() + lc = LogChecker() + failure = False + + STDLOGMSG = "Listen queue overflow: 4 already in queue awaiting acceptance (1 occurrences)" + + V4LOGMSG = "(%s:%d (proto 6)): %s" % (V4HOST, TCPPORT, STDLOGMSG) + ip4.doTest(5) + if not lc.checkForMsg(V4LOGMSG): + failure = True + sys.stderr.write("IPv4 log message not seen\n") + else: + ip4.doTest(1) + if lc.checkForMsg(V4LOGMSG): + failure = True + sys.stderr.write("Subsequent IPv4 log message not suppressed\n") + + V6LOGMSG = "([%s]:%d (proto 6)): %s" % (V6HOST, TCPPORT, STDLOGMSG) + ip6.doTest(5) + if not lc.checkForMsg(V6LOGMSG): + failure = True + sys.stderr.write("IPv6 log message not seen\n") + else: + ip6.doTest(1) + if lc.checkForMsg(V6LOGMSG): + failure = True + sys.stderr.write("Subsequent IPv6 log message not suppressed\n") + + UNIXLOGMSG = "(local:%s): %s" % (UNIXSOCK, STDLOGMSG) + lcl.doTest(5) + if not lc.checkForMsg(UNIXLOGMSG): + failure = True + sys.stderr.write("Unix socket log message not seen\n") + else: + lcl.doTest(1) + if lc.checkForMsg(UNIXLOGMSG): + failure = True + sys.stderr.write("Subsequent Unix socket log message not suppressed\n") + + if failure: + sys.exit(1) + sys.exit(0) + +if __name__ == '__main__': + main() Property changes on: head/tests/sys/kern/sonewconn_overflow.py ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/tests/sys/kern/sonewconn_overflow.sh =================================================================== --- head/tests/sys/kern/sonewconn_overflow.sh (nonexistent) +++ head/tests/sys/kern/sonewconn_overflow.sh (revision 360019) @@ -0,0 +1,43 @@ +# $FreeBSD$ +#- +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2020 Netflix, Inc. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# + +atf_test_case sonewconn_overflow_01 +sonewconn_overflow_01_head() +{ + atf_set descr "Check the operation of the sonewconn() listen queue overflow messages" +} + +sonewconn_overflow_01_body() +{ + atf_check -s exit:0 $(atf_get_srcdir)/sonewconn_overflow.py +} + +atf_init_test_cases() +{ + atf_add_test_case sonewconn_overflow_01 +} Property changes on: head/tests/sys/kern/sonewconn_overflow.sh ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property