runtime: don't crash if panicstring called with no m
It's possible for runtime_panicstring to be called with no m if a
signal handler, or scheduler innards, do something wrong. If that
happens carry on with the panic rather than crashing.
Change-Id: I8ad04f1f9d7655b4a4e9a983f439f2cc3ac6b269
Reviewed-on: https://go-review.googlesource.com/41137
Reviewed-by: Than McIntosh <thanm@google.com>
diff --git a/libgo/runtime/panic.c b/libgo/runtime/panic.c
index 493fde8..8cb6bff 100644
--- a/libgo/runtime/panic.c
+++ b/libgo/runtime/panic.c
@@ -16,19 +16,23 @@
void
runtime_panicstring(const char *s)
{
+ M* mp;
Eface err;
- if(runtime_m()->mallocing) {
- runtime_printf("panic: %s\n", s);
- runtime_throw("panic during malloc");
- }
- if(runtime_m()->gcing) {
- runtime_printf("panic: %s\n", s);
- runtime_throw("panic during gc");
- }
- if(runtime_m()->locks) {
- runtime_printf("panic: %s\n", s);
- runtime_throw("panic holding locks");
+ mp = runtime_m();
+ if (mp != nil) {
+ if(mp->mallocing) {
+ runtime_printf("panic: %s\n", s);
+ runtime_throw("panic during malloc");
+ }
+ if(mp->gcing) {
+ runtime_printf("panic: %s\n", s);
+ runtime_throw("panic during gc");
+ }
+ if(mp->locks) {
+ runtime_printf("panic: %s\n", s);
+ runtime_throw("panic holding locks");
+ }
}
runtime_newErrorCString(s, &err);
runtime_panic(err);