diff options
author | Jakob Kaivo <jkk@ung.org> | 2024-05-31 15:20:09 -0400 |
---|---|---|
committer | Jakob Kaivo <jkk@ung.org> | 2024-05-31 15:20:09 -0400 |
commit | a4b2c07ff946363bc6465b301e94c0f3bd2f8de7 (patch) | |
tree | 23621d5529c655a299ae9216ec4bafcc7688da81 /src/__memperm.c | |
parent | bf0fad2913169318dc8e1d26c18ad056ee0cb363 (diff) |
add __memperm() for checking current memory permissions
Diffstat (limited to 'src/__memperm.c')
-rw-r--r-- | src/__memperm.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/__memperm.c b/src/__memperm.c new file mode 100644 index 00000000..e3bcd64d --- /dev/null +++ b/src/__memperm.c @@ -0,0 +1,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; +} |