Fix a segfault when using -S|--select
This commit is contained in:
		
							parent
							
								
									fec562b760
								
							
						
					
					
						commit
						f3c0c63900
					
				
							
								
								
									
										144
									
								
								0001-lvresize-fix-check-for-mounted-and-renamed-LV-to-han.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								0001-lvresize-fix-check-for-mounted-and-renamed-LV-to-han.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,144 @@ | ||||
| From 772605c8b4c84b970d5b2a73672686e0f90ce59f Mon Sep 17 00:00:00 2001 | ||||
| From: David Teigland <teigland@redhat.com> | ||||
| Date: Thu, 23 Feb 2023 16:32:37 -0600 | ||||
| Subject: [PATCH] lvresize: fix check for mounted and renamed LV to handle | ||||
|  spaces | ||||
| 
 | ||||
| Replace spaces with \040 in directory paths from getmntent (mtab). | ||||
| 
 | ||||
| The recent commit 5374a44c5712 compares mount point directory paths | ||||
| from /etc/mtab and /proc/mounts, in order to detect when a mounted | ||||
| LV has been renamed.  The directory path comparison does not work | ||||
| correctly when the path contains spaces because getmntent uses | ||||
| ascii space chars and proc replaces spaces with \040. | ||||
| 
 | ||||
| (cherry picked from commit 1857eb9fe08924c2e4e5adfc322ee4a2ae5a2e67) | ||||
| ---
 | ||||
|  lib/device/filesystem.c   | 41 ++++++++++++++++++++++++++++++--------- | ||||
|  test/shell/lvresize-fs.sh | 14 +++++++++++++ | ||||
|  2 files changed, 46 insertions(+), 9 deletions(-) | ||||
| 
 | ||||
| diff --git a/lib/device/filesystem.c b/lib/device/filesystem.c
 | ||||
| index 9b086d8c1..2163276ed 100644
 | ||||
| --- a/lib/device/filesystem.c
 | ||||
| +++ b/lib/device/filesystem.c
 | ||||
