blob: e3bcd64d700b29965398c8bd2e950dc71d62a270 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#include <inttypes.h>
#include <stdio.h>
#include "_memperm.h"
int __memperm(void *ptr)
{
uintptr_t addr = (uintptr_t)ptr;
int ret = PROT_NONE;
FILE *map = fopen("/proc/self/maps", "r");
if (map == NULL) {
return -1;
}
while (!feof(map)) {
uintmax_t low = 0;
uintmax_t high = 0;
char perms[5];
fscanf(map, "%ju-%ju %4s%*s\n", &low, &high, perms);
if (low <= addr && high >= addr) {
if (perms[0] == 'r') {
ret |= PROT_READ;
}
if (perms[1] == 'w') {
ret |= PROT_WRITE;
}
if (perms[2] == 'x') {
ret |= PROT_EXEC;
}
break;
}
}
fclose(map);
return ret;
}
|