xref: /freebsd/tools/test/stress2/misc/setrlimit2.sh (revision 4d846d260e2b9a3d4d0a701462568268cbfe7a5b)
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