diff --git a/src/common.c b/src/common.c index 44ea54c..4856ed3 100644 --- a/src/common.c +++ b/src/common.c @@ -7,6 +7,7 @@ #include #include +#include "context.h" int32_t decode_sleb128(uint8_t *sleb128) { @@ -117,12 +118,21 @@ unsigned getSLEB128Size(int64_t Value) #include #include -bool is_pointer_valid(void *p) +#include + +int pst_pointer_valid(void *p) { - /* get the page size */ - size_t page_size = sysconf(_SC_PAGESIZE); - /* find the address of the page that contains p */ - void *base = (void *)((((size_t)p) / page_size) * page_size); - /* call msync, if it returns non-zero, return false */ - return msync(base, page_size, MS_ASYNC) == 0; + long page_size = sysconf(_SC_PAGESIZE); + if(page_size < 0) { + pst_log(SEVERITY_ERROR, "%s: Failed to determine page size"); + return EFAULT; + } + + void *aligned = (void *)((((long)p) / page_size) * page_size); + //void *aligned = (void *)((uintptr_t)p & ~(page_size - 1)); + if(msync(aligned, page_size, MS_ASYNC) == 0) { + return 0; + } + + return (errno == ENOMEM ? EINVAL : EFAULT); } diff --git a/src/common.h b/src/common.h index c44c27a..8a8487a 100644 --- a/src/common.h +++ b/src/common.h @@ -21,6 +21,6 @@ int32_t decode_sleb128(uint8_t *sleb128); uint32_t decode_uleb128(uint8_t *uleb128); -bool is_pointer_valid(void *p); +int pst_pointer_valid(void *p); #endif // __PST_COMMON_H__