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