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 <[email protected]> Reviewed-by: Philippe Mathieu-Daudé <[email protected]> Reviewed-by: Richard Henderson <[email protected]> Reviewed-by: Markus Armbruster <[email protected]> Signed-off-by: Daniel P. Berrangé <[email protected]> --- util/error-report.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/util/error-report.c b/util/error-report.c index 052f0f68b8..516d323ffe 100644 --- a/util/error-report.c +++ b/util/error-report.c @@ -234,6 +234,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(); @@ -261,6 +264,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
