[PULL 25/27] util: fix interleaving of error prefixes

Daniel P. Berrangé via Devel posted 27 patches 2 weeks, 4 days ago
There is a newer version of this series
[PULL 25/27] util: fix interleaving of error prefixes
Posted by Daniel P. Berrangé 2 weeks, 4 days ago
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.

Reported-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
 util/error-report.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/util/error-report.c b/util/error-report.c
index 6b9e592bc1..bbea49a55d 100644
--- a/util/error-report.c
+++ b/util/error-report.c
@@ -233,6 +233,9 @@ static void vreport(report_type type, const char *fmt, va_list ap)
     if (monitor_cur_is_qmp()) {
         cur = NULL;
     }
+    if (!cur) {
+        qemu_flockfile(stderr);
+    }
 
     if (message_with_timestamp && !cur) {
         timestr = real_time_iso8601();
@@ -260,6 +263,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) {
+        qemu_funlockfile(stderr);
+    }
 }
 
 /*
-- 
2.53.0