Signed-off-by: wangzhiqiang <wangzhiqiang95@huawei.com> (cherry picked from commit d81775f21f4c3229e5184787999c449b032b5e95)
56 lines
2.3 KiB
Diff
56 lines
2.3 KiB
Diff
From 8877cc0ff8e4f2a52006240fa5575c8051cc351f Mon Sep 17 00:00:00 2001
|
|
From: Peter Rajnoha <prajnoha@redhat.com>
|
|
Date: Tue, 7 Mar 2023 14:45:06 +0100
|
|
Subject: [PATCH] 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
|
|
---
|
|
tools/toollib.c | 15 ++++++++++++++-
|
|
1 file changed, 14 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/tools/toollib.c b/tools/toollib.c
|
|
index bf744d6..18eb7be 100644
|
|
--- a/tools/toollib.c
|
|
+++ b/tools/toollib.c
|
|
@@ -1796,7 +1796,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.33.0
|
|
|