]> git.ipfire.org Git - thirdparty/man-pages.git/blame - man2/mprotect.2
Note that <fcntl.h> is needed for O_* constants and <sys/stat.h> is
[thirdparty/man-pages.git] / man2 / mprotect.2
CommitLineData
c13182ef 1.\" -*- nroff -*-
c11b1abf 2.\" Copyright (C) 2007 Michael Kerrisk <mtk.manpages@gmail.com>
2a5e0dcd 3.\" and Copyright (C) 1995 Michael Shields <shields@tembel.org>.
fea681da
MK
4.\"
5.\" Permission is granted to make and distribute verbatim copies of this
6.\" manual provided the copyright notice and this permission notice are
7.\" preserved on all copies.
8.\"
9.\" Permission is granted to copy and distribute modified versions of this
10.\" manual under the conditions for verbatim copying, provided that the
11.\" entire resulting derived work is distributed under the terms of a
12.\" permission notice identical to this one.
c13182ef 13.\"
fea681da
MK
14.\" Since the Linux kernel and libraries are constantly changing, this
15.\" manual page may be incorrect or out-of-date. The author(s) assume no
16.\" responsibility for errors or omissions, or for damages resulting from
17.\" the use of the information contained herein. The author(s) may not
18.\" have taken the same level of care in the production of this manual,
19.\" which is licensed free of charge, as they might when working
20.\" professionally.
c13182ef 21.\"
fea681da
MK
22.\" Formatted or processed versions of this manual, if unaccompanied by
23.\" the source, must acknowledge the copyright and author of this work.
24.\"
25.\" Modified 1996-10-22 by Eric S. Raymond <esr@thyrsus.com>
26.\" Modified 1997-05-31 by Andries Brouwer <aeb@cwi.nl>
27.\" Modified 2003-08-24 by Andries Brouwer <aeb@cwi.nl>
28.\" Modified 2004-08-16 by Andi Kleen <ak@muc.de>
2a5e0dcd
MK
29.\" 2007-06-02, mtk: Fairly substantial rewrites and additions, and
30.\" a much improved example program.
fea681da 31.\"
2a5e0dcd 32.TH MPROTECT 2 2007-06-02 "Linux" "Linux Programmer's Manual"
fea681da 33.SH NAME
2a5e0dcd 34mprotect \- set protection on a region of memory
fea681da
MK
35.SH SYNOPSIS
36.nf
37.B #include <sys/mman.h>
38.sp
da8cb51e 39.BI "int mprotect(const void *" addr ", size_t *" len ", int " prot );
fea681da
MK
40.fi
41.SH DESCRIPTION
e511ffb6 42.BR mprotect ()
2a5e0dcd 43changes protection for the calling process's memory page(s)
988db661 44containing any part of the address range in the
657e762d 45interval [\fIaddr\fP,\ \fIaddr\fP+\fIlen\fP\-1].
2a5e0dcd
MK
46.I addr
47must be aligned to a page boundary.
48
49If the calling process tries to access memory in a manner
988db661 50that violates the protection, then the kernel generates a
2a5e0dcd
MK
51.B SIGSEGV
52signal for the process.
fea681da
MK
53.PP
54.I prot
2a5e0dcd
MK
55is either
56.B PROT_NONE
57or a bitwise-or of the other values in the following list:
fea681da
MK
58.TP 1.1i
59.B PROT_NONE
60The memory cannot be accessed at all.
61.TP
62.B PROT_READ
63The memory can be read.
64.TP
65.B PROT_WRITE
2a5e0dcd 66The memory can be modified.
fea681da
MK
67.TP
68.B PROT_EXEC
fc15ae54 69The memory can be executed.
e7d3b070 70.\" FIXME
2b83e9fe 71.\" Document PROT_GROWSUP and PROT_GROWSDOWN
fea681da
MK
72.SH "RETURN VALUE"
73On success,
e511ffb6 74.BR mprotect ()
c13182ef
MK
75returns zero.
76On error, \-1 is returned, and
fea681da
MK
77.I errno
78is set appropriately.
79.SH ERRORS
80.TP
81.B EACCES
c13182ef
MK
82The memory cannot be given the specified access.
83This can happen, for example, if you
fea681da
MK
84.BR mmap (2)
85a file to which you have read-only access, then ask
e511ffb6 86.BR mprotect ()
fea681da
MK
87to mark it
88.BR PROT_WRITE .
89.TP
90.B EFAULT
91The memory cannot be accessed.
92.TP
93.B EINVAL
a8d55537 94\fIaddr\fP is not a valid pointer,
2a5e0dcd 95or not a multiple of the system page size.
3a928a50 96.\" Or: both PROT_GROWSUP and PROT_GROWSDOWN were specified in 'prot'.
fea681da
MK
97.TP
98.B ENOMEM
c13182ef 99Internal kernel structures could not be allocated.
cfadad46 100Or: addresses in the range
f8ad0aeb
MK
101.RI [ addr ,
102.IR addr + len ]
103are invalid for the address space of the process,
104or specify one or more pages that are not mapped.
2b2581ee
MK
105.SH "CONFORMING TO"
106SVr4, POSIX.1-2001.
107.\" SVr4 defines an additional error
108.\" code EAGAIN. The SVr4 error conditions don't map neatly onto Linux's.
d9bfdb9c 109POSIX says that the behavior of
2b2581ee 110.BR mprotect ()
2a5e0dcd
MK
111is unspecified if it is applied to a region of memory that
112was not obtained via
2b2581ee
MK
113.BR mmap (2).
114.SH NOTES
115On Linux it is always legal to call
116.BR mprotect ()
fc7ba057 117on any address in a process's address space (except for the
2b2581ee
MK
118kernel vsyscall area).
119In particular it can be used
120to change existing code mappings to be writable.
121
122Whether
123.B PROT_EXEC
124has any effect different from
125.B PROT_READ
a43eed0c 126is architecture- and kernel version-dependent.
34ccb744 127On some hardware architectures (e.g., i386),
0daa9e92 128.B PROT_WRITE
f3edaabb
MK
129implies
130.BR PROT_READ .
2a5e0dcd
MK
131
132POSIX.1-2001 says that an implementation may permit access
133other than that specified in
134.IR prot ,
135but at a minimum can only allow write access if
136.B PROT_WRITE
137has been set, and must not allow any access if
138.B PROT_NONE
139has been set.
fea681da 140.SH EXAMPLE
2720c2ed 141.\" sigaction.2 refers to this example
f20d7d8e 142.PP
2a5e0dcd 143The program below allocates four pages of memory, makes the third
f20d7d8e
MK
144of these pages read-only, and then executes a loop that walks upwards
145through the allocated region modifying bytes.
146
147An example of what we might see when running the program is the
148following:
149
088a639b 150.in +4n
fea681da 151.nf
f20d7d8e
MK
152$ ./a.out
153Start of region: 0x804c000
154Got SIGSEGV at address: 0x804e000
155.fi
156.in
157.nf
158
159#include <unistd.h>
160#include <signal.h>
fea681da 161#include <stdio.h>
f20d7d8e 162#include <malloc.h>
fea681da
MK
163#include <stdlib.h>
164#include <errno.h>
165#include <sys/mman.h>
166
6a578b88
MK
167#define handle_error(msg) \\
168 do { perror(msg); exit(EXIT_FAILURE); } while (0)
d3b5ab82 169
f20d7d8e
MK
170char *buffer;
171
172static void
173handler(int sig, siginfo_t *si, void *unused)
174{
988db661 175 printf("Got SIGSEGV at address: 0x%lx\\n",
29059a65 176 (long) si\->si_addr);
f20d7d8e
MK
177 exit(EXIT_FAILURE);
178}
fea681da
MK
179
180int
f20d7d8e 181main(int argc, char *argv[])
fea681da
MK
182{
183 char *p;
f20d7d8e
MK
184 int pagesize;
185 struct sigaction sa;
186
187 sa.sa_flags = SA_SIGINFO;
188 sigemptyset(&sa.sa_mask);
189 sa.sa_sigaction = handler;
29059a65 190 if (sigaction(SIGSEGV, &sa, NULL) == \-1)
6a578b88 191 handle_error("sigaction");
fea681da 192
f20d7d8e 193 pagesize = sysconf(_SC_PAGE_SIZE);
29059a65 194 if (pagesize == \-1)
6a578b88 195 handle_error("sysconf");
fea681da 196
988db661 197 /* Allocate a buffer aligned on a page boundary;
f20d7d8e
MK
198 initial protection is PROT_READ | PROT_WRITE */
199
200 buffer = memalign(pagesize, 4 * pagesize);
d3b5ab82 201 if (buffer == NULL)
6a578b88 202 handle_error("memalign");
fea681da 203
f20d7d8e 204 printf("Start of region: 0x%lx\\n", (long) buffer);
fea681da 205
988db661 206 if (mprotect(buffer + pagesize * 2, pagesize,
29059a65 207 PROT_NONE) == \-1)
6a578b88 208 handle_error("mprotect");
fea681da 209
f20d7d8e
MK
210 for (p = buffer ; ; )
211 *(p++) = 'a';
fea681da 212
f20d7d8e 213 printf("Loop completed\\n"); /* Should never happen */
646f46f0 214 exit(EXIT_SUCCESS);
fea681da
MK
215}
216.fi
fea681da 217.SH "SEE ALSO"
2a5e0dcd
MK
218.BR mmap (2),
219.BR sysconf (3)