The vreport() function will optionally emit an prefix for error
messages which is output to stderr incrementally. In the event
that two vreport() calls execute concurrently, there is a risk
that the prefix output will interleave. To address this it is
required to take a lock on 'stderr' when outputting errors.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
util/error-report.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/util/error-report.c b/util/error-report.c
index 222c40d0d1..b6aa20dbae 100644
--- a/util/error-report.c
+++ b/util/error-report.c
@@ -226,6 +226,8 @@ static void vreport(report_type type, const char *fmt, va_list ap)
if (monitor_cur_is_hmp()) {
cur = monitor_cur();
+ } else {
+ flockfile(stderr);
}
if (message_with_timestamp && !cur) {
@@ -254,6 +256,10 @@ static void vreport(report_type type, const char *fmt, va_list ap)
error_vprintf_mon(cur, fmt, ap);
error_printf_mon(cur, "\n");
+
+ if (!cur) {
+ funlockfile(stderr);
+ }
}
/*
--
2.50.1