summaryrefslogtreecommitdiff
path: root/src/__memperm.c
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;
}