Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 8 Apr 2011 21:34:15 +0200
From:      Hans Petter Selasky <hselasky@c2i.net>
To:        "freebsd-current@FreeBSD.org" <freebsd-current@freebsd.org>
Subject:   Fdisk formatting of disk having bs=1K fails
Message-ID:  <201104082134.15674.hselasky@c2i.net>

next in thread | raw e-mail | index | archive | help
Hi,

It appears that src/sbin/fdisk.c can only read the MBR of disks having a 
blocksize different than 512 bytes. When writing a new MBR, the below check 
fails. Can someone having knowledge into fdisk, fix this issue and MFC to 8-
stable? Also I'm curious about the #ifdef __ia64__ .

if ((mboot.bootinst_size = sb.st_size) % secsize != 0)

secsize = 1024;
sb.st_size = sizeof(/boot/mbr) = 512;

--HPS

My attempt to fix this issue:

--- fdisk.c     (revision 220305)
+++ fdisk.c     (local)
@@ -508,22 +508,29 @@
        const char *fname;
        int fdesc, n;
        struct stat sb;
+       off_t align_size;
 
        fname = b_flag ? b_flag : "/boot/mbr";
        if ((fdesc = open(fname, O_RDONLY)) == -1 ||
            fstat(fdesc, &sb) == -1)
                err(1, "%s", fname);
-       if ((mboot.bootinst_size = sb.st_size) % secsize != 0)
-               errx(1, "%s: length must be a multiple of sector size", 
fname);
+
+       align_size = (sb.st_size + secsize - 1);
+       align_size -= align_size % secsize;
+       if (align_size == 0)
+               errx(1, "%s: length must be non-zero", fname);
+       mboot.bootinst_size = align_size;
        if (mboot.bootinst != NULL)
                free(mboot.bootinst);
-       if ((mboot.bootinst = malloc(mboot.bootinst_size = sb.st_size)) == 
NULL)
+       if ((mboot.bootinst = malloc(align_size)) == NULL)
                errx(1, "%s: unable to allocate read buffer", fname);
-       if ((n = read(fdesc, mboot.bootinst, mboot.bootinst_size)) == -1 ||
+       if ((n = read(fdesc, mboot.bootinst, sb.st_size)) == -1 ||
            close(fdesc))
                err(1, "%s", fname);
-       if (n != mboot.bootinst_size)
+       if (n != sb.st_size)
                errx(1, "%s: short read", fname);
+       if (align_size != n)
+               memset(mboot.bootinst + sb.st_size, 0, align_size - 
sb.st_size);
 #else
        if (mboot.bootinst != NULL)
                free(mboot.bootinst);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201104082134.15674.hselasky>