Author: Armin Rigo <[email protected]>
Branch: stmgc-c8-gcc
Changeset: r78415:c20288c4ec6e
Date: 2015-07-02 19:35 +0100
http://bitbucket.org/pypy/pypy/changeset/c20288c4ec6e/
Log: update to stmgc/8b922e88252b
diff --git a/rpython/translator/stm/src_stm/revision
b/rpython/translator/stm/src_stm/revision
--- a/rpython/translator/stm/src_stm/revision
+++ b/rpython/translator/stm/src_stm/revision
@@ -1,1 +1,1 @@
-8fc3a9b12b15
+8b922e88252b
diff --git a/rpython/translator/stm/src_stm/stm/core.c
b/rpython/translator/stm/src_stm/stm/core.c
--- a/rpython/translator/stm/src_stm/stm/core.c
+++ b/rpython/translator/stm/src_stm/stm/core.c
@@ -238,6 +238,7 @@
addr >= stm_object_pages+TOTAL_MEMORY) {
/* actual segfault, unrelated to stmgc */
fprintf(stderr, "Segmentation fault: accessing %p\n", addr);
+ detect_shadowstack_overflow(addr);
abort();
}
diff --git a/rpython/translator/stm/src_stm/stm/setup.c
b/rpython/translator/stm/src_stm/stm/setup.c
--- a/rpython/translator/stm/src_stm/stm/setup.c
+++ b/rpython/translator/stm/src_stm/stm/setup.c
@@ -186,12 +186,12 @@
teardown_modification_locks();
}
-static void _shadowstack_trap_page(char *start, int prot)
+static char *_shadowstack_trap_page(struct stm_shadowentry_s *base)
{
size_t bsize = STM_SHADOW_STACK_DEPTH * sizeof(struct stm_shadowentry_s);
- char *end = start + bsize + 4095;
+ char *end = ((char *)base) + bsize + 4095;
end -= (((uintptr_t)end) & 4095);
- mprotect(end, 4096, prot);
+ return end;
}
static void _init_shadow_stack(stm_thread_local_t *tl)
@@ -203,9 +203,9 @@
/* set up a trap page: if the shadowstack overflows, it will
crash in a clean segfault */
- _shadowstack_trap_page(start, PROT_NONE);
+ struct stm_shadowentry_s *s = (struct stm_shadowentry_s *)start;
+ mprotect(_shadowstack_trap_page(s), 4096, PROT_NONE);
- struct stm_shadowentry_s *s = (struct stm_shadowentry_s *)start;
tl->shadowstack = s;
tl->shadowstack_base = s;
STM_PUSH_ROOT(*tl, -1);
@@ -216,8 +216,8 @@
assert(tl->shadowstack > tl->shadowstack_base);
assert(tl->shadowstack_base->ss == (object_t *)-1);
- char *start = (char *)tl->shadowstack_base;
- _shadowstack_trap_page(start, PROT_READ | PROT_WRITE);
+ char *trap = _shadowstack_trap_page(tl->shadowstack_base);
+ mprotect(trap, 4096, PROT_READ | PROT_WRITE);
free(tl->shadowstack_base);
tl->shadowstack = NULL;
@@ -298,3 +298,19 @@
{
return tl->next != NULL;
}
+
+static void detect_shadowstack_overflow(char *addr)
+{
+ if (addr == NULL)
+ return;
+ stm_thread_local_t *tl = stm_all_thread_locals;
+ while (tl != NULL) {
+ char *trap = _shadowstack_trap_page(tl->shadowstack_base);
+ if (trap <= addr && addr <= trap + 4095) {
+ fprintf(stderr, "This is caused by a stack overflow.\n"
+ "Sorry, proper RuntimeError support is not implemented
yet.\n");
+ return;
+ }
+ tl = tl->next;
+ }
+}
diff --git a/rpython/translator/stm/src_stm/stm/setup.h
b/rpython/translator/stm/src_stm/stm/setup.h
--- a/rpython/translator/stm/src_stm/stm/setup.h
+++ b/rpython/translator/stm/src_stm/stm/setup.h
@@ -2,6 +2,7 @@
static void setup_mmap(char *reason);
static void setup_protection_settings(void);
static pthread_t *_get_cpth(stm_thread_local_t *);
+static void detect_shadowstack_overflow(char *);
#ifndef NDEBUG
static __thread long _stm_segfault_expected = 1;
#define DEBUG_EXPECT_SEGFAULT(v) do {if (v) _stm_segfault_expected++; else
_stm_segfault_expected--; assert(_stm_segfault_expected <= 1);} while (0)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit