summaryrefslogtreecommitdiff
path: root/src/__memperm.c
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2024-05-31 15:20:09 -0400
committerJakob Kaivo <jkk@ung.org>2024-05-31 15:20:09 -0400
commita4b2c07ff946363bc6465b301e94c0f3bd2f8de7 (patch)
tree23621d5529c655a299ae9216ec4bafcc7688da81 /src/__memperm.c
parentbf0fad2913169318dc8e1d26c18ad056ee0cb363 (diff)
add __memperm() for checking current memory permissions
Diffstat (limited to 'src/__memperm.c')
-rw-r--r--src/__memperm.c36
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;
+}