From 3e63a14f34ec33ecb046158328122a09db58c4d7 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 31 Mar 1997 16:43:16 +0000 Subject: 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 1dbc3a5..0c6c1d7 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 */ /* -- cgit v1.1