]> git.eshelyaron.com Git - emacs.git/commitdiff
(unexec): Use mmap/munmap to allocate buffers
authorGerd Moellmann <gerd@gnu.org>
Sat, 10 Nov 2001 11:42:38 +0000 (11:42 +0000)
committerGerd Moellmann <gerd@gnu.org>
Sat, 10 Nov 2001 11:42:38 +0000 (11:42 +0000)
instead of malloc/free.

src/ChangeLog
src/unexelf.c

index 75fb6a029e475257dfad93ebab002d37446c6a38..deb7bd60d7b25ece7671b4191836bd8c19649c1c 100644 (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.
index 5519625c783499ffc22ab45b2abad3f86fcab107..6153adae2b4386f59f005f97786781f3af9748f9 100644 (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 */