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

Jim Meyering meyering at alioth.debian.org
Thu Feb 19 07:19:38 UTC 2009


 libparted/labels/gpt.c |   11 ++++++++---
 tests/Makefile.am      |    1 +
 tests/t0201-gpt.sh     |   42 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 51 insertions(+), 3 deletions(-)

New commits:
commit d53aad51bdb88458a7405ce604056ce7c0b1168c
Author: Petr Uzel <petr.uzel at suse.cz>
Date:   Wed Feb 18 14:43:36 2009 +0100

    test for the gpt_read failed-assertion fix
    
    * tests/t0201-gpt.sh: New file.
    * tests/Makefile.am (TESTS): Add it.

diff --git a/tests/Makefile.am b/tests/Makefile.am
index 14e4862..0beedd4 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -2,6 +2,7 @@ TESTS = \
   t0000-basic.sh \
   t0100-print.sh \
   t0200-gpt.sh \
+  t0201-gpt.sh \
   t1000-mkpartfs.sh \
   t1100-busy-label.sh \
   t1500-small-ext2.sh \
diff --git a/tests/t0201-gpt.sh b/tests/t0201-gpt.sh
new file mode 100755
index 0000000..0b8a970
--- /dev/null
+++ b/tests/t0201-gpt.sh
@@ -0,0 +1,42 @@
+#!/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='avoid failed assertion when creating a GPT on top of an old one for a larger device'
+
+: ${srcdir=.}
+. $srcdir/test-lib.sh
+
+dev=loop-file
+test_expect_success \
+    'create a backing file large enough for a GPT partition table' \
+    'dd if=/dev/null of=$dev seek=4001 2> /dev/null'
+
+test_expect_success \
+    'create a GPT partition table' \
+    'parted -s $dev mklabel gpt > out 2>&1'
+test_expect_success 'expect no output' 'compare out /dev/null'
+
+test_expect_success \
+    'shrink the backing file' \
+    'dd if=/dev/null of=$dev seek=4000 2> /dev/null'
+
+test_expect_success \
+    'create a new GPT table on top of the shrunken backing file' \
+    'parted -s $dev mklabel gpt > out 2>&1'
+test_expect_success 'expect no output' 'compare out /dev/null'
+
+test_done

commit 554087b39ee0f8cd67b60dccbac9c16206e6bc40
Author: Jim Meyering <meyering at redhat.com>
Date:   Mon Feb 16 19:02:58 2009 +0100

    avoid failed assertion when creating a GPT partition table...
    
    on top of an old one for a larger device
    
    * libparted/labels/gpt.c (gpt_read): Don't assert that the location
    of the alternate LBA is within the current device.  It will be
    beyond its end when the device it was created for was larger.
    Instead, just return, treating this like any other non-match.
    
    Here's the reproducer:
    
      dev=file
      dd     of=$dev if=/dev/null seek=4001
      parted -s $dev mklabel gpt
      dd     of=$dev if=/dev/null seek=4000
      parted -s $dev mklabel gpt

diff --git a/libparted/labels/gpt.c b/libparted/labels/gpt.c
index eea562d..ae74123 100644
--- a/libparted/labels/gpt.c
+++ b/libparted/labels/gpt.c
@@ -4,7 +4,7 @@
     original version by Matt Domsch <Matt_Domsch at dell.com>
     Disclaimed into the Public Domain
 
-    Portions Copyright (C) 2001-2003, 2005-2008 Free Software Foundation, Inc.
+    Portions Copyright (C) 2001-2003, 2005-2009 Free Software Foundation, Inc.
 
     EFI GUID Partition Table handling
     Per Intel EFI Specification v1.02
@@ -824,8 +824,13 @@ gpt_read (PedDisk * disk)
 		goto error;
 
 	if (_read_header (disk->dev, &gpt, 1)) {
-		PED_ASSERT ((PedSector) PED_LE64_TO_CPU (gpt->AlternateLBA)
-				<= disk->dev->length - 1, goto error_free_gpt);
+		/* There used to be a GPT partition table here, with an
+		   alternate LBA that extended beyond the current
+		   end-of-device.  Treat it as a non-match.   */
+		if ((PedSector) PED_LE64_TO_CPU (gpt->AlternateLBA)
+                    > disk->dev->length - 1)
+			goto error_free_gpt;
+
 		if ((PedSector) PED_LE64_TO_CPU (gpt->AlternateLBA)
 				< disk->dev->length - 1) {
 			char* zeros = ped_malloc (pth_get_size (disk->dev));



More information about the Parted-commits mailing list