1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-24 21:41:48 -08:00

(unexec): Use mmap/munmap to allocate buffers

instead of malloc/free.
This commit is contained in:
Gerd Moellmann 2001-11-10 11:42:38 +00:00
parent 46a01cfa80
commit 027fa1d24c
2 changed files with 20 additions and 19 deletions

View file

@ -1,3 +1,8 @@
2001-11-10 Gerd Moellmann <gerd@gnu.org>
* unexelf.c (unexec): Use mmap/munmap to allocate buffers
instead of malloc/free.
2001-11-05 Richard M. Stallman <rms@gnu.org>
* m/news-risc.h (BROKEN_PROTOTYPES): Defined.

View file

@ -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 */