]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: do not fall through in SIGBUS/SIGSEGV
authorRuss Cox <rsc@golang.org>
Fri, 30 Jul 2010 18:32:55 +0000 (11:32 -0700)
committerRuss Cox <rsc@golang.org>
Fri, 30 Jul 2010 18:32:55 +0000 (11:32 -0700)
Faults beyond the first page are not expected
and should fail loudly.  They are not subject to recover.

R=r
CC=golang-dev
https://golang.org/cl/1915042

src/pkg/runtime/darwin/thread.c
src/pkg/runtime/freebsd/thread.c
src/pkg/runtime/linux/thread.c

index e51d5301966763901619a5e5124d0051bfe56a1d..6f64c08738640f7981e64887f1f3053faaf9cd95 100644 (file)
@@ -453,11 +453,13 @@ sigpanic(void)
        case SIGBUS:
                if(g->sigcode0 == BUS_ADRERR && g->sigcode1 < 0x1000)
                        panicstring("invalid memory address or nil pointer dereference");
-               break;
+               printf("unexpected fault address %p\n", g->sigcode1);
+               throw("fault");
        case SIGSEGV:
                if((g->sigcode0 == 0 || g->sigcode0 == SEGV_MAPERR) && g->sigcode1 < 0x1000)
                        panicstring("invalid memory address or nil pointer dereference");
-               break;
+               printf("unexpected fault address %p\n", g->sigcode1);
+               throw("fault");
        case SIGFPE:
                switch(g->sigcode0) {
                case FPE_INTDIV:
index 334043312237c1a98d0c53f66aa188af9905b9e7..c9c058c5aef3cba260629ce51131573ebc8d10bf 100644 (file)
@@ -179,11 +179,13 @@ sigpanic(void)
        case SIGBUS:
                if(g->sigcode0 == BUS_ADRERR && g->sigcode1 < 0x1000)
                        panicstring("invalid memory address or nil pointer dereference");
-               break;
+               printf("unexpected fault address %p\n", g->sigcode1);
+               throw("fault");
        case SIGSEGV:
                if((g->sigcode0 == 0 || g->sigcode0 == SEGV_MAPERR) && g->sigcode1 < 0x1000)
                        panicstring("invalid memory address or nil pointer dereference");
-               break;
+               printf("unexpected fault address %p\n", g->sigcode1);
+               throw("fault");
        case SIGFPE:
                switch(g->sigcode0) {
                case FPE_INTDIV:
index a849125f942a1ad7ba514fe4fa36296cffc347ee..47bf3428f7f9bdfe7f04ed8a79f9e57bc91296b8 100644 (file)
@@ -279,11 +279,13 @@ sigpanic(void)
        case SIGBUS:
                if(g->sigcode0 == BUS_ADRERR && g->sigcode1 < 0x1000)
                        panicstring("invalid memory address or nil pointer dereference");
-               break;
+               printf("unexpected fault address %p\n", g->sigcode1);
+               throw("fault");
        case SIGSEGV:
                if((g->sigcode0 == 0 || g->sigcode0 == SEGV_MAPERR) && g->sigcode1 < 0x1000)
                        panicstring("invalid memory address or nil pointer dereference");
-               break;
+               printf("unexpected fault address %p\n", g->sigcode1);
+               throw("fault");
        case SIGFPE:
                switch(g->sigcode0) {
                case FPE_INTDIV: