summaryrefslogtreecommitdiff
path: root/src/signal/__segv.c
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2024-06-11 13:44:21 -0400
committerJakob Kaivo <jkk@ung.org>2024-06-11 13:44:21 -0400
commit4f29706128f3d3a66f0503d07c4960d4021aaf27 (patch)
tree7f76ae1b7819b99756feb1daf93cfe31d5c41c3b /src/signal/__segv.c
parent523944d96e11bde68bf9bcf8e42b7ebc99c5ed3d (diff)
support watching for dangerous parameter accessnon-posix
Diffstat (limited to 'src/signal/__segv.c')
-rw-r--r--src/signal/__segv.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/src/signal/__segv.c b/src/signal/__segv.c
index 7a4a2656..8c761914 100644
--- a/src/signal/__segv.c
+++ b/src/signal/__segv.c
@@ -14,7 +14,7 @@
#include "_forced/mprotect.h"
#define sysconf(__n) 4096
-#define psiginfo(x, y) fprintf(stderr, "%s (%p)\n", (char*)(y), (void*)(x))
+#define psiginfo(x, y) fprintf(stderr, "Segmentation Fault %s (%p)\n", (y) ? (char*)(y) : "", (void*)(x))
#define sigemptyset(x) memset(x, 0, sizeof(*x))
#endif
@@ -56,21 +56,25 @@ static void __jk_error(const char *s, void *addr, struct jk_source *src)
static void __jk_sigaction(int sig, siginfo_t *si, void *addr)
{
__signal_h.current = 0;
+ __dangerous.reporting = 1;
(void)sig; (void)addr;
__jk_undef();
-
- if (__dangerous[0].func) {
- fprintf(stderr, "In call to %s, attempting to read parameter %s (%p)\n", __dangerous[0].func, __dangerous[0].param, __dangerous[0].addr);
+ if (!si) {
+ __jk_error("No signal information provided", NULL, NULL);
}
- if (__dangerous[1].func) {
- fprintf(stderr, "In call to %s, attempting to write parameter %s (%p)\n", __dangerous[1].func, __dangerous[1].param, __dangerous[1].addr);
- }
+ uintptr_t p = (uintptr_t)si->si_addr;
- if (!si) {
- __jk_error("No signal information provided", NULL, NULL);
+ if (__dangerous.write.func && __dangerous.write.addr <= p && p <= __dangerous.write.addr + __dangerous.write.len) {
+ struct __danger *d = &__dangerous.write;
+ fprintf(stderr, "In call to %s(), failed to write parameter %s (%p) (%p)\n", d->func, d->param, (void*)d->addr, si->si_addr);
+ __jk_error(NULL, NULL, NULL);
+ } else if (__dangerous.read.func && __dangerous.read.addr <= p && p <= __dangerous.read.addr + __dangerous.read.len) {
+ struct __danger *d = &__dangerous.read;
+ fprintf(stderr, "In call to %s(), failed to read parameter %s (%p) (%p)\n", d->func, d->param, (void*)d->addr, si->si_addr);
+ __jk_error(NULL, NULL, NULL);
}
if (si->si_addr == NULL) {