If we were panic-ing in multiple threads at the same time, the panic
buffer would be partially overwritten.  Prevent this with a mutex
---
 bin/varnishd/cache_panic.c  |    5 +++++
 bin/varnishd/cache_shmlog.c |    2 +-
 2 files changed, 6 insertions(+), 1 deletions(-)

diff --git a/bin/varnishd/cache_panic.c b/bin/varnishd/cache_panic.c
index c443b67..9279029 100644
--- a/bin/varnishd/cache_panic.c
+++ b/bin/varnishd/cache_panic.c
@@ -34,6 +34,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <pthread.h>
 
 #ifndef HAVE_EXECINFO_H
 #include "compat/execinfo.h"
@@ -56,6 +57,7 @@
  */
 
 static struct vsb vsps, *vsp;
+pthread_mutex_t panicstr_mtx = PTHREAD_MUTEX_INITIALIZER;
 
 /*--------------------------------------------------------------------*/
 
@@ -294,6 +296,9 @@ pan_ic(const char *func, const char *file, int line, const 
char *cond,
        const char *q;
        const struct sess *sp;
 
+       AZ(pthread_mutex_lock(&panicstr_mtx)); /* Won't be released,
+                                                 we're going to die
+                                                 anyway */
        switch(xxx) {
        case 3:
                VSB_printf(vsp,
diff --git a/bin/varnishd/cache_shmlog.c b/bin/varnishd/cache_shmlog.c
index e0b332d..023c20a 100644
--- a/bin/varnishd/cache_shmlog.c
+++ b/bin/varnishd/cache_shmlog.c
@@ -288,7 +288,7 @@ VSL_Init(void)
 
        vsl_wrap();
        VSM_head->starttime = (intmax_t)TIM_real();
-       VSM_head->panicstr[0] = '\0';
+       memset(VSM_head->panicstr, '\0', sizeof *VSM_head->panicstr);
        memset(VSC_C_main, 0, sizeof *VSC_C_main);
        VSM_head->child_pid = getpid();
 }
-- 
1.7.5.4


_______________________________________________
varnish-dev mailing list
[email protected]
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev

Reply via email to