1 /*	$OpenBSD: malloc_ulimit1.c,v 1.2 2006/05/16 05:47:13 otto 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 main()
26 {
27 	struct rlimit lim;
28 	size_t sz;
29 	int i;
30 	void *p;
31 
32 	if (getrlimit(RLIMIT_DATA, &lim) == -1)
33 		err(1, "getrlimit");
34 
35 	sz = lim.rlim_cur / FACTOR;
36 
37 	for (i = STARTI; i >= 0; i--) {
38 		size_t len = (sz-i) * FACTOR;
39 		p = malloc(len);
40 		free(p);
41 		free(malloc(4096));
42 	}
43 	return (0);
44 }
45