xref: /openbsd-src/regress/lib/libc/malloc/malloc_ulimit1/malloc_ulimit1.c (revision 093d2a7874ca789cdac942502fadbc051525bb5f)
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. */
26 char *malloc_options = "jj";
27 
28 int
main()29 main()
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