From: Gerd Moellmann Date: Sat, 10 Nov 2001 11:42:38 +0000 (+0000) Subject: (unexec): Use mmap/munmap to allocate buffers X-Git-Tag: emacs-21.2~338 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=027fa1d24cc21de3f4dcf754d41d8111b0de5286;p=emacs.git (unexec): Use mmap/munmap to allocate buffers instead of malloc/free. --- diff --git a/src/ChangeLog b/src/ChangeLog index 75fb6a029e4..deb7bd60d7b 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2001-11-10 Gerd Moellmann + + * unexelf.c (unexec): Use mmap/munmap to allocate buffers + instead of malloc/free. + 2001-11-05 Richard M. Stallman * m/news-risc.h (BROKEN_PROTOTYPES): Defined. diff --git a/src/unexelf.c b/src/unexelf.c index 5519625c783..6153adae2b4 100644 --- a/src/unexelf.c +++ b/src/unexelf.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1985, 1986, 1987, 1988, 1990, 1992, 1999, 2000 +/* Copyright (C) 1985, 1986, 1987, 1988, 1990, 1992, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -683,6 +683,7 @@ unexec (new_name, old_name, data_start, bss_start, entry_address) int old_data_index, new_data2_index; int old_mdebug_index; struct stat stat_buf; + int old_file_size; /* Open the old file, allocate a buffer of the right size, and read * in the file contents. */ @@ -695,16 +696,16 @@ unexec (new_name, old_name, data_start, bss_start, entry_address) if (fstat (old_file, &stat_buf) == -1) fatal ("Can't fstat (%s): errno %d\n", old_name, errno); - old_base = malloc (stat_buf.st_size); - - if (old_base == 0) + /* We cannot use malloc here because that may use sbrk. If it does, + we'd dump our temporary buffers with Emacs, and we'd have to be + extra careful to use the correct value of sbrk(0) after + allocating all buffers in the code below, which we aren't. */ + old_file_size = stat_buf.st_size; + old_base = mmap (NULL, old_file_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE, -1, 0); + if (old_base == (caddr_t) -1) fatal ("Can't allocate buffer for %s\n", old_name); -#ifdef DEBUG - fprintf (stderr, "%s: malloc(%d) -> %x\n", old_name, stat_buf.st_size, - old_base); -#endif - if (read (old_file, old_base, stat_buf.st_size) != stat_buf.st_size) fatal ("Didn't read all of %s: errno %d\n", old_name, errno); @@ -791,16 +792,11 @@ unexec (new_name, old_name, data_start, bss_start, entry_address) if (ftruncate (new_file, new_file_size)) fatal ("Can't ftruncate (%s): errno %d\n", new_name, errno); - new_base = malloc (new_file_size); - - if (new_base == 0) + new_base = mmap (NULL, new_file_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE, -1, 0); + if (new_base == (caddr_t) -1) fatal ("Can't allocate buffer for %s\n", old_name); -#ifdef DEBUG - fprintf (stderr, "%s: malloc(%d) -> %x\n", new_name, new_file_size - new_base); -#endif - new_file_h = (ElfW(Ehdr) *) new_base; new_program_h = (ElfW(Phdr) *) ((byte *) new_base + old_file_h->e_phoff); new_section_h = (ElfW(Shdr) *) @@ -1227,14 +1223,14 @@ unexec (new_name, old_name, data_start, bss_start, entry_address) if (close (new_file)) fatal ("Can't close (%s): errno %d\n", new_name, errno); - free (new_base); + munmap (new_base, new_file_size); /* Close old_file, and free the corresponding buffer */ if (close (old_file)) fatal ("Can't close (%s): errno %d\n", old_name, errno); - free (old_base); + munmap (old_base, old_file_size); /* Make the new file executable */