Blame SOURCES/0001-growpart-fix-bug-occurring-if-start-sector-and-size-.patch

8f6ffc
From 827ca9237044f4821eb442fee1eef07ec7c3448c Mon Sep 17 00:00:00 2001
8f6ffc
From: Lars Kellogg-Stedman <lars@redhat.com>
8f6ffc
Date: Thu, 6 Dec 2018 15:32:35 -0500
8f6ffc
Subject: [PATCH] growpart: fix bug occurring if start sector and size were the
8f6ffc
 same.
8f6ffc
8f6ffc
The existing sed expression would erroneously change the start sector
8f6ffc
of a partition, rather than the size, if the start sector and size
8f6ffc
were identical.  This commit modifies the sed expression so that it
8f6ffc
will only operate on the final match in the line.
8f6ffc
8f6ffc
bzr-revno: 338.1.1
8f6ffc
(cherry picked from commit 7b11ac4d3abe16525639cff9198f5e7f8303280b)
8f6ffc
---
8f6ffc
 bin/growpart                          |  2 +-
8f6ffc
 test/test-growpart-start-matches-size | 75 +++++++++++++++++++++++++++
8f6ffc
 2 files changed, 76 insertions(+), 1 deletion(-)
8f6ffc
 create mode 100755 test/test-growpart-start-matches-size
8f6ffc
8f6ffc
diff --git a/bin/growpart b/bin/growpart
8f6ffc
index 13eda6e..4069fd4 100755
8f6ffc
--- a/bin/growpart
8f6ffc
+++ b/bin/growpart
8f6ffc
@@ -314,7 +314,7 @@ resize_sfdisk() {
8f6ffc
 	# now, change the size for this partition in ${dump_out} to be the
8f6ffc
 	# new size
8f6ffc
 	new_size=$((${max_end}-${pt_start}))
8f6ffc
-	sed "\|^\s*${dpart} |s/${pt_size},/${new_size},/" "${dump_out}" \
8f6ffc
+	sed "\|^\s*${dpart} |s/\(.*\)${pt_size},/\1${new_size},/" "${dump_out}" \
8f6ffc
 		>"${new_out}" ||
8f6ffc
 		fail "failed to change size in output"
8f6ffc
 
8f6ffc
diff --git a/test/test-growpart-start-matches-size b/test/test-growpart-start-matches-size
8f6ffc
new file mode 100755
8f6ffc
index 0000000..9967827
8f6ffc
--- /dev/null
8f6ffc
+++ b/test/test-growpart-start-matches-size
8f6ffc
@@ -0,0 +1,75 @@
8f6ffc
+#!/bin/bash
8f6ffc
+#
8f6ffc
+# Create a disk image where there exists a partition whose sizes matches the
8f6ffc
+# start sector.
8f6ffc
+# brought up under bug 1807171, which describes an error in the sed expression
8f6ffc
+# used to generate the replacement partition map
8f6ffc
+
8f6ffc
+set -e
8f6ffc
+
8f6ffc
+TEMP_D=""
8f6ffc
+
8f6ffc
+rq() {
8f6ffc
+	local out="${TEMP_D}/out"
8f6ffc
+	"$@" > "$out" 2>&1 || { echo "FAILED:" "$@"; cat "$out"; return 1; }
8f6ffc
+}
8f6ffc
+fail() { echo "FAILED:" "$@" 1>&2; exit 1; }
8f6ffc
+
8f6ffc
+setup_img() {
8f6ffc
+	local img_fp="$1" img=""
8f6ffc
+	img=$(basename "$img_fp")
8f6ffc
+	sfdisk "${img_fp}" <
8f6ffc
+label: gpt
8f6ffc
+label-id: db24000c-6ef3-4a17-b71c-1064baa29514
8f6ffc
+device: ${img}
8f6ffc
+unit: sectors
8f6ffc
+first-lba: 2048
8f6ffc
+last-lba: 4194270
8f6ffc
+
8f6ffc
+${img}1 : start=        2048, size=     1024000, type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B, uuid=5bc16165-bfc0-4e13-94eb-b898dc0bca41
8f6ffc
+${img}2 : start=     1026048, size=     1026048, type=4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709, uuid=a0e1636e-b759-4e7a-bd14-6f3d6c04745d
8f6ffc
+EOF
8f6ffc
+}
8f6ffc
+
8f6ffc
+cleanup() {
8f6ffc
+	[ ! -d "${TEMP_D}" ] || rm -Rf "${TEMP_D}"
8f6ffc
+}
8f6ffc
+TEMP_D=$(mktemp -d ${TMPDIR:-/tmp}/${0##*/}.XXXXXX)
8f6ffc
+trap cleanup EXIT
8f6ffc
+
8f6ffc
+expected_sfdisk="CHANGED: partition=2 start=1026048 old: size=1026048 end=2052096 new: size=3168223 end=4194271"
8f6ffc
+expected_sgdisk="CHANGED: partition=2 start=1026048 old: size=1026048 end=2052096 new: size=3166208 end=4192256"
8f6ffc
+CR='
8f6ffc
+'
8f6ffc
+for resizer in sfdisk sgdisk; do
8f6ffc
+    expected_var_name="expected_$resizer"
8f6ffc
+	expected="${!expected_var_name}"
8f6ffc
+
8f6ffc
+	img="${TEMP_D}/disk-$resizer.img"
8f6ffc
+	echo "====== Testing with resizer=$resizer ====="
8f6ffc
+	rq truncate "--size=2G" "$img"
8f6ffc
+	( cd ${TEMP_D} && rq setup_img "${img##*/}" ) || fail "setup image $img"
8f6ffc
+	echo "==== before ===="
8f6ffc
+	( cd "${TEMP_D}" && sfdisk --dump "${img##*/}" )
8f6ffc
+	err="${TEMP_D}/gp.err"
8f6ffc
+	out="${TEMP_D}/gp.out"
8f6ffc
+	if ! GROWPART_RESIZER=$resizer \
8f6ffc
+			growpart -v -v "$img" 2 2>"$err" > "$out"; then
8f6ffc
+		cat "$err" "$out"
8f6ffc
+		fail "[resizer=$resizer] growpart failed"
8f6ffc
+	fi
8f6ffc
+	echo "==== after ===="
8f6ffc
+	( cd "${TEMP_D}" && sfdisk --dump "${img##*/}" )
8f6ffc
+	echo
8f6ffc
+    echo "==== after sgdisk ==="
8f6ffc
+	( cd "${TEMP_D}" && sgdisk --print "${img##*/}" )
8f6ffc
+	echo "==== growpart-stderr ==="
8f6ffc
+	cat "$err"
8f6ffc
+	echo "==== growpart-stdout ===="
8f6ffc
+	cat "$out"
8f6ffc
+	[ "$(cat $out)" = "$expected" ] || {
8f6ffc
+        fail "[resizer=$resizer] output ^^^ did not match expected vvv:${CR}$expected"
8f6ffc
+	}
8f6ffc
+done
8f6ffc
+
8f6ffc
+# vi: ts=4 noexpandtab
8f6ffc
-- 
8f6ffc
2.17.2
8f6ffc