[master] fd3d71b17 Try to handle reentrant panics more sensibly.
Poul-Henning Kamp
phk at FreeBSD.org
Tue Jan 4 07:36:05 UTC 2022
commit fd3d71b17eb9b3595b4d0fda297159b713d70f80
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Tue Jan 4 07:34:25 2022 +0000
Try to handle reentrant panics more sensibly.
Relevant to: #3764
diff --git a/bin/varnishd/cache/cache_panic.c b/bin/varnishd/cache/cache_panic.c
index 3ac6af736..734b801e3 100644
--- a/bin/varnishd/cache/cache_panic.c
+++ b/bin/varnishd/cache/cache_panic.c
@@ -67,6 +67,7 @@
static struct vsb pan_vsb_storage, *pan_vsb;
static pthread_mutex_t panicstr_mtx;
+static pthread_t panicy;
static void pan_sess(struct vsb *, const struct sess *);
static void pan_req(struct vsb *, const struct req *);
@@ -720,12 +721,17 @@ pan_ic(const char *func, const char *file, int line, const char *cond,
struct sigaction sa;
int err = errno;
- AZ(pthread_mutex_lock(&panicstr_mtx));
-
- /* If we already panic'ed, do nothing */
- while (heritage.panic_str[0])
+ /* If we already panicing in another thread, do nothing */
+ while (heritage.panic_str[0] && panicy != pthread_self())
sleep(1);
+ if (pthread_mutex_lock(&panicstr_mtx)) {
+ /* Reentrant panic */
+ VSB_printf(pan_vsb,"\n\nPANIC REENTRANCY\n\n");
+ abort();
+ }
+ panicy = pthread_self();
+
/*
* should we trigger a SIGSEGV while handling a panic, our sigsegv
* handler would hide the panic, so we need to reset the handler to
More information about the varnish-commit
mailing list