From 268e4ee30305a73e262a7fa35f850df2728cc696 Mon Sep 17 00:00:00 2001 From: Peter Rajnoha Date: Tue, 7 Mar 2023 14:45:06 +0100 Subject: [PATCH 2/2] toollib: fix segfault if using -S|--select with log/report_command_log=1 setting When we are using -S|--select for non-reporting tools while using command log reporting (log/report_command_log=1 setting), we need to create an internal processing handle to handle the selection itself. In this case, the internal processing handle to execute the selection (to process the -S|--select) has a parent handle (that is processing the actual non-reporting command). When this parent handle exists, we can't destroy the command log report in destroy_processing_handle as there's still the parent processing to finish. The parent processing may still generate logs which need to be reported in the command log report. If the command log report was destroyed prematurely together with destroying the internal processing handle for -S|--select, then any subsequent log request from processing the actual command (and hence an attermpt to access the command log report) ended up with a segfault. See also: https://bugzilla.redhat.com/show_bug.cgi?id=2175220 (cherry picked from commit cd14d3fcc0e03136d0cea1ab1a9edff3b8b9dbeb) --- WHATS_NEW | 4 ++++ tools/toollib.c | 15 ++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/WHATS_NEW b/WHATS_NEW index b54a092d8..33998be7d 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,3 +1,7 @@ +version 2.03.20 - +==================================== + Fix segfault if using -S|--select with log/report_command_log=1 setting. + version 2.03.19 - 21st February 2023 ==================================== Configure supports --with-systemd-run executed from udev rules. diff --git a/tools/toollib.c b/tools/toollib.c index 194088ea6..43e628abf 100644 --- a/tools/toollib.c +++ b/tools/toollib.c @@ -2050,7 +2050,20 @@ void destroy_processing_handle(struct cmd_context *cmd, struct processing_handle log_restore_report_state(cmd->cmd_report.saved_log_report_state); - if (!cmd->is_interactive) { + /* + * Do not destroy current cmd->report_group and cmd->log_rh + * (the log report) yet if we're running interactively + * (== running in lvm shell) or if there's a parent handle + * (== we're executing nested processing, like it is when + * doing selection for parent's process_each_* processing). + * + * In both cases, there's still possible further processing + * to do outside the processing covered by the handle we are + * destroying here and for which we may still need to access + * the log report to cover the rest of the processing. + * + */ + if (!cmd->is_interactive && !handle->parent) { if (!dm_report_group_destroy(cmd->cmd_report.report_group)) stack; cmd->cmd_report.report_group = NULL; -- 2.39.2