[Parted-commits] GNU Parted Official Repository: Changes to 'master'

Jim Meyering meyering at alioth.debian.org
Mon Oct 19 12:58:10 UTC 2009


 libparted/arch/linux.c     |   10 +---
 libparted/labels/gpt.c     |   16 +++++--
 tests/t0280-gpt-corrupt.sh |   95 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 111 insertions(+), 10 deletions(-)

New commits:
commit f6859f2fcbcf18a069a0495cbb8bd2baf395e74d
Author: Jim Meyering <meyering at redhat.com>
Date:   Wed Oct 14 20:53:48 2009 +0200

    libparted: weaken a diagnostic
    
    * libparted/arch/linux.c (_kernel_reread_part_table): Give a more
    accurate diagnostic.  Reported by Curtis Gedak.

diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
index 6a3c6b3..094e8d2 100644
--- a/libparted/arch/linux.c
+++ b/libparted/arch/linux.c
@@ -2450,12 +2450,10 @@ _kernel_reread_part_table (PedDevice* dev)
                         ped_exception_throw (
                                 PED_EXCEPTION_WARNING,
                                 PED_EXCEPTION_IGNORE,
-                        _("The kernel was unable to re-read the partition "
-                          "table on %s (%s).  This means Linux won't know "
-                          "anything about the modifications you made "
-                          "until you reboot.  You should reboot your computer "
-                          "before doing anything with %s."),
-                                dev->path, strerror (errno), dev->path);
+                        _("WARNING: the kernel failed to re-read the partition "
+                          "table on %s (%s).  As a result, it may not "
+                          "reflect all of your changes until after reboot."),
+                                dev->path, strerror (errno));
                         return 0;
                 }
         }

commit 33fbfd9f1cd09c96e0e04a6723fe6f7bc9a33f9e
Author: Jim Meyering <meyering at redhat.com>
Date:   Wed Oct 14 20:50:39 2009 +0200

    gpt: verify CRC32 of partition table entry array, too
    
    The partition table entry array's CRC was not being verified at all.
    This adds an interim check.  The full-blown change required to make
    this implementation conform to the EFI spec will be more invasive.
    * libparted/labels/gpt.c (gpt_read): Check CRC of PTE array, too.
    * tests/t0280-gpt-corrupt.sh: New test for this.
    Reported by Karel Zak.

diff --git a/libparted/labels/gpt.c b/libparted/labels/gpt.c
index 3f4edf7..7fa70d5 100644
--- a/libparted/labels/gpt.c
+++ b/libparted/labels/gpt.c
@@ -819,7 +819,6 @@ gpt_read (PedDisk * disk)
 	GPTDiskData *gpt_disk_data = disk->disk_specific;
 	GuidPartitionTableHeader_t* gpt;
 	void* ptes;
-	size_t ptes_sectors;
 	int i;
 #ifndef DISCOVER_ONLY
 	int write_back = 0;
@@ -914,9 +913,9 @@ gpt_read (PedDisk * disk)
 		goto error_free_gpt;
 
 	uint32_t p_ent_size = PED_LE32_TO_CPU (gpt->SizeOfPartitionEntry);
-	ptes_sectors = ped_div_round_up (p_ent_size
-					 * gpt_disk_data->entry_count,
-					 disk->dev->sector_size);
+	size_t ptes_bytes = p_ent_size * gpt_disk_data->entry_count;
+	size_t ptes_sectors = ped_div_round_up (ptes_bytes,
+						disk->dev->sector_size);
 
 	if (xalloc_oversized (ptes_sectors, disk->dev->sector_size))
 		goto error_free_gpt;
@@ -927,6 +926,15 @@ gpt_read (PedDisk * disk)
 			      ptes_sectors))
 		goto error_free_ptes;
 
+	uint32_t ptes_crc = efi_crc32 (ptes, ptes_bytes);
+	if (ptes_crc != gpt->PartitionEntryArrayCRC32) {
+		ped_exception_throw (
+			PED_EXCEPTION_ERROR,
+			PED_EXCEPTION_CANCEL,
+			_("partition table array (FIXME:which?) CRC mismatch"));
+		goto error_free_ptes;
+        }
+
 	for (i = 0; i < gpt_disk_data->entry_count; i++) {
 		GuidPartitionEntry_t* pte
 		  = (GuidPartitionEntry_t*) ((char *)ptes + i * p_ent_size);
diff --git a/tests/t0280-gpt-corrupt.sh b/tests/t0280-gpt-corrupt.sh
new file mode 100755
index 0000000..89ab818
--- /dev/null
+++ b/tests/t0280-gpt-corrupt.sh
@@ -0,0 +1,95 @@
+#!/bin/sh
+
+# Copyright (C) 2009 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
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+test_description="corrupt a GPT table; ensure parted takes notice"
+
+peek()
+{
+  case $# in 2) ;; *) echo "usage: peek FILE 0_BASED_OFFSET" >&2; exit 1;; esac
+  case $2 in *[^0-9]*) echo "peek: invalid offset: $2"; exit 1 ;; esac
+  dd if="$1" bs=1 skip="$2" count=1
+}
+
+poke()
+{
+  case $# in 3) ;; *) echo "usage: poke FILE 0_BASED_OFFSET BYTE" >&2; exit 1;;
+    esac
+  case $2 in *[^0-9]*) echo "poke: invalid offset: $2"; exit 1 ;; esac
+  case $3 in ?) ;; *) echo "poke: invalid byte: '$3'"; exit 1 ;; esac
+  printf %s "$3" | dd of="$1" bs=1 seek="$2" count=1 conv=notrunc
+}
+
+: ${srcdir=.}
+. $srcdir/test-lib.sh
+
+dev=loop-file
+
+ss=$sector_size_
+n_sectors=200
+
+test_expect_success \
+    "setup: create zeroed device" \
+    'dd if=/dev/null of=$dev bs=$ss seek=$n_sectors'
+
+test_expect_success \
+    'create gpt label' \
+    'parted -s $dev mklabel gpt > empty 2>&1'
+test_expect_success 'expect no output' 'compare /dev/null empty'
+
+test_expect_success \
+    'print the empty table' \
+    'parted -m -s $dev unit s print > t 2>&1 &&
+     sed 's,.*/$dev:,$dev:,' t > out'
+
+test_expect_success \
+    'check for expected output' \
+    'printf "BYT;\n$dev:${n_sectors}s:file:$sector_size_:$sector_size_:gpt:;\n"\
+       > exp &&
+     compare exp out'
+
+test_expect_success \
+    'create a partition' \
+    'parted -s $dev mkpart sw linux-swap 60s 100s > empty 2>&1'
+test_expect_success 'expect no output' 'compare /dev/null empty'
+
+# We're going to change the name of the first partition,
+# thus invalidating the PartitionEntryArrayCRC32 checksum.
+
+# byte 56 of the partition entry is the first byte of its 72-byte name field
+pte_offset=$(expr $ss \* 2 + 56)
+
+test_expect_success \
+    'get the first byte of the name' \
+    'pte_byte=$(peek $dev $pte_offset)'
+
+test x"$pte_byte" = xA && new_byte=B || new_byte=A
+
+test_expect_success \
+    'Replace with a different byte' \
+    'poke $dev $pte_offset "$new_byte"'
+
+test_expect_success \
+    'try to print the table' \
+    'parted -s $dev print > err 2>&1;
+     test $? = 1'
+
+test_expect_success \
+    'check for expected diagnostic' \
+    'echo "Error: partition table array CRC mismatch" > exp &&
+     compare exp err'
+
+test_done



More information about the Parted-commits mailing list