diff --git a/src/ldso/dlerror.c b/src/ldso/dlerror.c index 3fcc7779..d8bbfc03 100644 --- a/src/ldso/dlerror.c +++ b/src/ldso/dlerror.c @@ -35,13 +35,16 @@ void __dl_thread_cleanup(void) hidden void __dl_vseterr(const char *fmt, va_list ap) { LOCK(freebuf_queue_lock); - while (freebuf_queue) { - void **p = freebuf_queue; - freebuf_queue = *p; - free(p); - } + void **q = freebuf_queue; + freebuf_queue = 0; UNLOCK(freebuf_queue_lock); + while (q) { + void **p = *q; + free(q); + q = p; + } + va_list ap2; va_copy(ap2, ap); pthread_t self = __pthread_self();