`write (dev_null, addr ...)` Чтобы проверить достоверность адреса виртуальной памяти `addr` с использованием` errno = efLinux

Ответить Пред. темаСлед. тема
Anonymous
 `write (dev_null, addr ...)` Чтобы проверить достоверность адреса виртуальной памяти `addr` с использованием` errno = ef

Сообщение Anonymous »

Мой вопрос основан на решении, предложенном для аналогичного вопроса. < /p>
Предположим, у меня есть произвольный виртуальный адрес. Решение просит попробовать написать в «/dev/null» с этим виртуальным адресом в качестве входного буфера. Если адрес не действителен, Errno должен быть установлен на EFAULT. На что я написал небольшой код в качестве теста: < /p>

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 

int isMemoryMapped(void* addr) {
int dev_null = open("/dev/null", O_WRONLY);
if (dev_null == -1) {
perror("Failed to open /dev/null");
exit(EXIT_FAILURE);
}

errno = 0;
// Attempt to write to /dev/null
ssize_t result = write(dev_null, addr, sizeof(void*)); // 
Но, к сожалению, программа Segfaults, пытаясь выполнить операцию записи: < /p>
...
1197 : Address 0x7ffeea336fe8 is accessible, content = 0x6f6d656d5f656661
1198 : Address 0x7ffeea336ff0 is accessible, content = 0x6e6163735f7972
1199 : Address 0x7ffeea336ff8 is accessible, content = (nil)
Segmentation fault (core dumped)
Любое предложение о том, что может пойти не так?#include
#include
#include
#include
#include

int isMemoryMapped(void* addr) {
// Align address to page boundary
long pageSize = sysconf(_SC_PAGESIZE);
void* pageAlignedAddr = (void*)((uintptr_t)addr & ~(pageSize - 1));

unsigned char vec;
if (mincore(pageAlignedAddr, pageSize, &vec) == 0) {
return 1; // Memory is mapped
}
return 0; // Memory is NOT mapped
}
< /code>

Я использую Ubuntu 22.04.5 LTS x86_64 с ядром 5.15.0-100-Генера. < /p>

Подробнее здесь: https://stackoverflow.com/questions/795 ... ss-addr-us
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Python Socket - server.bind(ADDR) OSError: [WinError 10048] Обычно разрешено только одно использование каждого адреса со
    Anonymous » » в форуме Python
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous
  • Python Socket - server.bind(ADDR) OSError: [WinError 10048] Обычно разрешено только одно использование каждого адреса со
    Anonymous » » в форуме Python
    0 Ответы
    37 Просмотры
    Последнее сообщение Anonymous
  • Как правильно проверить достоверность FileLock в разных экземплярах?
    Anonymous » » в форуме JAVA
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Как проверить достоверность реквизитов банковского счета?
    Anonymous » » в форуме Android
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Может ли madvise(addr, size, MADV_DONTNEED) вызывать сбои сегментации?
    Anonymous » » в форуме Linux
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Linux»