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
This commit is contained in:
Peter Wemm 1997-03-31 16:43:16 +00:00
parent 0e1cf9a328
commit 4af9705ceb
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=24457

View File

@ -206,7 +206,10 @@ mkfs(pp, fsys, fi, fo)
} }
close(fd); close(fd);
} else { } else {
if (fssize * sectorsize > memleft) #ifndef STANDALONE
get_memleft();
#endif
if (fssize * sectorsize > (memleft - 16384))
fssize = (memleft - 16384) / sectorsize; fssize = (memleft - 16384) / sectorsize;
if ((membase = malloc(fssize * sectorsize)) == 0) { if ((membase = malloc(fssize * sectorsize)) == 0) {
perror("malloc"); perror("malloc");
@ -1210,6 +1213,19 @@ raise_data_limit()
perror("setrlimit"); 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 */ #endif /* STANDALONE */
/* /*