Provided by: manpages-fr-dev_3.27fr1.4-1_all bug

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.27 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)