| @@ -234,8 +234,9 @@ int fs_mount_state_is_misnamed(struct cmd_context *cmd, struct logical_volume *l
 | ||||
|  	char proc_fstype[FSTYPE_MAX]; | ||||
|  	char proc_devpath[PATH_MAX]; | ||||
|  	char proc_mntpath[PATH_MAX]; | ||||
| -	char lv_mapper_path[PATH_MAX];
 | ||||
| -	char mntent_mount_dir[PATH_MAX];
 | ||||
| +	char mtab_mntpath[PATH_MAX];
 | ||||
| +	char dm_devpath[PATH_MAX];
 | ||||
| +	char tmp_path[PATH_MAX];
 | ||||
|  	char *dm_name; | ||||
|  	struct stat st_lv; | ||||
|  	struct stat stme; | ||||
| @@ -275,14 +276,36 @@ int fs_mount_state_is_misnamed(struct cmd_context *cmd, struct logical_volume *l
 | ||||
|  			continue; | ||||
|  		if (stme.st_dev != st_lv.st_rdev) | ||||
|  			continue; | ||||
| -		dm_strncpy(mntent_mount_dir, me->mnt_dir, sizeof(mntent_mount_dir));
 | ||||
| +		dm_strncpy(mtab_mntpath, me->mnt_dir, sizeof(mtab_mntpath));
 | ||||
| +		break;
 | ||||
|  	} | ||||
|  	endmntent(fme); | ||||
|   | ||||
| +	/*
 | ||||
| +	 * In mtab dir path, replace each ascii space character with the
 | ||||
| +	 * four characters \040 which is how /proc/mounts represents spaces.
 | ||||
| +	 * The mnt dir from /etc/mtab and /proc/mounts are compared below.
 | ||||
| +	 */
 | ||||
| +	if (strchr(mtab_mntpath, ' ')) {
 | ||||
| +		int i, j = 0;
 | ||||
| +		memcpy(tmp_path, mtab_mntpath, sizeof(tmp_path));
 | ||||
| +		memset(mtab_mntpath, 0, sizeof(mtab_mntpath));
 | ||||
| +		for (i = 0; i < sizeof(tmp_path); i++) {
 | ||||
| +			if (tmp_path[i] == ' ') {
 | ||||
| +				mtab_mntpath[j++] = '\\';
 | ||||
| +				mtab_mntpath[j++] = '0';
 | ||||
| +				mtab_mntpath[j++] = '4';
 | ||||
| +				mtab_mntpath[j++] = '0';
 | ||||
| +				continue;
 | ||||
| +			}
 | ||||
| +			mtab_mntpath[j++] = tmp_path[i];
 | ||||
| +		}
 | ||||
| +	}
 | ||||
| +
 | ||||
|  	if (!(dm_name = dm_build_dm_name(cmd->mem, lv->vg->name, lv->name, NULL))) | ||||
|  		return_0; | ||||
|   | ||||
| -	if ((dm_snprintf(lv_mapper_path, sizeof(lv_mapper_path), "%s/%s", dm_dir(), dm_name) < 0))
 | ||||
| +	if ((dm_snprintf(dm_devpath, sizeof(dm_devpath), "%s/%s", dm_dir(), dm_name) < 0))
 | ||||
|  		return_0; | ||||
|   | ||||
|  	if (!(fp = fopen("/proc/mounts", "r"))) | ||||
| @@ -296,8 +319,8 @@ int fs_mount_state_is_misnamed(struct cmd_context *cmd, struct logical_volume *l
 | ||||
|  		if (strcmp(fstype, proc_fstype)) | ||||
|  			continue; | ||||
|   | ||||
| -		dir_match = !strcmp(mntent_mount_dir, proc_mntpath);
 | ||||
| -		dev_match = !strcmp(lv_mapper_path, proc_devpath);
 | ||||
| +		dir_match = !strcmp(mtab_mntpath, proc_mntpath);
 | ||||
| +		dev_match = !strcmp(dm_devpath, proc_devpath);
 | ||||
|   | ||||
|  		if (dir_match) | ||||
|  			found_dir++; | ||||
| @@ -306,7 +329,7 @@ int fs_mount_state_is_misnamed(struct cmd_context *cmd, struct logical_volume *l
 | ||||
|   | ||||
|  		if (dir_match != dev_match) { | ||||
|  			log_error("LV %s mounted at %s may have been renamed (from %s).", | ||||
| -				  lv_mapper_path, proc_mntpath, proc_devpath);
 | ||||
| +				  dm_devpath, proc_mntpath, proc_devpath);
 | ||||
|  			renamed = 1; | ||||
|  		} | ||||
|  	} | ||||
| @@ -327,11 +350,11 @@ int fs_mount_state_is_misnamed(struct cmd_context *cmd, struct logical_volume *l
 | ||||
|  	} | ||||
|  	/* These two are likely detected as renamed, but include checks in case. */ | ||||
|  	if (found_dir > 1) { | ||||
| -		log_error("File system resizing not supported: %s appears more than once in /proc/mounts.", mntent_mount_dir);
 | ||||
| +		log_error("File system resizing not supported: %s appears more than once in /proc/mounts.", mtab_mntpath);
 | ||||
|  		return 1; | ||||
|  	} | ||||
|  	if (found_dev > 1) { | ||||
| -		log_error("File system resizing not supported: %s appears more than once in /proc/mounts.", lv_mapper_path);
 | ||||
| +		log_error("File system resizing not supported: %s appears more than once in /proc/mounts.", dm_devpath);
 | ||||
|  		return 1; | ||||
|  	} | ||||
|  	return 0; | ||||
| diff --git a/test/shell/lvresize-fs.sh b/test/shell/lvresize-fs.sh
 | ||||
| index f437652d6..de234aad5 100644
 | ||||
| --- a/test/shell/lvresize-fs.sh
 | ||||
| +++ b/test/shell/lvresize-fs.sh
 | ||||
| @@ -30,6 +30,9 @@ which mkfs.xfs || skip
 | ||||
|  mount_dir="mnt_lvresize_fs" | ||||
|  mkdir -p "$mount_dir" | ||||
|   | ||||
| +mount_dir_space="other mnt dir"
 | ||||
| +mkdir -p "$mount_dir_space"
 | ||||
| +
 | ||||
|  # Tests require a libblkid version that shows FSLASTBLOCK | ||||
|  lvcreate -n $lv1 -L 300 $vg | ||||
|  mkfs.xfs -f "$DM_DEV_DIR/$vg/$lv1" | ||||
| @@ -273,6 +276,17 @@ umount "$mount_dir"
 | ||||
|  lvchange -an $vg/$lv2 | ||||
|  lvremove $vg/$lv2 | ||||
|   | ||||
| +# lvextend|lvreduce, ext4, active, mounted, mount dir with space, --fs resize, renamed LV
 | ||||
| +lvcreate -n $lv -L 256M $vg
 | ||||
| +mkfs.ext4 "$DM_DEV_DIR/$vg/$lv"
 | ||||
| +mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir_space"
 | ||||
| +lvrename $vg/$lv $vg/$lv2
 | ||||
| +not lvextend --fs resize -L+32M $vg/$lv2
 | ||||
| +not lvreduce --fs resize -L-32M $vg/$lv2
 | ||||
| +umount "$mount_dir_space"
 | ||||
| +lvchange -an $vg/$lv2
 | ||||
| +lvremove $vg/$lv2
 | ||||
| +
 | ||||
|   | ||||
|  # | ||||
|  # lvextend, xfs | ||||
| -- 
 | ||||
| 2.39.2 | ||||
| 
 | ||||
| @ -0,0 +1,70 @@ | ||||
| From 268e4ee30305a73e262a7fa35f850df2728cc696 Mon Sep 17 00:00:00 2001 | ||||
| From: Peter Rajnoha <prajnoha@redhat.com> | ||||
| 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 | ||||
| 
 | ||||
							
								
								
									
										12
									
								
								lvm2.spec
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								lvm2.spec
									
									
									
									
									
								
							| @ -45,11 +45,12 @@ Name: lvm2 | ||||
| Epoch: %{rhel} | ||||
| %endif | ||||
| Version: 2.03.19 | ||||
| Release: 1%{?dist} | ||||
| Release: 2%{?dist} | ||||
| License: GPLv2 | ||||
| URL: https://sourceware.org/lvm2/ | ||||
| Source0: https://sourceware.org/pub/lvm2/releases/LVM2.%{version}.tgz | ||||
| #Patch1: 0001-make-generate.patch | ||||
| Patch1: 0001-lvresize-fix-check-for-mounted-and-renamed-LV-to-han.patch | ||||
| Patch2: 0002-toollib-fix-segfault-if-using-S-select-with-log-repo.patch | ||||
| 
 | ||||
| BuildRequires: make | ||||
| BuildRequires: gcc | ||||
| @ -103,7 +104,8 @@ or more physical volumes and creating one or more logical volumes | ||||
| 
 | ||||
| %prep | ||||
| %setup -q -n LVM2.%{version} | ||||
| #%%patch1 -p1 -b .backup1 | ||||
| %patch1 -p1 -b .backup1 | ||||
| %patch2 -p1 -b .backup2 | ||||
| 
 | ||||
| %build | ||||
| %global _default_pid_dir /run | ||||
| @ -656,6 +658,10 @@ An extensive functional testsuite for LVM2. | ||||
| %endif | ||||
| 
 | ||||
| %changelog | ||||
| * Wed Mar 08 2023 Marian Csontos <mcsontos@redhat.com> - 2.03.19-2 | ||||
| - Fix lvresize's check for mounted and renamed LVs to handle spaces. | ||||
| - Fix segfault when using -S|--select with log/report_command_log=1. | ||||
| 
 | ||||
| * Tue Feb 21 2023 Marian Csontos <mcsontos@redhat.com> - 2.03.19-1 | ||||
| - Update to upstream version 2.03.19. | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user