From: Bruno Haible Date: Wed, 10 Sep 2025 21:03:55 +0000 (+0200) Subject: Remove support for IRIX and Solaris <= 7 regarding old mmap. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=abe5d60f0e7d2540ac20926ec4322137f44c6497;p=thirdparty%2Fgnulib.git Remove support for IRIX and Solaris <= 7 regarding old mmap. * m4/mmap-anon.m4 (gl_FUNC_MMAP_ANON): Don't define HAVE_MAP_ANONYMOUS. * m4/memchr.m4 (gl_FUNC_MEMCHR): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON. * m4/strncat.m4 (gl_FUNC_STRNCAT): Likewise. * lib/get-rusage-as.c (MAP_FILE): Remove macro. (get_rusage_as_via_setrlimit): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON. * modules/get-rusage-as (Depends-on): Remove 'open'. * lib/pagealign_alloc.c (MAP_FILE): Remove macro. (pagealign_alloc): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON. * modules/pagealign_alloc (Depends-on): Remove 'open'. * lib/vma-iter.c: Remove code for IRIX. (vma_iterate): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON. * lib/vma-iter.h: Remove code for IRIX. * lib/stackvma.c: Remove code for IRIX. (vma_iterate): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON. * lib/stackvma.h: Remove code for IRIX. * tests/mmap-anon-util.h: (zero_fd, map_flags, MAP_FILE): Remove macros. (mmap_zeromap): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON. * tests/zerosize-ptr.h (MAP_FILE): Remove macro. (zerosize_ptr): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON. * tests/jit/test-cache.c (main): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON. * tests/test-sigsegv-catch-segv1.c (main): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON. * tests/test-sigsegv-catch-segv2.c (main): Likewise. * tests/test-sigsegv-catch-stackoverflow2.c (main): Likewise. * tests/test-vma-prot.c: Test HAVE_MMAP instead of HAVE_MAP_ANONYMOUS. --- diff --git a/ChangeLog b/ChangeLog index f38ad67678..88931256cb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,35 @@ 2025-09-10 Bruno Haible + Remove support for IRIX and Solaris <= 7 regarding old mmap. + * m4/mmap-anon.m4 (gl_FUNC_MMAP_ANON): Don't define HAVE_MAP_ANONYMOUS. + * m4/memchr.m4 (gl_FUNC_MEMCHR): Assume that mmap supports MAP_ANONYMOUS + or MAP_ANON. + * m4/strncat.m4 (gl_FUNC_STRNCAT): Likewise. + * lib/get-rusage-as.c (MAP_FILE): Remove macro. + (get_rusage_as_via_setrlimit): Assume that mmap supports MAP_ANONYMOUS + or MAP_ANON. + * modules/get-rusage-as (Depends-on): Remove 'open'. + * lib/pagealign_alloc.c (MAP_FILE): Remove macro. + (pagealign_alloc): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON. + * modules/pagealign_alloc (Depends-on): Remove 'open'. + * lib/vma-iter.c: Remove code for IRIX. + (vma_iterate): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON. + * lib/vma-iter.h: Remove code for IRIX. + * lib/stackvma.c: Remove code for IRIX. + (vma_iterate): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON. + * lib/stackvma.h: Remove code for IRIX. + * tests/mmap-anon-util.h: (zero_fd, map_flags, MAP_FILE): Remove macros. + (mmap_zeromap): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON. + * tests/zerosize-ptr.h (MAP_FILE): Remove macro. + (zerosize_ptr): Assume that mmap supports MAP_ANONYMOUS or MAP_ANON. + * tests/jit/test-cache.c (main): Assume that mmap supports MAP_ANONYMOUS + or MAP_ANON. + * tests/test-sigsegv-catch-segv1.c (main): Assume that mmap supports + MAP_ANONYMOUS or MAP_ANON. + * tests/test-sigsegv-catch-segv2.c (main): Likewise. + * tests/test-sigsegv-catch-stackoverflow2.c (main): Likewise. + * tests/test-vma-prot.c: Test HAVE_MMAP instead of HAVE_MAP_ANONYMOUS. + signbit, *-ieee: Remove support for IRIX. * m4/signbit.m4 (gl_SIGNBIT_TEST_PROGRAM): Remove code for IRIX. diff --git a/lib/get-rusage-as.c b/lib/get-rusage-as.c index c1dad89a1b..312351b8b7 100644 --- a/lib/get-rusage-as.c +++ b/lib/get-rusage-as.c @@ -94,11 +94,6 @@ is slightly larger higher than get_rusage_as_via_setrlimit(), by 4 KB in 32-bit mode and by 40 KB in 64-bit mode. - IRIX: - a) setrlimit with RLIMIT_AS works. - b) The /proc/$pid file supports ioctls PIOCNMAP and PIOCMAP. - Both methods agree, - Solaris: a) setrlimit with RLIMIT_AS works. b) The /proc/$pid file supports ioctls PIOCNMAP and PIOCMAP, and the @@ -144,10 +139,6 @@ # include # include # include /* mmap, munmap */ -/* Define MAP_FILE when it isn't otherwise. */ -# ifndef MAP_FILE -# define MAP_FILE 0 -# endif #endif @@ -165,16 +156,6 @@ get_rusage_as_via_setrlimit (void) struct rlimit orig_limit; -# if HAVE_MAP_ANONYMOUS - const int flags = MAP_ANONYMOUS | MAP_PRIVATE; - const int fd = -1; -# else /* !HAVE_MAP_ANONYMOUS */ - const int flags = MAP_FILE | MAP_PRIVATE; - int fd = open ("/dev/zero", O_RDONLY | O_CLOEXEC, 0666); - if (fd < 0) - return 0; -# endif - /* Record the original limit. */ if (getrlimit (RLIMIT_AS, &orig_limit) < 0) { @@ -230,7 +211,8 @@ get_rusage_as_via_setrlimit (void) /* Allocate a page of memory, to compare the current address space size with try_limit.rlim_cur. */ void *new_page = - mmap (NULL, pagesize, PROT_READ | PROT_WRITE, flags, fd, 0); + mmap (NULL, pagesize, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); if (new_page != (void *)(-1)) { @@ -276,7 +258,8 @@ get_rusage_as_via_setrlimit (void) /* Allocate a page of memory, to compare the current address space size with try_limit.rlim_cur. */ void *new_page = - mmap (NULL, pagesize, PROT_READ | PROT_WRITE, flags, fd, 0); + mmap (NULL, pagesize, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); if (new_page != (void *)(-1)) { @@ -314,9 +297,6 @@ get_rusage_as_via_setrlimit (void) abort (); done2: -# if !HAVE_MAP_ANONYMOUS - close (fd); -# endif return result; } diff --git a/lib/pagealign_alloc.c b/lib/pagealign_alloc.c index b027e78fc6..06aad1ee52 100644 --- a/lib/pagealign_alloc.c +++ b/lib/pagealign_alloc.c @@ -39,10 +39,6 @@ #define _(msgid) dgettext (GNULIB_TEXT_DOMAIN, msgid) #if HAVE_MMAP -/* Define MAP_FILE when it isn't otherwise. */ -# ifndef MAP_FILE -# define MAP_FILE 0 -# endif /* Define MAP_FAILED for old systems which neglect to. */ # ifndef MAP_FAILED # define MAP_FAILED ((void *)-1) @@ -123,22 +119,8 @@ pagealign_alloc (size_t size) based approaches, since the latter often waste an entire memory page per call. */ #if HAVE_MMAP -# ifdef HAVE_MAP_ANONYMOUS - const int fd = -1; - const int flags = MAP_ANONYMOUS | MAP_PRIVATE; -# else /* !HAVE_MAP_ANONYMOUS */ - static int fd = -1; /* Only open /dev/zero once in order to avoid limiting - the amount of memory we may allocate based on the - number of open file descriptors. */ - const int flags = MAP_FILE | MAP_PRIVATE; - if (fd == -1) - { - fd = open ("/dev/zero", O_RDONLY | O_CLOEXEC, 0666); - if (fd < 0) - error (EXIT_FAILURE, errno, _("Failed to open /dev/zero for read")); - } -# endif /* HAVE_MAP_ANONYMOUS */ - ret = mmap (NULL, size, PROT_READ | PROT_WRITE, flags, fd, 0); + ret = mmap (NULL, size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, + -1, 0); if (ret == MAP_FAILED) return NULL; new_memnode (ret, size); diff --git a/lib/stackvma.c b/lib/stackvma.c index 719a129c22..95bb80db7c 100644 --- a/lib/stackvma.c +++ b/lib/stackvma.c @@ -51,7 +51,7 @@ || defined __FreeBSD_kernel__ || defined __FreeBSD__ || defined __DragonFly__ \ || defined __NetBSD__ \ || (defined __APPLE__ && defined __MACH__) \ - || defined _AIX || defined __sgi || defined __sun \ + || defined _AIX || defined __sun \ || defined __CYGWIN__ || defined __HAIKU__ /* This file contains the proximity test function for the simple cases, where @@ -1854,7 +1854,7 @@ sigsegv_get_vma (uintptr_t address, struct vma_struct *vma) /* --------------------------- stackvma-procfs.c --------------------------- */ -#elif defined __sgi || defined __sun /* IRIX, Solaris */ +#elif defined __sun /* Solaris */ # include /* errno, EINTR */ # include /* open, O_RDONLY */ @@ -1961,13 +1961,6 @@ vma_iterate (struct callback_locals *locals) int fd; int nmaps; size_t memneed; -# if HAVE_MAP_ANONYMOUS -# define zero_fd -1 -# define map_flags MAP_ANONYMOUS -# else /* !HAVE_MAP_ANONYMOUS */ - int zero_fd; -# define map_flags 0 -# endif void *auxmap; uintptr_t auxmap_start; uintptr_t auxmap_end; @@ -2003,16 +1996,8 @@ vma_iterate (struct callback_locals *locals) and thus pre-allocate available memory. So use mmap(), and ignore the resulting VMA. */ memneed = ((memneed - 1) / pagesize + 1) * pagesize; -# if !HAVE_MAP_ANONYMOUS - zero_fd = open ("/dev/zero", O_RDONLY, 0644); - if (zero_fd < 0) - goto fail2; -# endif auxmap = (void *) mmap ((void *) 0, memneed, PROT_READ | PROT_WRITE, - map_flags | MAP_PRIVATE, zero_fd, 0); -# if !HAVE_MAP_ANONYMOUS - close (zero_fd); -# endif + MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); if (auxmap == (void *) -1) goto fail2; auxmap_start = (uintptr_t) auxmap; @@ -2071,13 +2056,6 @@ vma_iterate (struct callback_locals *locals) int fd; int nmaps; size_t memneed; -# if HAVE_MAP_ANONYMOUS -# define zero_fd -1 -# define map_flags MAP_ANONYMOUS -# else /* !HAVE_MAP_ANONYMOUS */ - int zero_fd; -# define map_flags 0 -# endif void *auxmap; uintptr_t auxmap_start; uintptr_t auxmap_end; @@ -2118,16 +2096,8 @@ vma_iterate (struct callback_locals *locals) and thus pre-allocate available memory. So use mmap(), and ignore the resulting VMA. */ memneed = ((memneed - 1) / pagesize + 1) * pagesize; -# if !HAVE_MAP_ANONYMOUS - zero_fd = open ("/dev/zero", O_RDONLY, 0644); - if (zero_fd < 0) - goto fail2; -# endif auxmap = (void *) mmap ((void *) 0, memneed, PROT_READ | PROT_WRITE, - map_flags | MAP_PRIVATE, zero_fd, 0); -# if !HAVE_MAP_ANONYMOUS - close (zero_fd); -# endif + MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); if (auxmap == (void *) -1) goto fail2; auxmap_start = (uintptr_t) auxmap; diff --git a/lib/stackvma.h b/lib/stackvma.h index 307de847a3..6bbd5e0cf9 100644 --- a/lib/stackvma.h +++ b/lib/stackvma.h @@ -54,7 +54,7 @@ extern int sigsegv_get_vma (uintptr_t address, struct vma_struct *vma); || defined __FreeBSD_kernel__ || defined __FreeBSD__ || defined __DragonFly__ \ || defined __NetBSD__ || defined __OpenBSD__ \ || (defined __APPLE__ && defined __MACH__) \ - || defined _AIX || defined __sgi || defined __sun \ + || defined _AIX || defined __sun \ || defined __CYGWIN__ || defined __HAIKU__ # define HAVE_STACKVMA 1 #endif diff --git a/lib/vma-iter.c b/lib/vma-iter.c index 295696039c..e1308bef5b 100644 --- a/lib/vma-iter.c +++ b/lib/vma-iter.c @@ -82,13 +82,6 @@ # include /* prmap_t */ #endif -#if defined __sgi /* IRIX */ -# include /* memcpy */ -# include -# include /* mmap, munmap */ -# include /* PIOC*, prmap_t */ -#endif - #if defined __sun /* Solaris */ # include /* memcpy */ # include @@ -1191,118 +1184,6 @@ vma_iterate (vma_iterate_callback_fn callback, void *data) close (fd); return 0; -#elif defined __sgi /* IRIX */ - - size_t pagesize; - char fnamebuf[6+10+1]; - char *fname; - int fd; - int nmaps; - size_t memneed; -# if HAVE_MAP_ANONYMOUS -# define zero_fd -1 -# define map_flags MAP_ANONYMOUS -# else - int zero_fd; -# define map_flags 0 -# endif - void *auxmap; - unsigned long auxmap_start; - unsigned long auxmap_end; - prmap_t* maps; - prmap_t* mp; - - pagesize = getpagesize (); - - /* Construct fname = sprintf (fnamebuf+i, "/proc/%u", getpid ()). */ - fname = fnamebuf + sizeof (fnamebuf) - 1; - *fname = '\0'; - { - unsigned int value = getpid (); - do - *--fname = (value % 10) + '0'; - while ((value = value / 10) > 0); - } - fname -= 6; - memcpy (fname, "/proc/", 6); - - fd = open (fname, O_RDONLY | O_CLOEXEC); - if (fd < 0) - return -1; - - if (ioctl (fd, PIOCNMAP, &nmaps) < 0) - goto fail2; - - memneed = (nmaps + 10) * sizeof (prmap_t); - /* Allocate memneed bytes of memory. - We cannot use alloca here, because not much stack space is guaranteed. - We also cannot use malloc here, because a malloc() call may call mmap() - and thus pre-allocate available memory. - So use mmap(), and ignore the resulting VMA. */ - memneed = ((memneed - 1) / pagesize + 1) * pagesize; -# if !HAVE_MAP_ANONYMOUS - zero_fd = open ("/dev/zero", O_RDONLY | O_CLOEXEC, 0644); - if (zero_fd < 0) - goto fail2; -# endif - auxmap = (void *) mmap ((void *) 0, memneed, PROT_READ | PROT_WRITE, - map_flags | MAP_PRIVATE, zero_fd, 0); -# if !HAVE_MAP_ANONYMOUS - close (zero_fd); -# endif - if (auxmap == (void *) -1) - goto fail2; - auxmap_start = (unsigned long) auxmap; - auxmap_end = auxmap_start + memneed; - maps = (prmap_t *) auxmap; - - if (ioctl (fd, PIOCMAP, maps) < 0) - goto fail1; - - for (mp = maps;;) - { - unsigned long start, end; - unsigned int flags; - - start = (unsigned long) mp->pr_vaddr; - end = start + mp->pr_size; - if (start == 0 && end == 0) - break; - flags = 0; - if (mp->pr_mflags & MA_READ) - flags |= VMA_PROT_READ; - if (mp->pr_mflags & MA_WRITE) - flags |= VMA_PROT_WRITE; - if (mp->pr_mflags & MA_EXEC) - flags |= VMA_PROT_EXECUTE; - mp++; - if (start <= auxmap_start && auxmap_end - 1 <= end - 1) - { - /* Consider [start,end-1] \ [auxmap_start,auxmap_end-1] - = [start,auxmap_start-1] u [auxmap_end,end-1]. */ - if (start < auxmap_start) - if (callback (data, start, auxmap_start, flags)) - break; - if (auxmap_end - 1 < end - 1) - if (callback (data, auxmap_end, end, flags)) - break; - } - else - { - if (callback (data, start, end, flags)) - break; - } - } - munmap (auxmap, memneed); - close (fd); - return 0; - - fail1: - munmap (auxmap, memneed); - fail2: - close (fd); - return -1; - #elif defined __sun /* Solaris */ /* Note: Solaris defines a different type prmap_t with @@ -1324,13 +1205,6 @@ vma_iterate (vma_iterate_callback_fn callback, void *data) int fd; int nmaps; size_t memneed; -# if HAVE_MAP_ANONYMOUS -# define zero_fd -1 -# define map_flags MAP_ANONYMOUS -# else /* Solaris <= 7 */ - int zero_fd; -# define map_flags 0 -# endif void *auxmap; unsigned long auxmap_start; unsigned long auxmap_end; @@ -1365,16 +1239,8 @@ vma_iterate (vma_iterate_callback_fn callback, void *data) and thus pre-allocate available memory. So use mmap(), and ignore the resulting VMA. */ memneed = ((memneed - 1) / pagesize + 1) * pagesize; -# if !HAVE_MAP_ANONYMOUS - zero_fd = open ("/dev/zero", O_RDONLY | O_CLOEXEC, 0644); - if (zero_fd < 0) - goto fail2; -# endif auxmap = (void *) mmap ((void *) 0, memneed, PROT_READ | PROT_WRITE, - map_flags | MAP_PRIVATE, zero_fd, 0); -# if !HAVE_MAP_ANONYMOUS - close (zero_fd); -# endif + MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); if (auxmap == (void *) -1) goto fail2; auxmap_start = (unsigned long) auxmap; @@ -1442,13 +1308,6 @@ vma_iterate (vma_iterate_callback_fn callback, void *data) int fd; int nmaps; size_t memneed; -# if HAVE_MAP_ANONYMOUS -# define zero_fd -1 -# define map_flags MAP_ANONYMOUS -# else /* Solaris <= 7 */ - int zero_fd; -# define map_flags 0 -# endif void *auxmap; unsigned long auxmap_start; unsigned long auxmap_end; @@ -1488,16 +1347,8 @@ vma_iterate (vma_iterate_callback_fn callback, void *data) and thus pre-allocate available memory. So use mmap(), and ignore the resulting VMA. */ memneed = ((memneed - 1) / pagesize + 1) * pagesize; -# if !HAVE_MAP_ANONYMOUS - zero_fd = open ("/dev/zero", O_RDONLY | O_CLOEXEC, 0644); - if (zero_fd < 0) - goto fail2; -# endif auxmap = (void *) mmap ((void *) 0, memneed, PROT_READ | PROT_WRITE, - map_flags | MAP_PRIVATE, zero_fd, 0); -# if !HAVE_MAP_ANONYMOUS - close (zero_fd); -# endif + MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); if (auxmap == (void *) -1) goto fail2; auxmap_start = (unsigned long) auxmap; diff --git a/lib/vma-iter.h b/lib/vma-iter.h index bd5f35f582..f3f1f073b2 100644 --- a/lib/vma-iter.h +++ b/lib/vma-iter.h @@ -57,7 +57,7 @@ extern int vma_iterate (vma_iterate_callback_fn callback, void *data); this platform. Note that even when this macro is defined, vma_iterate() may still fail to find any virtual memory area, for example if /proc is not mounted. */ -#if defined __linux__ || defined __ANDROID__ || defined __gnu_hurd__ || defined __FreeBSD_kernel__ || defined __FreeBSD__ || defined __DragonFly__ || defined __NetBSD__ || defined _AIX || defined __sgi || defined __sun || HAVE_PSTAT_GETPROCVM || (defined __APPLE__ && defined __MACH__) || defined _WIN32 || defined __CYGWIN__ || defined __BEOS__ || defined __HAIKU__ || defined __minix || HAVE_MQUERY +#if defined __linux__ || defined __ANDROID__ || defined __gnu_hurd__ || defined __FreeBSD_kernel__ || defined __FreeBSD__ || defined __DragonFly__ || defined __NetBSD__ || defined _AIX || defined __sun || HAVE_PSTAT_GETPROCVM || (defined __APPLE__ && defined __MACH__) || defined _WIN32 || defined __CYGWIN__ || defined __BEOS__ || defined __HAIKU__ || defined __minix || HAVE_MQUERY # define VMA_ITERATE_SUPPORTED 1 #endif diff --git a/m4/memchr.m4 b/m4/memchr.m4 index d5bce3935c..9647b20e3a 100644 --- a/m4/memchr.m4 +++ b/m4/memchr.m4 @@ -1,5 +1,5 @@ # memchr.m4 -# serial 20 +# serial 21 dnl Copyright (C) 2002-2004, 2009-2025 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -33,31 +33,20 @@ AC_DEFUN_ONCE([gl_FUNC_MEMCHR], # include # include # include -# ifndef MAP_FILE -# define MAP_FILE 0 -# endif #endif ]], [[ int result = 0; char *fence = NULL; #if HAVE_SYS_MMAN_H && HAVE_MPROTECT -# if HAVE_MAP_ANONYMOUS - const int flags = MAP_ANONYMOUS | MAP_PRIVATE; - const int fd = -1; -# else /* !HAVE_MAP_ANONYMOUS */ - const int flags = MAP_FILE | MAP_PRIVATE; - int fd = open ("/dev/zero", O_RDONLY, 0666); - if (fd >= 0) -# endif - { - long int pagesize = sysconf (_SC_PAGESIZE); - char *two_pages = - (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE, - flags, fd, 0); - if (two_pages != (char *)(-1) - && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0) - fence = two_pages + pagesize; - } + { + long int pagesize = sysconf (_SC_PAGESIZE); + char *two_pages = + (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + if (two_pages != (char *)(-1) + && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0) + fence = two_pages + pagesize; + } #endif if (fence) { diff --git a/m4/mmap-anon.m4 b/m4/mmap-anon.m4 index aee4c2106f..48fefbdcf1 100644 --- a/m4/mmap-anon.m4 +++ b/m4/mmap-anon.m4 @@ -1,5 +1,5 @@ # mmap-anon.m4 -# serial 13 +# serial 14 dnl Copyright (C) 2005, 2007, 2009-2025 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -12,8 +12,6 @@ dnl This file is offered as-is, without any warranty. # MAP_ANON exist and have the same value. # - On HP-UX, only MAP_ANONYMOUS exists. # - On Mac OS X, FreeBSD, NetBSD, OpenBSD, Minix, only MAP_ANON exists. -# - On IRIX, neither exists, and a file descriptor opened to /dev/zero must be -# used. AC_DEFUN_ONCE([gl_FUNC_MMAP_ANON], [ @@ -48,10 +46,5 @@ AC_DEFUN_ONCE([gl_FUNC_MMAP_ANON], gl_have_mmap_anonymous=yes]) fi AC_MSG_RESULT([$gl_have_mmap_anonymous]) - if test $gl_have_mmap_anonymous = yes; then - AC_DEFINE([HAVE_MAP_ANONYMOUS], [1], - [Define to 1 if mmap()'s MAP_ANONYMOUS flag is available after including - config.h and .]) - fi fi ]) diff --git a/m4/strncat.m4 b/m4/strncat.m4 index b1e94a2b78..81a0ce6a6b 100644 --- a/m4/strncat.m4 +++ b/m4/strncat.m4 @@ -1,5 +1,5 @@ # strncat.m4 -# serial 9 +# serial 10 dnl Copyright (C) 2002-2004, 2009-2025 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -29,31 +29,20 @@ AC_DEFUN_ONCE([gl_FUNC_STRNCAT], # include # include # include -# ifndef MAP_FILE -# define MAP_FILE 0 -# endif #endif ]GL_MDA_DEFINES], [[ char *fence = NULL; #if HAVE_SYS_MMAN_H && HAVE_MPROTECT -# if HAVE_MAP_ANONYMOUS - const int flags = MAP_ANONYMOUS | MAP_PRIVATE; - const int fd = -1; -# else /* !HAVE_MAP_ANONYMOUS */ - const int flags = MAP_FILE | MAP_PRIVATE; - int fd = open ("/dev/zero", O_RDONLY, 0666); - if (fd >= 0) -# endif - { - long int pagesize = sysconf (_SC_PAGESIZE); - char *two_pages = - (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE, - flags, fd, 0); - if (two_pages != (char *)(-1) - && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0) - fence = two_pages + pagesize; - } + { + long int pagesize = sysconf (_SC_PAGESIZE); + char *two_pages = + (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + if (two_pages != (char *)(-1) + && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0) + fence = two_pages + pagesize; + } #endif if (fence) { diff --git a/modules/get-rusage-as b/modules/get-rusage-as index ecb41e1b2a..2705c15554 100644 --- a/modules/get-rusage-as +++ b/modules/get-rusage-as @@ -11,7 +11,6 @@ stdint-h unistd-h extensions getpagesize -open vma-iter configure.ac: diff --git a/modules/pagealign_alloc b/modules/pagealign_alloc index 79f8038e8d..6570226665 100644 --- a/modules/pagealign_alloc +++ b/modules/pagealign_alloc @@ -13,7 +13,6 @@ extensions getpagesize gettext-h gnulib-i18n -open stdlib-h xalloc unistd-h diff --git a/tests/jit/test-cache.c b/tests/jit/test-cache.c index e2e36d7dd4..8423705961 100644 --- a/tests/jit/test-cache.c +++ b/tests/jit/test-cache.c @@ -302,17 +302,8 @@ main () return 1; start_rw = start; #else -# ifdef HAVE_MAP_ANONYMOUS - int flags = MAP_ANONYMOUS | MAP_PRIVATE; - int fd = -1; -# else - int flags = MAP_FILE | MAP_PRIVATE; - int fd = open ("/dev/zero", O_RDONLY | O_CLOEXEC, 0666); - if (fd < 0) - return 1; -# endif start = mmap (NULL, mapping_size, PROT_READ | PROT_WRITE | PROT_EXEC, - flags, fd, 0); + MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); if (start != (char *) (-1)) { /* A platform that allows a mmap'ed memory region to be simultaneously @@ -332,7 +323,7 @@ main () if (register_temporary_file (filename) < 0) return 2; # endif - fd = open (filename, O_CREAT | O_RDWR | O_TRUNC, 0700); + int fd = open (filename, O_CREAT | O_RDWR | O_TRUNC, 0700); if (fd < 0) return 3; # ifndef KEEP_TEMP_FILE_VISIBLE diff --git a/tests/mmap-anon-util.h b/tests/mmap-anon-util.h index 27ab812c0d..41c1aade5c 100644 --- a/tests/mmap-anon-util.h +++ b/tests/mmap-anon-util.h @@ -73,26 +73,17 @@ mprotect (void *addr, size_t len, int prot) # endif # define PROT_READ_WRITE (PROT_READ|PROT_WRITE) -# if HAVE_MAP_ANONYMOUS -# define zero_fd -1 -# define map_flags MAP_ANONYMOUS | MAP_PRIVATE -# else -# ifndef MAP_FILE -# define MAP_FILE 0 -# endif -static int zero_fd; -# define map_flags MAP_FILE | MAP_PRIVATE -# endif - static void * mmap_zeromap (void *map_addr_hint, size_t map_len) { # ifdef __hpux /* HP-UX 10 mmap() often fails when given a hint. So give the OS complete freedom about the address range. */ - return (void *) mmap ((void *) 0, map_len, PROT_READ_WRITE, map_flags, zero_fd, 0); + return (void *) mmap ((void *) 0, map_len, PROT_READ_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); # else - return (void *) mmap (map_addr_hint, map_len, PROT_READ_WRITE, map_flags, zero_fd, 0); + return (void *) mmap (map_addr_hint, map_len, PROT_READ_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); # endif } diff --git a/tests/test-sigsegv-catch-segv1.c b/tests/test-sigsegv-catch-segv1.c index 3144557f5b..e23c90276e 100644 --- a/tests/test-sigsegv-catch-segv1.c +++ b/tests/test-sigsegv-catch-segv1.c @@ -66,11 +66,6 @@ main () int prot_unwritable; void *p; - /* Preparations. */ -# if !HAVE_MAP_ANONYMOUS - zero_fd = open ("/dev/zero", O_RDONLY, 0644); -# endif - # if defined __linux__ && defined __sparc__ /* On Linux 2.6.26/SPARC64, PROT_READ has the same effect as PROT_READ | PROT_WRITE. */ diff --git a/tests/test-sigsegv-catch-segv2.c b/tests/test-sigsegv-catch-segv2.c index ea72d84686..c65101d9cf 100644 --- a/tests/test-sigsegv-catch-segv2.c +++ b/tests/test-sigsegv-catch-segv2.c @@ -87,11 +87,6 @@ main () void *p; sigset_t emptyset; - /* Preparations. */ -# if !HAVE_MAP_ANONYMOUS - zero_fd = open ("/dev/zero", O_RDONLY, 0644); -# endif - # if defined __linux__ && defined __sparc__ /* On Linux 2.6.26/SPARC64, PROT_READ has the same effect as PROT_READ | PROT_WRITE. */ diff --git a/tests/test-sigsegv-catch-stackoverflow2.c b/tests/test-sigsegv-catch-stackoverflow2.c index 1b49442d6a..8d10ebeefa 100644 --- a/tests/test-sigsegv-catch-stackoverflow2.c +++ b/tests/test-sigsegv-catch-stackoverflow2.c @@ -151,11 +151,6 @@ main () < 0) exit (2); - /* Preparations. */ -# if !HAVE_MAP_ANONYMOUS - zero_fd = open ("/dev/zero", O_RDONLY, 0644); -# endif - # if defined __linux__ && defined __sparc__ /* On Linux 2.6.26/SPARC64, PROT_READ has the same effect as PROT_READ | PROT_WRITE. */ diff --git a/tests/test-vma-prot.c b/tests/test-vma-prot.c index b081ed86b1..994dbe07c4 100644 --- a/tests/test-vma-prot.c +++ b/tests/test-vma-prot.c @@ -22,7 +22,7 @@ #include -#if HAVE_MAP_ANONYMOUS +#if HAVE_MMAP # include # include #endif @@ -56,7 +56,7 @@ main (void) ASSERT (((VMA_PROT_READ | VMA_PROT_WRITE) & ~prot) == 0); } -#if HAVE_MAP_ANONYMOUS +#if HAVE_MMAP /* Test on memory allocated through mmap(). */ { char *mem = mmap (NULL, 1024*1024, PROT_READ | PROT_WRITE, diff --git a/tests/zerosize-ptr.h b/tests/zerosize-ptr.h index d3978ee0af..07d09f2c75 100644 --- a/tests/zerosize-ptr.h +++ b/tests/zerosize-ptr.h @@ -43,10 +43,6 @@ # include # include # include -/* Define MAP_FILE when it isn't otherwise. */ -# ifndef MAP_FILE -# define MAP_FILE 0 -# endif #endif /* Return a pointer to a zero-size object in memory (that is, actually, a @@ -60,23 +56,13 @@ zerosize_ptr (void) /* Use mmap and mprotect when they exist. Don't test HAVE_MMAP, because it is not defined on HP-UX 11 (since it does not support MAP_FIXED). */ #if HAVE_SYS_MMAN_H && HAVE_MPROTECT && !defined __KLIBC__ -# if HAVE_MAP_ANONYMOUS - const int flags = MAP_ANONYMOUS | MAP_PRIVATE; - const int fd = -1; -# else /* !HAVE_MAP_ANONYMOUS */ - const int flags = MAP_FILE | MAP_PRIVATE; - int fd = open ("/dev/zero", O_RDONLY, 0666); - if (fd >= 0) -# endif - { - size_t pagesize = sysconf (_SC_PAGESIZE); - char *two_pages = - (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE, - flags, fd, 0); - if (two_pages != (char *)(-1) - && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0) - return two_pages + pagesize; - } + size_t pagesize = sysconf (_SC_PAGESIZE); + char *two_pages = + (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + if (two_pages != (char *)(-1) + && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0) + return two_pages + pagesize; #endif return NULL; }