MPROTECT(2)

NOM
mprotect - Controler les autorisations d'acces a une partie de la memoire.

SYNOPSIS
#include <sys/mman.h>

int mprotect(const void *addr, size_t *len, int prot);

DESCRIPTION
mprotect controle la maniere d'acceder a une portion de la memoire. Si un acces interdit se produit, le programme recoit un signal SIGSEGV.

prot est 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 ecrire dans la zone de memoire.

PROT_EXEC
    La zone de memoire peut contenir du code executable.

La nouvelle protection remplace toute autre protection precedente. Par exemple, si la memoire a ete marquee precedemment PROT_READ, et si l'on apppelle mprotect avec PROT_WRITE, la zone concernee ne sera plus lisible.

VALEUR RENVOYEE
mprotect renvoie 0 si il reussit, ou -1 s'il echoue, auquel cas errno contient le code d'erreur.

ERREURS

EINVAL
    addr n'est pas un pointeur valide, ou ce n'est pas un multiple de PAGESIZE.

EFAULT
    La memoire n'est pas accessible.

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.

ENOMEM
    Pas assez de memoire pour le noyau

EXEMPLE D'UTILISATION
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/mman.h>
#include <limits.h> /* pour avoir PAGESIZE */
#ifndef PAGESIZE
  #define PAGESIZE 4096
#endif
int
main(void)
{
    char *p;
    char c;
    /* Allocation d'un buffer, protection
       par defaut PROT_READ|PROT_WRITE. */
    p = malloc(1024 + PAGESIZE - 1);
    if (!p) {
        perror("Impossible d'allouer suffisament de memoire");
        exit(errno);
    }
    /*
     * Aligner p sur un multiple de PAGESIZE (que l'on suppose etre
     * une puissance de 2)
     */
    p = (char *) (((int) p + PAGESIZE-1) & ~(PAGESIZE-1));
    c = p[666];         /* lecture ok */
    p[666] = 42;        /* ecriture ok */
    /* Buffer marque en lecture-seule */
    if (mprotect(p, 1024, PROT_READ)) {
        perror("Impossible d'utiliser mprotect");
        exit(errno);
    }
    c = p[666];         /* lecture ok */
    p[666] = 42;        /* ecriture, fin du programme avec SIGSEGV */
    exit(0);
}

CONFORMITE
SVr4, POSIX.1b (anciennement POSIX.4). SVr4 definit un code d'erreur EAGAIN supplementaire. Les conditions d'erreur SVr4 ne correspondent pas tout a fait a celles de Linux. POSIX.1B precise que mprotect ne peut etre utilise que sur des zones de memoire obtenues avec mmap(2).

VOIR AUSSI
mmap(2)