util: fix interleaving of error prefixes

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>
This commit is contained in:
Daniel P. Berrangé
2025-09-24 18:55:21 +01:00
parent 6365e97c84
commit 13bedeb212

View File

@@ -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);
}
}
/*