Provided by:
manpages-fr-dev_3.32d0.2p4-1_all 
NOM
mprotect - Changer la protection d'une partie de la memoire
SYNOPSIS
#include <sys/mman.h>
int mprotect(const void *addr, size_t len, int prot);
DESCRIPTION
mprotect() change la protection pour la (les) page(s) memoire du
processus appelant contenant tout ou une partie de l'intervalle
[addr, addr+len-1]. addr doit etre aligne sur une page.
Si le processus appelant essaie d'acceder a la memoire en violant la
protection, le noyau genere un signal SIGSEGV pour ce processus.
prot soit PROT_NONE, soit un OU binaire << | >> entre les valeurs
suivantes :
PROT_NONE On ne peut pas acceder du tout a la zone de memoire.
PROT_READ On peut lire la zone de memoire.
PROT_WRITE On peut modifier la zone de memoire.
PROT_EXEC La zone de memoire peut contenir du code executable.
VALEUR RENVOY'EE
mprotect() renvoie 0 s'il reussit, ou -1 s'il echoue, auquel cas errno
contient le code d'erreur.
ERREURS
EACCES L'acces specifie n'est pas possible sur ce type de memoire. Ceci
se produit par exemple si vous utilisez mmap(2) pour representer
un fichier en lecture seule en memoire, et si vous demandez de
marquer cette zone avec PROT_WRITE.
EINVAL addr n'est pas un pointeur valide, ou ce n'est pas un multiple
de la taille de page du systeme.
ENOMEM Impossible d'allouer des structures internes au noyau.
ENOMEM Les adresses dans l'intervalle [addr, addr+len] ne sont pas
valables dans l'espace d'adressage du processus, ou l'intervalle
s'etend sur des pages non projetees (dans les noyaux anterieurs
a 2.4.19, l'erreur EFAULT etait produite a tort dans ce cas).
CONFORMIT'E
SVr4, POSIX.1-2001. POSIX precise que le comportement de mprotect()
n'est pas specifie s'il est applique sur des zones de memoire non
obtenues avec mmap(2).
NOTES
Sous Linux, il est toujours autorise d'appeler mprotect() sur une
adresse de l'espace d'adressage du processus (excepte pour la zone
vsyscall du noyau). En particulier, il peut etre utilise pour rendre
une projection de code existante accessible en ecriture.
La difference entre PROT_EXEC et PROT_READ depend de l'architecture et
de la version du noyau. Sur certaines architectures materielles (par
exemple, i386), PROT_WRITE implique PROT_READ.
POSIX.1-2001 indique qu'une implementation peut autoriser un acces
autre que celui donne dans prot, mais doit au minimum autoriser l'acces
en ecriture si PROT_WRITE etait passe, et ne doit autoriser aucun acces
si PROT_NONE etait passe.
EXEMPLE
Le programme ci-dessous alloue quatre pages de memoire, rend la
troisieme accessible en lecture seule, puis execute une boucle qui se
deplace en avancant dans la region allouee et en modifiant son contenu.
Voici un exemple d'execution de ce programme :
$ ./a.out
Debut de la region : 0x804c000
Recu SIGSEGV a l'adresse : 0x804e000
Source du programme
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/mman.h>
#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0)
char *buffer;
static void
handler(int sig, siginfo_t *si, void *unused)
{
printf("Recu SIGSEGV a l'adresse : 0x%lx\n",
(long) si->si_addr);
exit(EXIT_FAILURE);
}
int
main(int argc, char *argv[])
{
char *p;
int pagesize;
struct sigaction sa;
sa.sa_flags = SA_SIGINFO;
sigemptyset(&sa.sa_mask);
sa.sa_sigaction = handler;
if (sigaction(SIGSEGV, &sa, NULL) == -1)
handle_error("sigaction");
pagesize = sysconf(_SC_PAGE_SIZE);
if (pagesize == -1)
handle_error("sysconf");
/* Allouer un tampon aligne sur une page ;
la protection initiale est PROT_READ | PROT_WRITE */
buffer = memalign(pagesize, 4 * pagesize);
if (buffer == NULL)
handle_error("memalign");
printf("Debut de la region : 0x%lx\n", (long) buffer);
if (mprotect(buffer + pagesize * 2, pagesize,
PROT_NONE) == -1)
handle_error("mprotect");
for (p = buffer ; ; )
*(p++) = 'a';
printf("Boucle terminee\n"); /* Ne devrait jamais arriver */
exit(EXIT_SUCCESS);
}
VOIR AUSSI
mmap(2), sysconf(3)
COLOPHON
Cette page fait partie de la publication 3.32 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent etre trouvees a l'adresse
<URL:http://www.kernel.org/doc/man-pages/>.
TRADUCTION
Depuis 2010, cette traduction est maintenue a l'aide de l'outil po4a
<URL:http://po4a.alioth.debian.org/> par l'equipe de traduction
francophone au sein du projet perkamon
<URL:http://perkamon.alioth.debian.org/>.
Christophe Blaess <URL:http://www.blaess.fr/christophe/> (1996-2003),
Alain Portal <URL:http://manpagesfr.free.fr/> (2003-2006). Julien
Cristau et l'equipe francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en ecrivant a
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir acces a la version anglaise de ce document
en utilisant la commande << man -L C <section> <page_de_man> >>.
Linux 6 aout 2008 MPROTECT(2)