1977d8fb9SPeter Holm#!/bin/sh 2977d8fb9SPeter Holm 3977d8fb9SPeter Holm# 4*4d846d26SWarner Losh# SPDX-License-Identifier: BSD-2-Clause 5977d8fb9SPeter Holm# 6977d8fb9SPeter Holm# Copyright (c) 2022 Peter Holm <pho@FreeBSD.org> 7977d8fb9SPeter Holm# 8977d8fb9SPeter Holm# Redistribution and use in source and binary forms, with or without 9977d8fb9SPeter Holm# modification, are permitted provided that the following conditions 10977d8fb9SPeter Holm# are met: 11977d8fb9SPeter Holm# 1. Redistributions of source code must retain the above copyright 12977d8fb9SPeter Holm# notice, this list of conditions and the following disclaimer. 13977d8fb9SPeter Holm# 2. Redistributions in binary form must reproduce the above copyright 14977d8fb9SPeter Holm# notice, this list of conditions and the following disclaimer in the 15977d8fb9SPeter Holm# documentation and/or other materials provided with the distribution. 16977d8fb9SPeter Holm# 17977d8fb9SPeter Holm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18977d8fb9SPeter Holm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19977d8fb9SPeter Holm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20977d8fb9SPeter Holm# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21977d8fb9SPeter Holm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22977d8fb9SPeter Holm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23977d8fb9SPeter Holm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24977d8fb9SPeter Holm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25977d8fb9SPeter Holm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26977d8fb9SPeter Holm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27977d8fb9SPeter Holm# SUCH DAMAGE. 28977d8fb9SPeter Holm# 29977d8fb9SPeter Holm 308dcc207dSPeter Holm# Demonstrate that a mapped SHARED file can be updated past LIMIT_FSIZE 31977d8fb9SPeter Holm 32977d8fb9SPeter Holm# Kostik wrote: 33977d8fb9SPeter Holm# This one should be reproducible when you 34977d8fb9SPeter Holm# - have file larger than e.g. RLIMIT_FSIZE 35977d8fb9SPeter Holm# - mmaped it without closing the file descriptor 36977d8fb9SPeter Holm# - dirty its pages beyond the limit 37977d8fb9SPeter Holm# - then unmap 38977d8fb9SPeter Holm# - then close the file descriptor. 39977d8fb9SPeter Holm 40977d8fb9SPeter Holm[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 41977d8fb9SPeter Holm 42977d8fb9SPeter Holm. ../default.cfg 43977d8fb9SPeter Holm 44977d8fb9SPeter Holmcat > /tmp/setrlimit2.c <<EOF 45977d8fb9SPeter Holm#include <sys/param.h> 46977d8fb9SPeter Holm#include <sys/mman.h> 47977d8fb9SPeter Holm#include <sys/resource.h> 48977d8fb9SPeter Holm#include <sys/stat.h> 49977d8fb9SPeter Holm 50977d8fb9SPeter Holm#include <err.h> 51977d8fb9SPeter Holm#include <errno.h> 52977d8fb9SPeter Holm#include <fcntl.h> 53977d8fb9SPeter Holm#include <signal.h> 54977d8fb9SPeter Holm#include <stdio.h> 55977d8fb9SPeter Holm#include <stdlib.h> 56977d8fb9SPeter Holm#include <unistd.h> 57977d8fb9SPeter Holm 58977d8fb9SPeter Holmstatic int signals; 59977d8fb9SPeter Holm 60977d8fb9SPeter Holmstatic void 61977d8fb9SPeter Holmhandler(int sig __unused) 62977d8fb9SPeter Holm{ 63977d8fb9SPeter Holm signals++; 64977d8fb9SPeter Holm} 65977d8fb9SPeter Holm 66977d8fb9SPeter Holmint 67977d8fb9SPeter Holmmain(int argc, char *argv[]) 68977d8fb9SPeter Holm{ 69977d8fb9SPeter Holm struct rlimit rlim; 70977d8fb9SPeter Holm struct sigaction act; 71977d8fb9SPeter Holm struct stat st; 72977d8fb9SPeter Holm size_t len; 73977d8fb9SPeter Holm int error, fd, ps; 74977d8fb9SPeter Holm char *file, *p; 75977d8fb9SPeter Holm 76977d8fb9SPeter Holm if (argc != 2) { 77977d8fb9SPeter Holm fprintf(stderr, "Usage: %s <data file>\n", argv[0]); 78977d8fb9SPeter Holm exit(1); 79977d8fb9SPeter Holm } 80977d8fb9SPeter Holm act.sa_handler = handler; 81977d8fb9SPeter Holm act.sa_flags = 0; 82977d8fb9SPeter Holm sigemptyset(&act.sa_mask); 83977d8fb9SPeter Holm if (sigaction(SIGXFSZ, &act, NULL) != 0) 84977d8fb9SPeter Holm err(1, "sigaction"); 85977d8fb9SPeter Holm 86977d8fb9SPeter Holm file = argv[1]; 87977d8fb9SPeter Holm ps = getpagesize(); 88977d8fb9SPeter Holm if ((fd = open(file, O_RDWR)) == -1) 89977d8fb9SPeter Holm err(1, "open(%s)", file); 90977d8fb9SPeter Holm if ((error = fstat(fd, &st)) == -1) 91977d8fb9SPeter Holm err(1, "stat(%s)", file); 92977d8fb9SPeter Holm len = round_page(st.st_size); 93977d8fb9SPeter Holm if ((p = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED) 94977d8fb9SPeter Holm err(1, "mmap"); 95977d8fb9SPeter Holm rlim.rlim_cur = rlim.rlim_max = len / 2;; 96977d8fb9SPeter Holm if (setrlimit(RLIMIT_FSIZE, &rlim) == -1) 97977d8fb9SPeter Holm err(1, "setrlimit(%ld)", len / 2); 98977d8fb9SPeter Holm 99977d8fb9SPeter Holm p[len / 2 + ps] = 'a'; 100977d8fb9SPeter Holm 101977d8fb9SPeter Holm if (munmap(p, len) == -1) 102977d8fb9SPeter Holm err(1, "unmap()"); 103977d8fb9SPeter Holm close(fd); 104977d8fb9SPeter Holm 105977d8fb9SPeter Holm} 106977d8fb9SPeter HolmEOF 107977d8fb9SPeter Holmhere=`pwd` 108977d8fb9SPeter Holmcd /tmp 109977d8fb9SPeter Holmmycc -o setrlimit2 -Wall -Wextra -O0 -g setrlimit2.c || exit 1 110977d8fb9SPeter Holmdata=/tmp/setrlimit2.data 111977d8fb9SPeter Holmdd if=/dev/zero of=$data bs=1m count=1 status=none 112977d8fb9SPeter Holmh1=`md5 < $data` 113977d8fb9SPeter Holm 114977d8fb9SPeter Holm./setrlimit2 $data 115977d8fb9SPeter Holm 116977d8fb9SPeter Holmh2=`md5 < $data` 117977d8fb9SPeter Holmrm -f /tmp/setrlimit2 /tmp/setrlimit2.c 118977d8fb9SPeter Holm[ $h1 = $h2 ] && exit 1 || exit 0 119