diff options
author | hexcoder- <heiko@hexco.de> | 2019-10-26 00:17:51 +0200 |
---|---|---|
committer | hexcoder- <heiko@hexco.de> | 2019-10-26 00:17:51 +0200 |
commit | 3e9e7e17504517d8db92e47e7a5f904b023ba91e (patch) | |
tree | 7fad6bd0cc0fc8b180c6f891edd984b26c33feb3 /libtokencap/libtokencap.so.c | |
parent | e0ff20dd372579f4e4a540df00c8d6f4e218672b (diff) | |
download | afl++-3e9e7e17504517d8db92e47e7a5f904b023ba91e.tar.gz |
libtokencap ported to OpenBSD
Diffstat (limited to 'libtokencap/libtokencap.so.c')
-rw-r--r-- | libtokencap/libtokencap.so.c | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/libtokencap/libtokencap.so.c b/libtokencap/libtokencap.so.c index ddeae8b8..d33de8a4 100644 --- a/libtokencap/libtokencap.so.c +++ b/libtokencap/libtokencap.so.c @@ -27,14 +27,14 @@ #include "../types.h" #include "../config.h" -#if !defined __linux__ && !defined __APPLE__ && !defined __FreeBSD__ +#if !defined __linux__ && !defined __APPLE__ && !defined __FreeBSD__ && !defined __OpenBSD__ # error "Sorry, this library is unsupported in this platform for now!" #endif /* !__linux__ && !__APPLE__ && ! __FreeBSD__ */ #if defined __APPLE__ # include <mach/vm_map.h> # include <mach/mach_init.h> -#elif defined __FreeBSD__ +#elif defined __FreeBSD__ || defined __OpenBSD__ # include <sys/types.h> # include <sys/sysctl.h> # include <sys/user.h> @@ -111,17 +111,29 @@ static void __tokencap_load_mappings(void) { } } -#elif defined __FreeBSD__ +#elif defined __FreeBSD__ || defined __OpenBSD__ +#if defined __FreeBSD__ int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_VMMAP, getpid()}; +#elif defined __OpenBSD__ + int mib[] = {CTL_KERN, KERN_PROC_VMMAP, getpid()}; +#endif char *buf, *low, *high; size_t miblen = sizeof(mib)/sizeof(mib[0]); size_t len; if (sysctl(mib, miblen, NULL, &len, NULL, 0) == -1) return; +#if defined __FreeBSD__ len = len * 4 / 3; +#elif defined __OpenBSD__ + len -= len % sizeof(struct kinfo_vmentry); +#endif + buf = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0); + if (!buf) { + return; + } if (sysctl(mib, miblen, buf, &len, NULL, 0) == -1) { @@ -137,6 +149,9 @@ static void __tokencap_load_mappings(void) { while (low < high) { struct kinfo_vmentry *region = (struct kinfo_vmentry *)low; + +#if defined __FreeBSD__ + size_t size = region->kve_structsize; if (size == 0) break; @@ -144,6 +159,15 @@ static void __tokencap_load_mappings(void) { /* We go through the whole mapping of the process and track read-only addresses */ if ((region->kve_protection & KVME_PROT_READ) && !(region->kve_protection & KVME_PROT_WRITE)) { + +#elif defined __OpenBSD__ + + size_t size = sizeof (*region); + + /* We go through the whole mapping of the process and track read-only addresses */ + if ((region->kve_protection & KVE_PROT_READ) && + !(region->kve_protection & KVE_PROT_WRITE)) { +#endif __tokencap_ro[__tokencap_ro_cnt].st = (void *)region->kve_start; __tokencap_ro[__tokencap_ro_cnt].en = (void *)region->kve_end; |