Документация по LinuxLinuxDoc.Ru 🔍

mprotect - контролирует доступ к области памяти

НАЗВАНИЕ
mprotect - контролирует доступ к области памяти

СИНТАКСИС
#include

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

ОПИСАНИЕ

mprotect контролирует доступ к области памяти. Если
программой производится не разрешенный этой функцией
доступ к памяти, то эта программа получает сигнал SIGSEGV.

prot состоит из следующих побитно и логически сложенных
значений:

PROT_NONE Доступ к памяти запрещен.

PROT_READ Данные в памяти можно читать.

PROT_WRITE В память можно записать информацию.

PROT_EXEC Память может содержать исполняемый код.

Новые установки защиты заменяют предыдущие. Например, если
память была ранее помечена PROT_READ, а mprotect
вызывается с помощью параметра prot, равного PROT_WRITE,
то данные, находящиеся в памяти, невозможно будет
считывать.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При удачном завершении вызова возвращаемое значение равно
нулю. При ошибке оно равно -1, а переменной errno
присваивается номер ошибки.

КОДЫ ОШИБОК
EINVAL addr не является правильным указателем или не
пропорционален PAGESIZE.

EFAULT К памяти нет доступа.

EACCES Нельзя задать этот вид доступа. Это может,
например, случиться в том случае, если при помощи
функции mmap(2) был отражен в память файл, который
доступен только для чтения, а затем функции mpro-
tect задан параметр PROT_WRITE.

ENOMEM Не могут быть созданы внутренные структуры ядра.

ПРИМЕР

int
main(void)
{
char *p;
char c;
/* Создать буфер; по умолчанию доступ к нему
устанавливается в PROT_READ|PROT_WRITE. */
p = malloc(1024+PAGESIZE-1);
if (!p) {
perror("Невозможно выделить память malloc(1024)");
exit(errno);
}
/* Выровнять пропорционально PAGESIZE; предполагается, что число должно быть кратно степени 2 */
p = (char *)(((int) p + PAGESIZE-1) & ~(PAGESIZE-1));
c = p[666]; /* Чтение; ok */
p[666] = 42; /* Запись; ok */
/* Пометить буфер доступным только для чтения. */
if (mprotect(p, 1024, PROT_READ)) {
perror("Невозможно выполнить mprotect");
exit(errno);
}
c = p[666]; /* Чтение; ok */
p[666] = 42; /* Запись; программа прекращает работу при получении сигнала SIGSEGV */
exit(0);
}

СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, POSIX.1b (в прошлом POSIX.4). SVr4 описывает
дополнительный код ошибки EAGAIN. Коды ошибок SVr4 не
полностью соответствуют кодам ошибок в Linux. POSIX.1b
указывает, что mprotect можно использовать только в
областях памяти, заданных mmap(2).
Читать новости Linux в Telegram
Linux - mprotect - контролирует доступ к области памяти
Мы в соцсетях ✉