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:
parent
46a01cfa80
commit
027fa1d24c
2 changed files with 20 additions and 19 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue