Differences between version 3 and predecessor to the previous major change of mprotect(2).
Other diffs: Previous Revision, Previous Author, or view the Annotated Edit History
Newer page: | version 3 | Last edited on Wednesday, September 10, 2003 9:14:19 pm | by JohnMcPherson | Revert |
Older page: | version 1 | Last edited on Tuesday, June 4, 2002 12:23:43 am | by perry | Revert |
@@ -1,115 +1,75 @@
-MPROTECT
-!!!MPROTECT
-NAME
-SYNOPSIS
-DESCRIPTION
-RETURN VALUE
-ERRORS
-EXAMPLE
-CONFORMING TO
-SEE ALSO
-----
!!NAME
+mprotect - control allowable accesses to a region of memory
-
-mprotect - control allowable accesses to a region of memory
!!SYNOPSIS
-
-
-
__#include
-__''addr''__, size_t__ ''len''__, int__ ''prot''__);
-
__
+
__#include <sys/mman.h>__
+ __int mprotect(const void *
__''addr''__, size_t__ ''len''__, int__ ''prot''__);__
!!DESCRIPTION
+__mprotect__ controls how a section of memory may be accessed. If an access is disallowed by the protection given it, the program receives a __SIGSEGV__.
+''prot'' is a bitwise-or of the following values:
+;__PROT_NONE__: The memory cannot be accessed at all.
+;__PROT_READ__: The memory can be read.
+;__PROT_WRITE__: The memory can be written to.
+;__PROT_EXEC__: The memory can contain executing code.
-__mprotect__ controls how a section of memory may be
-accessed. If an access
is disallowed by the protection given
-it, the program receives a
__SIGSEGV
__.
+The new protection replaces any existing protection. For example, if the memory had previously been marked __PROT_READ__, and
__mprotect__ is then called with
+''prot''
__PROT
_WRITE
__, it will no longer be readable
.
-
-''prot'' is a bitwise-or of the following
-values:
-
-
-__PROT_NONE__
-
-
-The memory cannot be accessed at all.
-
-
-__PROT_READ__
-
-
-The memory can be read.
-
-
-__PROT_WRITE__
-
-
-The memory can be written to.
-
-
-__PROT_EXEC__
-
-
-The memory can contain executing code.
-
-
-The new protection replaces any existing protection. For
-example, if the memory had previously been marked
-__PROT_READ__, and __mprotect__ is then called with
-''prot'' __PROT_WRITE__, it will no longer be
-readable.
!!RETURN VALUE
-
-
-
On success, __mprotect__ returns zero. On error, -1 is
-
returned, and ''errno'' is set
-
appropriately.
+On success, __mprotect__ returns zero. On error, -1 is returned, and ''errno'' is set appropriately.
!!ERRORS
+;[EINVAL]: ''addr'' is not a valid pointer, or not a multiple of PAGESIZE.
+;[EFAULT]: The memory cannot be accessed.
+;[EACCES]: The memory cannot be given the specified access. This can happen, for example, if you mmap(2) a file to which you have read-only access, then ask __mprotect__ to mark it __PROT_WRITE__.
+;[ENOMEM]: Internal kernel structures could not be allocated.
+!!EXAMPLE
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <errno.h>
+ #include <sys/mman.h>
-__EINVAL__
+ #include <limits.h> /* for PAGESIZE */
+ #ifndef PAGESIZE
+ #define PAGESIZE 4096
+ #endif
+ int
+ main(void)
+ {
+ char *p;
+ char c;
-''addr'' is not
a valid pointer, or not a multiple
of
-PAGESIZE.
+ /* Allocate
a buffer; it will have the default
+ protection
of PROT_READ|PROT_WRITE. */
+ p = malloc(1024+
PAGESIZE‐1);
+ if (!p) {
+ perror("Couldn�t malloc(1024)");
+ exit(errno);
+ }
+ /* Align to a multiple of PAGESIZE, assumed to be a power of two */
+ p = (char *)(((int) p + PAGESIZE‐1) & ~(PAGESIZE‐1));
-__EFAULT__
+ c = p[666]; /* Read; ok */
+ p[666] = 42; /* Write; ok */
+ /* Mark the buffer read‐only. */
+ if (mprotect(p, 1024, PROT_READ)) {
+ perror("Couldn't mprotect");
+ exit(errno);
+ }
-The memory cannot be accessed.
+ c = p[[666]; /* Read; ok */
+ p[[666] = 42; /* Write; program dies on SIGSEGV */
+ exit(0);
+ }
-__EACCES__
-
-
-The memory cannot be given the specified access. This can
-happen, for example, if you mmap(2) a file to which
-you have read-only access, then ask __mprotect__ to mark
-it __PROT_WRITE__.
-
-
-__ENOMEM__
-
-
-Internal kernel structures could not be
-allocated.
-!!EXAMPLE
-
-
-#include
!!CONFORMING TO
+SVr4, [POSIX].1b (formerly POSIX.4). SVr4 defines an additional error code [EAGAIN]. The SVr4 error conditions don't map neatly onto [Linux]'s. POSIX.1b says that
+__mprotect__ can be used only on regions of memory obtained from mmap(2).
-
-SVr4, POSIX.1b (formerly POSIX.4). SVr4 defines an
-additional error code EAGAIN. The SVr4 error conditions
-don't map neatly onto Linux's. POSIX.1b says that
-__mprotect__ can be used only on regions of memory
-obtained from mmap(2).
!!SEE ALSO
-
-
mmap(2)
-----