Index: tests/sys/kern/Makefile =================================================================== --- tests/sys/kern/Makefile +++ tests/sys/kern/Makefile @@ -4,6 +4,7 @@ .PATH: ${SRCTOP}/sys/kern TESTSDIR= ${TESTSBASE}/sys/kern +BINDIR= ${TESTSDIR} ATF_TESTS_C+= kern_copyin ATF_TESTS_C+= kern_descrip_test @@ -13,6 +14,10 @@ ATF_TESTS_C+= unix_passfd_test TEST_METADATA.unix_seqpacket_test+= timeout="15" +ATF_TESTS_SH+= coredump_phnum_test + +PROGS+= coredump_phnum_helper + LIBADD.ptrace_test+= pthread LIBADD.unix_seqpacket_test+= pthread Index: tests/sys/kern/coredump_phnum_helper.c =================================================================== --- /dev/null +++ tests/sys/kern/coredump_phnum_helper.c @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2016, Conrad Meyer + * 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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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$ + */ + +#include +#include + +#include +#include +#include + +int +main(int argc __unused, char **argv __unused) +{ + void *v; + unsigned i; + + for (i = 0; i < UINT16_MAX + 1000; i++) { + v = mmap(NULL, PAGE_SIZE, + (((i % 2) == 0) ? PROT_READ : 0) | PROT_WRITE, + MAP_ANON | MAP_PRIVATE, -1, 0); + if (v == MAP_FAILED) + err(1, "mmap"); + } + abort(); +} Index: tests/sys/kern/coredump_phnum_test.sh =================================================================== --- /dev/null +++ tests/sys/kern/coredump_phnum_test.sh @@ -0,0 +1,57 @@ +atf_test_case coredump_phnum cleanup +coredump_phnum_head() +{ + atf_set "allow_sysctl_side_effects" "1" + atf_set "descr" "More than 65534 segments" + atf_set "require.progs" "readelf procstat" + atf_set "require.user" "root" +} +coredump_phnum_body() +{ + # Set up core dumping + cat > coredump_phnum_restore_state.sh <<-EOF + #!/bin/sh + ulimit -c '$(ulimit -c)' + sysctl kern.coredump=$(sysctl -n kern.coredump) + sysctl kern.corefile='$(sysctl -n kern.corefile)' +EOF + chmod +x coredump_phnum_restore_state.sh + + ulimit -c unlimited + sysctl kern.coredump=1 + sysctl kern.corefile="$(pwd)/coredump_phnum_helper.core" + + atf_check -s signal:sigabrt "$(atf_get_srcdir)/coredump_phnum_helper" + + # Check that core looks good + if [ ! -f coredump_phnum_helper.core ]; then + atf_fail "Helper program did not dump core" + fi + + # These magic numbers don't have any real significance. They are just + # the result of running the helper program and dumping core. The only + # important bit is that they're larger than 65535 (UINT16_MAX). + readelf -h coredump_phnum_helper.core | \ + atf_check -o "match:65535 \(66169\)" \ + grep "Number of program headers:" + readelf -l coredump_phnum_helper.core | \ + atf_check -o "match:There are 66169 program headers" \ + grep -1 "program headers" + readelf -S coredump_phnum_helper.core | \ + atf_check -o "match: 0000000000000001 .* 66169 " \ + grep -A1 "^ \[ 0\] " + + procstat -v coredump_phnum_helper.core | \ + atf_check -o "match:66545" wc -l +} +coredump_phnum_cleanup() +{ + rm -f coredump_phnum_helper.core + ./coredump_phnum_restore_state.sh + rm -f coredump_phnum_restore_state.sh +} + +atf_init_test_cases() +{ + atf_add_test_case coredump_phnum +}