Index: head/tests/sys/kern/Makefile =================================================================== --- head/tests/sys/kern/Makefile +++ head/tests/sys/kern/Makefile @@ -14,6 +14,11 @@ TEST_METADATA.unix_seqpacket_test+= timeout="15" ATF_TESTS_C+= waitpid_nohang +ATF_TESTS_SH+= coredump_phnum_test + +BINDIR= ${TESTSDIR} +PROGS+= coredump_phnum_helper + LIBADD.ptrace_test+= pthread LIBADD.unix_seqpacket_test+= pthread Index: head/tests/sys/kern/coredump_phnum_helper.c =================================================================== --- head/tests/sys/kern/coredump_phnum_helper.c +++ head/tests/sys/kern/coredump_phnum_helper.c @@ -0,0 +1,61 @@ +/* + * 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 + +/* + * This program is intended to create a bunch of segment mappings, then dump + * core. + */ +int +main(int argc __unused, char **argv __unused) +{ + void *v; + unsigned i; + + for (i = 0; i < UINT16_MAX + 1000; i++) { + /* + * Alternate protections; otherwise the kernel will just extend + * the adjacent same-protection previous mapping. + */ + 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"); + } + + /* Dump core. */ + abort(); +} Index: head/tests/sys/kern/coredump_phnum_test.sh =================================================================== --- head/tests/sys/kern/coredump_phnum_test.sh +++ head/tests/sys/kern/coredump_phnum_test.sh @@ -0,0 +1,90 @@ +# +# Copyright (c) 2016 Dell EMC Isilon +# 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 +# substantially 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. +# +# 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 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. +# +# $FreeBSD$ + +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 + if [ -x coredump_phnum_restore_state.sh ]; then + ./coredump_phnum_restore_state.sh + fi + rm -f coredump_phnum_restore_state.sh +} + +atf_init_test_cases() +{ + atf_add_test_case coredump_phnum +}