Package: util-linux
Version: 2.20.1-4
Severity: important
Tags: upstream patch fixed-upstream

Hi,

Please consider the following patch for sid and squeeze.  At my
workplace we have had something like this patch applied for the past
couple of years, until we upgraded to squeeze and experienced the bug
again. :)  If you have any questions, please don't hesitate to ask.

The patch is commit 9c45d49fe01c upstream.

Thanks,
Jonathan

-- >8 --
From: Petr Uzel <petr.u...@suse.cz>
Date: Fri, 6 Apr 2012 16:53:13 +0200
Subject: sfdisk: fix calculation due to type mismatch (ix86)

Instructing sfdisk to create one partition spanning
across entire disk (",,") on 32bit system, if the disk
is sufficiently large (~2TB) leads to wrong calculation
in compute_start_sect() due to type mismatch.

Can be reproduced as:

--------------------------
linux-3ln5:~ # modprobe scsi_debug virtual_gb=2000
linux-3ln5:~ # sfdisk /dev/sda <<< ',,'
Checking that no-one is using this disk right now ...
OK

Disk /dev/sda: 261083 cylinders, 255 heads, 63 sectors/track

sfdisk: ERROR: sector 0 does not have an msdos signature
sfdisk:  /dev/sda: unrecognized partition table type

Old situation:
sfdisk: No partitions found

no room for partition descriptor
sfdisk: bad input
--------------------------

Addresses: https://bugzilla.novell.com/show_bug.cgi?id=754789
Reported-by: Dan Mares <dan.ma...@norcrossgroup.com>
Signed-off-by: Petr Uzel <petr.u...@suse.cz>
Signed-off-by: Jonathan Nieder <jrnie...@gmail.com>
---
 fdisk/sfdisk.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/fdisk/sfdisk.c b/fdisk/sfdisk.c
index 2729af18..eb2efe85 100644
--- a/fdisk/sfdisk.c
+++ b/fdisk/sfdisk.c
@@ -1995,7 +1995,7 @@ static int
 compute_start_sect(struct part_desc *p, struct part_desc *ep) {
     unsigned long long base;
     int inc = (DOS && B.sectors) ? B.sectors : 1;
-    int delta;
+    long long delta;
 
     if (ep && p->start + p->size >= ep->start + 1)
        delta = p->start - ep->start - inc;
@@ -2010,7 +2010,7 @@ compute_start_sect(struct part_desc *p, struct part_desc 
*ep) {
        p->size += delta;
        if (is_extended(p->p.sys_type) && boxes == ONESECTOR)
            p->size = inc;
-       else if ((ssize_t) old_size <= (ssize_t) - delta) {
+       else if ((long long) old_size <= -delta) {
            my_warn(_("no room for partition descriptor\n"));
            return 0;
        }
-- 
1.7.10




-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to