From a4b2c07ff946363bc6465b301e94c0f3bd2f8de7 Mon Sep 17 00:00:00 2001 From: Jakob Kaivo Date: Fri, 31 May 2024 15:20:09 -0400 Subject: add __memperm() for checking current memory permissions --- mk/__memperm.d | 9 +++++++++ mk/all.mk | 1 + mk/deps.mk | 4 ++++ src/__memperm.c | 36 ++++++++++++++++++++++++++++++++++++ src/_forced/mmap.h | 1 + src/_memperm.h | 9 +++++++++ 6 files changed, 60 insertions(+) create mode 100644 mk/__memperm.d create mode 100644 src/__memperm.c create mode 100644 src/_memperm.h diff --git a/mk/__memperm.d b/mk/__memperm.d new file mode 100644 index 00000000..83eff260 --- /dev/null +++ b/mk/__memperm.d @@ -0,0 +1,9 @@ +libc_C.0: libc.a(__memperm.o) +libc.a(__memperm.o): $(OBJDIR)/__memperm.o + @$(AR) $(ARFLAGS) $@ $(OBJDIR)/$% + +$(OBJDIR)/__memperm.o: src/__memperm.c +$(OBJDIR)/__memperm.o: src/_memperm.h +$(OBJDIR)/__memperm.o: + @mkdir -p $(@D) + $(CC) -c -o $@ $(CFLAGS) src/__memperm.c diff --git a/mk/all.mk b/mk/all.mk index dc4370a3..4b6eb27a 100644 --- a/mk/all.mk +++ b/mk/all.mk @@ -1,4 +1,5 @@ include mk/__undefined.d +include mk/__memperm.d include mk/ctan.d include mk/catan.d include mk/ccos.d diff --git a/mk/deps.mk b/mk/deps.mk index c9715488..d60a5357 100644 --- a/mk/deps.mk +++ b/mk/deps.mk @@ -6,6 +6,10 @@ all: mk/__undefined.d mk/__undefined.d: src/__undefined.c sh mk/deps.sh src/__undefined.c +all: mk/__memperm.d +mk/__memperm.d: src/__memperm.c + sh mk/deps.sh src/__memperm.c + all: mk/ctan.d mk/ctan.d: src/complex/ctan.c sh mk/deps.sh src/complex/ctan.c 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 +#include +#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; +} diff --git a/src/_forced/mmap.h b/src/_forced/mmap.h index 65c1ef01..24256479 100644 --- a/src/_forced/mmap.h +++ b/src/_forced/mmap.h @@ -5,6 +5,7 @@ #define PROT_NONE 0x0 #define PROT_READ 0x1 #define PROT_WRITE 0x2 +#define PROT_EXEC 0x4 #define MAP_PRIVATE 0x02 #define MAP_FAILED (void*)(-1) #define MAP_ANONYMOUS (0x20) diff --git a/src/_memperm.h b/src/_memperm.h new file mode 100644 index 00000000..d32d93f8 --- /dev/null +++ b/src/_memperm.h @@ -0,0 +1,9 @@ +#ifndef ___MEMPERM_H__ +#define ___MEMPERM_H__ + +/* for PROT_READ, PROT_WRITE, and PROT_EXEC */ +#include "_forced/mmap.h" + +int __memperm(void *); + +#endif -- cgit v1.2.1