df0cabfa08
Related: RHEL-73220 - libparted: Fix dvh disklabel unhandled exception (bcl) Related: RHEL-73220 - tests: Add test for SUN disklabel handling (bcl) Related: RHEL-73220 - libparted: Fix sun disklabel unhandled exception (bcl) Resolves: RHEL-73220
121 lines
3.6 KiB
Diff
121 lines
3.6 KiB
Diff
From 99dd43ecbe22d69b95a322901f881db44e8a9cb9 Mon Sep 17 00:00:00 2001
|
|
From: "Brian C. Lane" <bcl@redhat.com>
|
|
Date: Wed, 8 Jan 2025 11:59:40 -0800
|
|
Subject: [PATCH 2/4] tests: Add test for SUN disklabel handling
|
|
|
|
When fixed the output from script mode should be an unknown disklabel,
|
|
not sun.
|
|
|
|
(cherry picked from commit bdb92f73112177c091a764836a9ceaa59f7e9b15)
|
|
|
|
Related: RHEL-73220
|
|
---
|
|
tests/Makefile.am | 3 ++-
|
|
tests/sun-badlabel | 42 +++++++++++++++++++++++++++++++++++++
|
|
tests/t4002-sun-badlabel.sh | 23 ++++++++++++++++++++
|
|
3 files changed, 67 insertions(+), 1 deletion(-)
|
|
create mode 100755 tests/sun-badlabel
|
|
create mode 100644 tests/t4002-sun-badlabel.sh
|
|
|
|
diff --git a/tests/Makefile.am b/tests/Makefile.am
|
|
index fa27b44..00f4a9d 100644
|
|
--- a/tests/Makefile.am
|
|
+++ b/tests/Makefile.am
|
|
@@ -67,6 +67,7 @@ TESTS = \
|
|
t3400-whole-disk-FAT-partition.sh \
|
|
t4000-sun-raid-type.sh \
|
|
t4001-sun-vtoc.sh \
|
|
+ t4002-sun-badlabel.sh \
|
|
t4100-msdos-partition-limits.sh \
|
|
t4100-dvh-partition-limits.sh \
|
|
t4100-msdos-starting-sector.sh \
|
|
@@ -103,7 +104,7 @@ TESTS = \
|
|
EXTRA_DIST = \
|
|
$(TESTS) t-local.sh t-lvm.sh \
|
|
init.cfg init.sh t-lib-helpers.sh gpt-header-munge \
|
|
- gpt-header-move msdos-overlap gpt-attrs
|
|
+ gpt-header-move msdos-overlap gpt-attrs sun-badlabel
|
|
|
|
check_PROGRAMS = print-align print-flags print-max dup-clobber duplicate \
|
|
fs-resize
|
|
diff --git a/tests/sun-badlabel b/tests/sun-badlabel
|
|
new file mode 100755
|
|
index 0000000..6a28e86
|
|
--- /dev/null
|
|
+++ b/tests/sun-badlabel
|
|
@@ -0,0 +1,42 @@
|
|
+#!/usr/bin/python3
|
|
+# Mangle the CHS values stored in a SUN disklabel
|
|
+# This sets CHS to 1 track, 2 sectors and updates the checksum
|
|
+# This triggers a bug in the SUN disklabel code when the CHS
|
|
+# error is UNHANDLED (in script mode or with a custom exception
|
|
+# handler) and it continues using a bad label which will coredump
|
|
+# when .duplicate() is called on it.
|
|
+
|
|
+import array
|
|
+from struct import unpack_from, pack_into
|
|
+import sys
|
|
+
|
|
+file = open(sys.argv[1],'rb+')
|
|
+header = file.read(512)
|
|
+
|
|
+# Make sure it looks like a SUN disklabel first
|
|
+magic = unpack_from(">H", header, 0x1FC)[0]
|
|
+if magic != 0xDABE:
|
|
+ raise RuntimeError("Not a SUN disklabel. magic = 0x%04X" % magic)
|
|
+csum = unpack_from(">H", header, 0x1FE)[0]
|
|
+ntrks = unpack_from(">H", header, 0x1B4)[0]
|
|
+nsect = unpack_from(">H", header, 0x1B6)[0]
|
|
+
|
|
+header = array.array('B', header)
|
|
+# cylinders at 0x1B0
|
|
+# modify ntrks at offset 0x1B4
|
|
+pack_into('>H', header, 0x1B4, 1)
|
|
+# modify nsect at offset 0x1B6
|
|
+pack_into('>H', header, 0x1B6, 2)
|
|
+
|
|
+## Undo old values
|
|
+csum ^= ntrks
|
|
+csum ^= nsect
|
|
+
|
|
+## Add new
|
|
+csum ^= 1
|
|
+csum ^= 2
|
|
+pack_into('>H', header, 0x1FE, csum)
|
|
+
|
|
+file.seek(0)
|
|
+file.write(header)
|
|
+file.close()
|
|
diff --git a/tests/t4002-sun-badlabel.sh b/tests/t4002-sun-badlabel.sh
|
|
new file mode 100644
|
|
index 0000000..177c0e4
|
|
--- /dev/null
|
|
+++ b/tests/t4002-sun-badlabel.sh
|
|
@@ -0,0 +1,23 @@
|
|
+#!/bin/sh
|
|
+# Test exception handling on a bad SUN disklabel
|
|
+
|
|
+. "${srcdir=.}/init.sh"; path_prepend_ ../parted $srcdir
|
|
+ss=$sector_size_
|
|
+
|
|
+n_sectors=2000 # number of sectors
|
|
+dev=sun-disk-file
|
|
+# create an empty file as a test disk
|
|
+dd if=/dev/zero of=$dev bs=$ss count=$n_sectors 2> /dev/null || fail=1
|
|
+
|
|
+# label the test disk as a sun disk
|
|
+parted -s $dev mklabel sun > out 2>&1 || fail=1
|
|
+compare /dev/null out || fail=1
|
|
+
|
|
+# Mangle the disklabel to have incorrect CHS values, but a valid checksum
|
|
+sun-badlabel $dev || fail=1
|
|
+
|
|
+# Check the output (this should return 1, but depend on checking the output for the test)
|
|
+parted -m -s $dev p > out 2>&1
|
|
+grep unknown out || { cat out; fail=1; }
|
|
+
|
|
+Exit $fail
|
|
--
|
|
2.48.1
|
|
|