1/*	$OpenBSD: malloc_ulimit1.c,v 1.5 2019/06/12 11:31:36 bluhm Exp $	*/
2
3/* Public Domain, 2006, Otto Moerbeek <otto@drijf.net> */
4
5#include <sys/types.h>
6#include <sys/time.h>
7#include <sys/resource.h>
8#include <err.h>
9#include <stdlib.h>
10#include <stdio.h>
11
12/*
13 * This code tries to trigger the case present in -current as of April
14 * 2006) where the allocation of the region itself succeeds, but the
15 * page dir entry pages fails.
16 * This in turn trips a "hole in directories" error.
17 * Having a large (512M) ulimit -m helps a lot in triggering the
18 * problem. Note that you may need to run this test multiple times to
19 * see the error.
20*/
21
22#define STARTI	1300
23#define FACTOR	1024
24
25/* This test takes forever with junking turned on. */
26char *malloc_options = "jj";
27
28int
29main()
30{
31	struct rlimit lim;
32	size_t sz;
33	int i;
34	void *p;
35
36	if (getrlimit(RLIMIT_DATA, &lim) == -1)
37		err(1, "getrlimit");
38
39	sz = lim.rlim_cur / FACTOR;
40
41	for (i = STARTI; i >= 0; i--) {
42		size_t len = (sz-i) * FACTOR;
43		p = malloc(len);
44		free(p);
45		free(malloc(4096));
46	}
47	return (0);
48}
49