diff --git a/SOURCES/0091-libparted-Fix-endian-bug-in-bsd.c.patch b/SOURCES/0091-libparted-Fix-endian-bug-in-bsd.c.patch new file mode 100644 index 0000000..b7da46f --- /dev/null +++ b/SOURCES/0091-libparted-Fix-endian-bug-in-bsd.c.patch @@ -0,0 +1,31 @@ +From da8572e6696c2593150af4ba6917dcfc142eebab Mon Sep 17 00:00:00 2001 +From: "A. Wilcox" +Date: Mon, 5 Aug 2019 09:05:00 -0700 +Subject: [PATCH 91/97] libparted: Fix endian bug in bsd.c + +You have to add 1 *before* doing the endian conversion, not after. + +Signed-off-by: Brian C. Lane +(cherry picked from commit d5827cf0606680b4c4e6bf25ac1a4af6e1092f3f) + +Resolves: rhbz#1980105 +--- + libparted/labels/bsd.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libparted/labels/bsd.c b/libparted/labels/bsd.c +index f253a32..1e79408 100644 +--- a/libparted/labels/bsd.c ++++ b/libparted/labels/bsd.c +@@ -364,7 +364,7 @@ bsd_write (const PedDisk* disk) + max_part = i; + } + +- label->d_npartitions = PED_CPU_TO_LE16 (max_part) + 1; ++ label->d_npartitions = PED_CPU_TO_LE16 (max_part + 1); + label->d_checksum = xbsd_dkcksum (label); + + alpha_bootblock_checksum (bsd_specific->boot_code); +-- +2.31.1 + diff --git a/SOURCES/0092-Fix-resizepart-iec-unit-end-sector.patch b/SOURCES/0092-Fix-resizepart-iec-unit-end-sector.patch new file mode 100644 index 0000000..fed6901 --- /dev/null +++ b/SOURCES/0092-Fix-resizepart-iec-unit-end-sector.patch @@ -0,0 +1,36 @@ +From 937325555fcbf1a8a23934171ea86251700de0fd Mon Sep 17 00:00:00 2001 +From: Phillip Susi +Date: Thu, 12 May 2016 21:38:51 -0400 +Subject: [PATCH 92/97] Fix resizepart iec unit end sector + +Fix resizepart to adjust the end to be -1 sector when using iec +power of 2 units so that the next partition can start immediately +following the new end, just like mkpart does. + +(cherry picked from commit 247e3fc6cd8bca79b7c0362886ae9b5b06ba6f8c) + +Related: rhbz#1861804 +--- + parted/parted.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/parted/parted.c b/parted/parted.c +index c95fbbf..1733131 100644 +--- a/parted/parted.c ++++ b/parted/parted.c +@@ -1561,8 +1561,11 @@ do_resizepart (PedDevice** dev, PedDisk** diskp) + + start = part->geom.start; + end = oldend = part->geom.end; +- if (!command_line_get_sector (_("End?"), *dev, &end, &range_end, NULL)) ++ char *end_input; ++ if (!command_line_get_sector (_("End?"), *dev, &end, &range_end, &end_input)) + goto error; ++ _adjust_end_if_iec(&start, &end, range_end, end_input); ++ free(end_input); + /* Do not move start of the partition */ + constraint = constraint_from_start_end_fixed_start (*dev, start, range_end); + if (!ped_disk_set_partition_geom (disk, part, constraint, +-- +2.31.1 + diff --git a/SOURCES/0093-tests-Test-incomplete-resizepart-command.patch b/SOURCES/0093-tests-Test-incomplete-resizepart-command.patch new file mode 100644 index 0000000..a77be56 --- /dev/null +++ b/SOURCES/0093-tests-Test-incomplete-resizepart-command.patch @@ -0,0 +1,28 @@ +From 929a3bdd7a60912dd977ea79548b163a39b20568 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Tue, 23 Apr 2019 10:25:20 -0700 +Subject: [PATCH 93/97] tests: Test incomplete resizepart command + +(cherry picked from commit 679da92c54c75d7fca1fd825f1d42a750d115f2d) + +Related: rhbz#1861804 +--- + tests/t3200-resize-partition.sh | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/tests/t3200-resize-partition.sh b/tests/t3200-resize-partition.sh +index 251b545..dcf1775 100755 +--- a/tests/t3200-resize-partition.sh ++++ b/tests/t3200-resize-partition.sh +@@ -63,6 +63,8 @@ parted -m -s $dev u s p > out 2>&1 || fail=1 + wait_for_dev_to_appear_ ${dev}1 || { warn_ "${dev}1 did not appear" fail=1; } + sleep 1 + ++# Running it without end should not core-dump or prompt ++parted -s $dev resizepart 1 > out 2> err || fail=1 + + # extend the filesystem to end on sector 4096 + new_end=4096s +-- +2.31.1 + diff --git a/SOURCES/0094-Fix-end_input-usage-in-do_resizepart.patch b/SOURCES/0094-Fix-end_input-usage-in-do_resizepart.patch new file mode 100644 index 0000000..abd48d0 --- /dev/null +++ b/SOURCES/0094-Fix-end_input-usage-in-do_resizepart.patch @@ -0,0 +1,38 @@ +From 477968f0e73f2ec6b4427ab7c76fb6098699ec4e Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Tue, 23 Apr 2019 13:52:25 -0700 +Subject: [PATCH 94/97] Fix end_input usage in do_resizepart + +It needs to be set to NULL, since it may not get set by the call to +command_line_get_sector + +(cherry picked from commit ca845aeeddb17343c9289816833ca352f7c0d87b) + +Related: rhbz#1861804 +--- + parted/parted.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/parted/parted.c b/parted/parted.c +index 1733131..4552741 100644 +--- a/parted/parted.c ++++ b/parted/parted.c +@@ -1541,6 +1541,7 @@ do_resizepart (PedDevice** dev, PedDisk** diskp) + PedGeometry *range_end = NULL; + PedConstraint* constraint; + int rc = 0; ++ char* end_input = NULL; + + if (!disk) { + disk = ped_disk_new (*dev); +@@ -1561,7 +1562,6 @@ do_resizepart (PedDevice** dev, PedDisk** diskp) + + start = part->geom.start; + end = oldend = part->geom.end; +- char *end_input; + if (!command_line_get_sector (_("End?"), *dev, &end, &range_end, &end_input)) + goto error; + _adjust_end_if_iec(&start, &end, range_end, end_input); +-- +2.31.1 + diff --git a/SOURCES/0095-parted-Preserve-resizepart-End-when-prompted-for-bus.patch b/SOURCES/0095-parted-Preserve-resizepart-End-when-prompted-for-bus.patch new file mode 100644 index 0000000..2d64acd --- /dev/null +++ b/SOURCES/0095-parted-Preserve-resizepart-End-when-prompted-for-bus.patch @@ -0,0 +1,57 @@ +From b764430104af815296a5919888e397373746a21d Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Mon, 31 Aug 2020 16:40:07 -0700 +Subject: [PATCH 95/97] parted: Preserve resizepart End when prompted for busy + partition + +Resizing busy partitions is allowed, but the user is prompted, which +erases the cmdline. It is annoying to have to re-end the ending location +after answering Yes. This saves the word and pushes it back onto the +cmdline after the user agrees to resize the busy partition. + +(cherry picked from commit 691dabc930a6d544dfd8da787cddd159bab34b1e) + +Resolves: rhbz#1861804 +--- + parted/parted.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +diff --git a/parted/parted.c b/parted/parted.c +index 4552741..64fdd54 100644 +--- a/parted/parted.c ++++ b/parted/parted.c +@@ -1542,6 +1542,7 @@ do_resizepart (PedDevice** dev, PedDisk** diskp) + PedConstraint* constraint; + int rc = 0; + char* end_input = NULL; ++ char* end_size = NULL; + + if (!disk) { + disk = ped_disk_new (*dev); +@@ -1557,9 +1558,23 @@ do_resizepart (PedDevice** dev, PedDisk** diskp) + + if (!command_line_get_partition (_("Partition number?"), disk, &part)) + goto error; ++ ++ /* Save the optional End value if the partition is busy. */ ++ if (ped_partition_is_busy(part)) { ++ if (command_line_get_word_count()) ++ end_size = command_line_pop_word(); ++ } ++ ++ /* If the partition is busy this may clear the command_line and prompt the user */ + if (!_partition_warn_busy (part)) + goto error; + ++ /* Push the End value back onto the command_line, if it exists */ ++ if (end_size) { ++ command_line_push_word(end_size); ++ free(end_size); ++ } ++ + start = part->geom.start; + end = oldend = part->geom.end; + if (!command_line_get_sector (_("End?"), *dev, &end, &range_end, &end_input)) +-- +2.31.1 + diff --git a/SOURCES/0096-tests-Add-a-test-for-resizepart-on-a-busy-partition.patch b/SOURCES/0096-tests-Add-a-test-for-resizepart-on-a-busy-partition.patch new file mode 100644 index 0000000..35ca635 --- /dev/null +++ b/SOURCES/0096-tests-Add-a-test-for-resizepart-on-a-busy-partition.patch @@ -0,0 +1,89 @@ +From 97113adc42f15ba04630c2808f14cd01aff22ed9 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Tue, 1 Sep 2020 14:51:54 -0700 +Subject: [PATCH 96/97] tests: Add a test for resizepart on a busy partition + +This makes sure that the resizepart on a busy partition with the size on +the cmdline will work. + +(cherry picked from commit dfc611bd5126840d68493ad0e761511a71325af7) + +Related: rhbz#1861804 +--- + tests/t3200-resize-partition.sh | 44 ++++++++++++++++++++++++++++++--- + 1 file changed, 40 insertions(+), 4 deletions(-) + +diff --git a/tests/t3200-resize-partition.sh b/tests/t3200-resize-partition.sh +index dcf1775..2200977 100755 +--- a/tests/t3200-resize-partition.sh ++++ b/tests/t3200-resize-partition.sh +@@ -2,7 +2,7 @@ + # exercise the resize sub-command + # based on t3000-resize-fs.sh test + +-# Copyright (C) 2009-2011 Free Software Foundation, Inc. ++# Copyright (C) 2009-2020 Free Software Foundation, Inc. + + # This program is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by +@@ -66,8 +66,8 @@ sleep 1 + # Running it without end should not core-dump or prompt + parted -s $dev resizepart 1 > out 2> err || fail=1 + +-# extend the filesystem to end on sector 4096 +-new_end=4096s ++# extend the filesystem to end on sector 2048 ++new_end=2048s + parted -s $dev resizepart 1 $new_end > out 2> err || fail=1 + # expect no output + compare /dev/null out || fail=1 +@@ -77,9 +77,45 @@ compare /dev/null err || fail=1 + parted -m -s $dev u s p > out 2>&1 || fail=1 + + sed -n 3p out > k && mv k out || fail=1 +-printf "1:$default_start:$new_end:3073s:::$ms;\n" > exp || fail=1 ++printf "1:$default_start:$new_end:1025s:::$ms;\n" > exp || fail=1 + compare exp out || fail=1 + ++## Make sure resizing a busy partition works when user answers 'yes' ++# Format the partition and mount it for the busy check ++mkfs.ext4 "${dev}1" || skip_ mkfs.ext4 failed ++ ++# be sure to unmount upon interrupt, failure, etc. ++cleanup_fn_() { umount "${dev}1" > /dev/null 2>&1; } ++ ++mount_point=$(pwd)/mnt ++ ++mkdir $mount_point || fail=1 ++mount "${dev}1" "$mount_point" || fail=1 ++ ++# extend the filesystem to end on sector 4096 ++new_end=4096s ++echo yes | parted ---pretend-input-tty $dev resizepart 1 $new_end > out 2>&1 ++cat > exp < out ++compare exp out || fail=1 ++ ++# print partition table ++parted -m -s $dev u s p > out 2>&1 || fail=1 ++ ++sed -n 3p out > k && mv k out || fail=1 ++printf "1:$default_start:$new_end:3073s:ext2::$ms;\n" > exp || fail=1 ++compare exp out || fail=1 ++ ++umount "${dev}1" || fail=1 ++ + # Remove the partition explicitly, so that mklabel doesn't evoke a warning. + parted -s $dev rm 1 || fail=1 + +-- +2.31.1 + diff --git a/SOURCES/0097-parted-Fix-memory-leaks-in-do_resizepart.patch b/SOURCES/0097-parted-Fix-memory-leaks-in-do_resizepart.patch new file mode 100644 index 0000000..e9f7a86 --- /dev/null +++ b/SOURCES/0097-parted-Fix-memory-leaks-in-do_resizepart.patch @@ -0,0 +1,46 @@ +From 9acf1c61938c83cf8f68613bacdf872a5f4db632 Mon Sep 17 00:00:00 2001 +From: "Brian C. Lane" +Date: Thu, 10 Jun 2021 15:55:59 -0700 +Subject: [PATCH 97/97] parted: Fix memory leaks in do_resizepart + +(cherry picked from commit 6c4050af2c6c0abdbe1d553fdf2f19a6b600e9d1) + +Related: rhbz#1861804 +--- + parted/parted.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/parted/parted.c b/parted/parted.c +index 64fdd54..d4db2b5 100644 +--- a/parted/parted.c ++++ b/parted/parted.c +@@ -1572,7 +1572,6 @@ do_resizepart (PedDevice** dev, PedDisk** diskp) + /* Push the End value back onto the command_line, if it exists */ + if (end_size) { + command_line_push_word(end_size); +- free(end_size); + } + + start = part->geom.start; +@@ -1580,7 +1579,7 @@ do_resizepart (PedDevice** dev, PedDisk** diskp) + if (!command_line_get_sector (_("End?"), *dev, &end, &range_end, &end_input)) + goto error; + _adjust_end_if_iec(&start, &end, range_end, end_input); +- free(end_input); ++ + /* Do not move start of the partition */ + constraint = constraint_from_start_end_fixed_start (*dev, start, range_end); + if (!ped_disk_set_partition_geom (disk, part, constraint, +@@ -1606,6 +1605,9 @@ error_destroy_constraint: + error: + if (range_end != NULL) + ped_geometry_destroy (range_end); ++ free(end_input); ++ free(end_size); ++ + return rc; + } + +-- +2.31.1 + diff --git a/SPECS/parted.spec b/SPECS/parted.spec index a004fa2..055b636 100644 --- a/SPECS/parted.spec +++ b/SPECS/parted.spec @@ -4,7 +4,7 @@ Summary: The GNU disk partition manipulation program Name: parted Version: 3.2 -Release: 38%{?dist} +Release: 39%{?dist} License: GPLv3+ Group: Applications/System URL: http://www.gnu.org/software/parted @@ -112,6 +112,15 @@ Patch0088: 0088-linux.c-Use-sys-sysmacros.h-for-major-minor.patch Patch0089: 0089-t6000-dm-Stop-using-private-lvm-root.patch Patch0090: 0090-libparted-s390-Re-enabled-virtio-attached-DASD-heuri.patch +# Fix resizepart command +Patch0091: 0091-libparted-Fix-endian-bug-in-bsd.c.patch +Patch0092: 0092-Fix-resizepart-iec-unit-end-sector.patch +Patch0093: 0093-tests-Test-incomplete-resizepart-command.patch +Patch0094: 0094-Fix-end_input-usage-in-do_resizepart.patch +Patch0095: 0095-parted-Preserve-resizepart-End-when-prompted-for-bus.patch +Patch0096: 0096-tests-Add-a-test-for-resizepart-on-a-busy-partition.patch +Patch0097: 0097-parted-Fix-memory-leaks-in-do_resizepart.patch + Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: gcc BuildRequires: e2fsprogs-devel @@ -247,6 +256,20 @@ fi %changelog +* Wed Jul 07 2021 Brian C. Lane - 3.2-39 +- tests: Add a test for resizepart on a busy partition (bcl) + Related: rhbz#1861804 +- parted: Preserve resizepart End when prompted for busy partition (bcl) + Resolves: rhbz#1861804 +- Fix end_input usage in do_resizepart (bcl) + Related: rhbz#1861804 +- tests: Test incomplete resizepart command (bcl) + Related: rhbz#1861804 +- Fix resizepart iec unit end sector (psusi) + Related: rhbz#1861804 +- libparted: Fix endian bug in bsd.c (AWilcox) + Resolves: rhbz#1980105 + * Thu Sep 26 2019 Brian C. Lane - 3.2-38 - libparted: Re-enabled virtio-attached DASD heuristics on s390 Resolves: rhbz#1750663