From 4af9705ceb4d13a1e2e04accd8ab7060195b0e16 Mon Sep 17 00:00:00 2001 From: Peter Wemm Date: Mon, 31 Mar 1997 16:43:16 +0000 Subject: [PATCH] Fix the mount_mfs case from the last cleanup. The code was (ab)using it's internal malloc() implementation to try and avoid overstepping it's resource limits (yuk!). Remain using libc's malloc(), but check the resource limits right before trying to malloc the ramdisk space and leave some spare memory for libc. In Andrey's words, the internal malloc was "true evil".. Among it's sins is it's ability to allocate less memory than asked for and still return success. stdio would just love that. :-) Reviewed by: ache --- sbin/newfs/mkfs.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/sbin/newfs/mkfs.c b/sbin/newfs/mkfs.c index 1dbc3a5edf79..0c6c1d7649c3 100644 --- a/sbin/newfs/mkfs.c +++ b/sbin/newfs/mkfs.c @@ -206,7 +206,10 @@ mkfs(pp, fsys, fi, fo) } close(fd); } else { - if (fssize * sectorsize > memleft) +#ifndef STANDALONE + get_memleft(); +#endif + if (fssize * sectorsize > (memleft - 16384)) fssize = (memleft - 16384) / sectorsize; if ((membase = malloc(fssize * sectorsize)) == 0) { perror("malloc"); @@ -1210,6 +1213,19 @@ raise_data_limit() perror("setrlimit"); } +get_memleft() +{ + char *base; + static u_long pgsz, i; + struct rlimit rlp; + + base = sbrk(0); + pgsz = getpagesize() - 1; + i = ((u_long)(base + pgsz) &~ pgsz); + if (getrlimit(RLIMIT_DATA, &rlp) < 0) + perror("getrlimit"); + memleft = rlp.rlim_cur - (u_long)base - i; +} #endif /* STANDALONE */ /*