Penguin
Annotated edit history of mprotect(2) version 3, including all changes. View license author blame.
Rev Author # Line
1 perry 1 !!NAME
2 PerryLorier 2 mprotect - control allowable accesses to a region of memory
1 perry 3
4 !!SYNOPSIS
2 PerryLorier 5 __#include <sys/mman.h>__
6 __int mprotect(const void *__''addr''__, size_t__ ''len''__, int__ ''prot''__);__
1 perry 7 !!DESCRIPTION
2 PerryLorier 8 __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__.
1 perry 9
2 PerryLorier 10 ''prot'' is a bitwise-or of the following values:
11 ;__PROT_NONE__: The memory cannot be accessed at all.
12 ;__PROT_READ__: The memory can be read.
13 ;__PROT_WRITE__: The memory can be written to.
14 ;__PROT_EXEC__: The memory can contain executing code.
1 perry 15
2 PerryLorier 16 The new protection replaces any existing protection. For example, if the memory had previously been marked __PROT_READ__, and __mprotect__ is then called with
17 ''prot'' __PROT_WRITE__, it will no longer be readable.
1 perry 18
19 !!RETURN VALUE
2 PerryLorier 20 On success, __mprotect__ returns zero. On error, -1 is returned, and ''errno'' is set appropriately.
1 perry 21 !!ERRORS
2 PerryLorier 22 ;[EINVAL]: ''addr'' is not a valid pointer, or not a multiple of PAGESIZE.
23 ;[EFAULT]: The memory cannot be accessed.
24 ;[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__.
25 ;[ENOMEM]: Internal kernel structures could not be allocated.
1 perry 26
2 PerryLorier 27 !!EXAMPLE
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <errno.h>
31 #include <sys/mman.h>
1 perry 32
2 PerryLorier 33 #include <limits.h> /* for PAGESIZE */
34 #ifndef PAGESIZE
35 #define PAGESIZE 4096
36 #endif
1 perry 37
2 PerryLorier 38 int
39 main(void)
40 {
41 char *p;
42 char c;
1 perry 43
2 PerryLorier 44 /* Allocate a buffer; it will have the default
45 protection of PROT_READ|PROT_WRITE. */
46 p = malloc(1024+PAGESIZE&#8208;1);
47 if (!p) {
3 JohnMcPherson 48 perror("Couldn�t malloc(1024)");
2 PerryLorier 49 exit(errno);
50 }
1 perry 51
2 PerryLorier 52 /* Align to a multiple of PAGESIZE, assumed to be a power of two */
53 p = (char *)(((int) p + PAGESIZE&#8208;1) & ~(PAGESIZE&#8208;1));
1 perry 54
2 PerryLorier 55 c = p[666]; /* Read; ok */
56 p[666] = 42; /* Write; ok */
1 perry 57
2 PerryLorier 58 /* Mark the buffer read&#8208;only. */
59 if (mprotect(p, 1024, PROT_READ)) {
3 JohnMcPherson 60 perror("Couldn't mprotect");
2 PerryLorier 61 exit(errno);
62 }
1 perry 63
2 PerryLorier 64 c = p[[666]; /* Read; ok */
65 p[[666] = 42; /* Write; program dies on SIGSEGV */
1 perry 66
2 PerryLorier 67 exit(0);
68 }
1 perry 69
70 !!CONFORMING TO
3 JohnMcPherson 71 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
2 PerryLorier 72 __mprotect__ can be used only on regions of memory obtained from mmap(2).
1 perry 73
74 !!SEE ALSO
75 mmap(2)
This page is a man page (or other imported legacy content). We are unable to automatically determine the license status of this page.

PHP Warning

lib/blame.php:177: Warning: Invalid argument supplied for foreach() (...repeated 7 times)