emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Any unfixed bugs


From: Andreas Schwab
Subject: Re: Any unfixed bugs
Date: 14 Nov 2001 21:15:49 +0100
User-agent: Gnus/5.090003 (Oort Gnus v0.03) Emacs/21.1

Richard Stallman <address@hidden> writes:

|>     solaris 2.5.1 (/usr/include/sys/mman.h):
|>     /* sharing types:  must choose either SHARED or PRIVATE */
|>     ...
|> 
|> It is not evident how to use these on Solaris, and I can't use trial
|> and error either since I don't use Solaris.  You are the one who is in
|> a position to figure out what to do here.  I can only wait for you to
|> send a fix.

unexelf.c should use the same strategy as buffer.c wrt. mmap: if
MAP_ANON(YMOUS) do not exist fake it with 0 and use open("/dev/zero") as
file to map.

Andreas.

2001-11-14  Andreas Schwab  <address@hidden>

        * unexelf.c [!defined MAP_ANON]: Define MAP_ANON to MAP_ANONYMOUS
        if defined, 0 otherwise.
        (MAP_FAILED): Define if not defined and use it for testing mmap
        failure.
        (unexec) [!MAP_ANON]: Use /dev/zero as file to map.

--- unexelf.c.~1.42.~   Mon Nov 12 10:45:24 2001
+++ unexelf.c   Wed Nov 14 21:07:44 2001
@@ -434,6 +434,18 @@
 #include <syms.h> /* for HDRR declaration */
 #endif /* __sgi */
 
+#ifndef MAP_ANON
+#ifdef MAP_ANONYMOUS
+#define MAP_ANON MAP_ANONYMOUS
+#else
+#define MAP_ANON 0
+#endif
+#endif
+
+#ifndef MAP_FAILED
+#define MAP_FAILED ((void *) -1)
+#endif
+
 #if defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)
 /* Declare COFF debugging symbol table.  This used to be in
    /usr/include/sym.h, but this file is no longer included in Red Hat
@@ -649,6 +661,12 @@
   /* Pointers to the base of the image of the two files.  */
   caddr_t old_base, new_base;
 
+#if MAP_ANON == 0
+  int mmap_fd;
+#else
+# define mmap_fd -1
+#endif
+
   /* Pointers to the file, program and section headers for the old and
      new files.  */
   ElfW(Ehdr) *old_file_h, *new_file_h;
@@ -681,14 +699,20 @@
   if (fstat (old_file, &stat_buf) == -1)
     fatal ("Can't fstat (%s): errno %d\n", old_name, errno);
 
+#if MAP_ANON == 0
+  mmap_fd = open ("/dev/zero", O_RDONLY);
+  if (mmap_fd < 0)
+    fatal ("Can't open /dev/zero for reading: errno %d\n", errno);
+#endif
+
   /* 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)
+                  MAP_ANON | MAP_PRIVATE, mmap_fd, 0);
+  if (old_base == MAP_FAILED)
     fatal ("Can't allocate buffer for %s\n", old_name);
 
   if (read (old_file, old_base, stat_buf.st_size) != stat_buf.st_size)
@@ -776,8 +800,8 @@
     fatal ("Can't ftruncate (%s): errno %d\n", new_name, errno);
 
   new_base = mmap (NULL, new_file_size, PROT_READ | PROT_WRITE,
-                  MAP_ANON | MAP_PRIVATE, -1, 0);
-  if (new_base == (caddr_t) -1)
+                  MAP_ANON | MAP_PRIVATE, mmap_fd, 0);
+  if (new_base == MAP_FAILED)
     fatal ("Can't allocate buffer for %s\n", old_name);
 
   new_file_h = (ElfW(Ehdr) *) new_base;
@@ -1203,6 +1227,10 @@
 
   /* Close the files and make the new file executable.  */
 
+#if MAP_ANON == 0
+  close (mmap_fd);
+#endif
+
   if (close (old_file))
     fatal ("Can't close (%s): errno %d\n", old_name, errno);
 

-- 
Andreas Schwab                                  "And now for something
address@hidden                          completely different."
SuSE Labs, SuSE GmbH, Schanzäckerstr. 10, D-90443 Nürnberg
Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5



reply via email to

[Prev in Thread] Current Thread [Next in Thread]