MPROTECT(2)

NOMBRE
mprotect - accesos de control permisibles a una región de memoria

SYNOPSIS
#include <sys/mman.h>

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

DESCRIPCION
mprotect controla como una sección de memoria puede ser accedida. Si un acceso no es permitido por la protección dada, el programa recive un SIGSEGV.

prot es un bitwise-or de los siguientes valores:

PROT_NONE
    La memoria no puede ser accedida de ninguna forma.

PROT_READ
    La memoria puede ser leída.

PROT_WRITE
    La memoria puede ser escrita.

PROT_EXEC
    La memoria puede contener código ejecutable.

La nueva protección reemplaza cualquier protección existente. Por ejemplo, si la memoria había sido previamente marcada PROT_READ, y mprotect es entonces llamada con prot PROT_WRITE, no será leíble.

VALOR DEVUELTO
Si éxito, mprotect devuelve cero. Si error, -1 es devuelto, y errno está configurado apropiadamente.

ERRORES

EINVAL
    addr no es un puntero(indicador) válido, o no es un múltiplo de PAGESIZE.

EFAULT
    La memoria no puede ser accedida.

EACCES
    La memoria no puede dar el acceso especificado. Esto puede ocurrir, por ejemplo, si Ud. mmap(2) un fichero al cual tu tienes acceso de sólo lectura, entonces pregunta mprotect para marcarlo PROT_WRITE.

ENOMEM
    Las estructuras internas del kernel no pudieron ser localizadas.

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 dice que mprotect sólo puede ser usada sobre regiones de memoria obtenidas desde mmap(2).

SEE ALSO
mmap(2)