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.
Reviewed-by: Philippe Mathieu-Daudé <[email protected]> Reviewed-by: Richard Henderson <[email protected]> Signed-off-by: Daniel P. Berrangé <[email protected]> --- util/error-report.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/util/error-report.c b/util/error-report.c index 14b170ca4c..46ea9ededa 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 { + qemu_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) { + qemu_funlockfile(stderr); + } } /* -- 2.52.0
