Home
Main website
Display Sidebar
Hide Ads
Recent Changes
View Source:
mprotect(2)
Edit
PageHistory
Diff
Info
LikePages
!!NAME mprotect - control allowable accesses to a region of memory !!SYNOPSIS __#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. 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. !!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> #include <limits.h> /* for PAGESIZE */ #ifndef PAGESIZE #define PAGESIZE 4096 #endif int main(void) { char *p; char c; /* 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)); 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); } c = p[[666]; /* Read; ok */ p[[666] = 42; /* Write; program dies on SIGSEGV */ exit(0); } !!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). !!SEE ALSO mmap(2)
3 pages link to
mprotect(2)
:
Man2m
syscalls(2)
madvise(2)
This page is a man page (or other imported legacy content). We are unable to automatically determine the license status of this page.