MPROTECT(2) | System Calls Manual | MPROTECT(2)

# NAME

`mprotect` — control the protection of pages

# SYNOPSIS

`#include <sys/mman.h>`

int
`mprotect`(void *addr, size_t len, int prot);

# DESCRIPTION

The `mprotect`() system call sets the access protections for the pages that contain the address range addr through addr + len - 1 (inclusive). If len is 0, no action is taken on the page that contains addr.

The protections (region accessibility) are specified in the prot argument. It should either be `PROT_NONE` (no permissions) or the bitwise OR of one or more of the following values:

`PROT_EXEC`
  Pages may be executed.
`PROT_READ`
  Pages may be read.
`PROT_WRITE`
  Pages may be written.

Not all implementations will guarantee protection on a page basis; the granularity of protection changes may be as large as an entire region. Nor will all implementations guarantee to give exactly the requested permissions; more permissions may be granted than requested by prot. However, if `PROT_WRITE` was not specified then the page will not be writable.

# RETURN VALUES

Upon successful completion, the value 0 is returned; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

# ERRORS

`mprotect`() will fail if:

[`EACCES`]
  The process does not have sufficient access to the underlying memory object to provide the requested protection.
[`ENOMEM`]
  The process has locked future pages with `mlockall`(MCL_FUTURE), a page being protected is not currently accessible, and making it accessible and locked would exceed process or system limits.
[`ENOTSUP`]
  The accesses requested in the prot argument are not allowed. In particular, `PROT_WRITE` | `PROT_EXEC` mappings are not permitted in most binaries (see `kern.wxabort` in sysctl(2) for more information).
[`EINVAL`]
  The prot argument is invalid or the specified address range would wrap around.
[`EPERM`]
  The addr and len parameters specify a region which contains at least one page marked immutable.

# SEE ALSO

madvise(2), mimmutable(2), msync(2), munmap(2)

# STANDARDS

The `mprotect`() function conforms to IEEE Std 1003.1-2008 (“POSIX.1”).

# HISTORY

The `mprotect`() function has been available since 4.3BSD-Net/2.

# CAVEATS

The OpenBSD implementation of `mprotect`() does not require addr to be page-aligned, although other implementations may.

January 21, 2024 | Debian