mmap.2: MAP_FIXED is okay if the address range has been reserved

Clarify that MAP_FIXED is appropriate if the specified address
range has been reserved using an existing mapping, but shouldn't
be used otherwise.

Signed-off-by: Jann Horn <jannh@google.com>
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
This commit is contained in:
Jann Horn 2018-04-12 17:39:41 +02:00 committed by Michael Kerrisk
parent 5bc2d858e1
commit da6ad3cd89
1 changed files with 11 additions and 8 deletions

View File

@ -253,8 +253,9 @@ Software that aspires to be portable should use this option with care,
keeping in mind that the exact layout of a process's memory mappings
is allowed to change significantly between kernel versions,
C library versions, and operating system releases.
Furthermore, this option is extremely hazardous (when used on its own),
because it forcibly removes preexisting mappings,
This option should only be used when the specified memory region has
already been reserved using another mapping; otherwise, it is extremely
hazardous because it forcibly removes preexisting mappings,
making it easy for a multithreaded process to corrupt its own address space.
.IP
For example, suppose that thread A looks through
@ -284,13 +285,15 @@ and the PAM libraries
.UR http://www.linux-pam.org
.UE .
.IP
Newer kernels
(Linux 4.17 and later) have a
For cases in which the specified memory region has not been reserved using an
existing mapping, newer kernels (Linux 4.17 and later) provide an option
.B MAP_FIXED_NOREPLACE
option that avoids the corruption problem; if available,
.B MAP_FIXED_NOREPLACE
should be preferred over
.BR MAP_FIXED .
that should be used instead; older kernels require the caller to use
.I addr
as a hint (without
.BR MAP_FIXED )
and take appropriate action if the kernel places the new mapping at a
different address.
.TP
.BR MAP_FIXED_NOREPLACE " (since Linux 4.17)"
.\" commit a4ff8e8620d3f4f50ac4b41e8067b7d395056843