diff options
author | Jakob Kaivo <jkk@ung.org> | 2024-05-28 14:56:06 -0400 |
---|---|---|
committer | Jakob Kaivo <jkk@ung.org> | 2024-05-28 14:56:06 -0400 |
commit | b4cd7036bea6c6440fbbcdaebe53c864c87a5646 (patch) | |
tree | 260670ad9a9637c8c36d84b9cf77ec412017b038 /src/__readonly.c | |
parent | a69b11fd8974a898a26081950bd4add7c82ea45d (diff) |
integrate jkmalloc/prep for readonly
Diffstat (limited to 'src/__readonly.c')
-rw-r--r-- | src/__readonly.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/__readonly.c b/src/__readonly.c new file mode 100644 index 00000000..74837a91 --- /dev/null +++ b/src/__readonly.c @@ -0,0 +1,37 @@ +#include <stdlib.h> +#include "_readonly.h" + +#ifdef _POSIX_C_SOURCE +#include <sys/mman.h> +#include <limits.h> +#else +#include "_syscall.h" +#define mprotect(__ptr, __len, __prot) __syscall(__sys_mprotect, __ptr, __len, __prot) +#define PROT_READ 1 +#define PROT_WRITE 2 +#define PAGESIZE 4096 +#endif + +void* __readonly(ro_action_t action, void *ptr) +{ + switch (action) { + case RO_ALLOC: + /* set magic to JK_READONLY */ + /* set label to ptr */ + return malloc(PAGESIZE); + + case RO_FREE: + free(ptr); + return NULL; + + case RO_LOCK: + mprotect(ptr, PAGESIZE, PROT_READ); + break; + + case RO_UNLOCK: + mprotect(ptr, PAGESIZE, PROT_READ | PROT_WRITE); + break; + } + + return ptr; +} |