Author: ae
Date: Tue Jul 21 06:18:42 2015
New Revision: 285735
URL: https://svnweb.freebsd.org/changeset/base/285735

Log:
  lseek() allows an offset to be set beyond the end of file. Using
  it to check that partition has enough space to write bootcode doesn't
  work. Use the known size of provider instead.
  
  PR:           201504
  MFC after:    1 week

Modified:
  head/sbin/geom/class/part/geom_part.c

Modified: head/sbin/geom/class/part/geom_part.c
==============================================================================
--- head/sbin/geom/class/part/geom_part.c       Tue Jul 21 05:03:59 2015        
(r285734)
+++ head/sbin/geom/class/part/geom_part.c       Tue Jul 21 06:18:42 2015        
(r285735)
@@ -1106,14 +1106,11 @@ gpart_write_partcode(struct ggeom *gp, i
 
        if (pp != NULL) {
                snprintf(dsf, sizeof(dsf), "/dev/%s", pp->lg_name);
+               if (pp->lg_mediasize < size)
+                       errx(EXIT_FAILURE, "%s: not enough space", dsf);
                fd = open(dsf, O_WRONLY);
                if (fd == -1)
                        err(EXIT_FAILURE, "%s", dsf);
-               if (lseek(fd, size, SEEK_SET) != size)
-                       errx(EXIT_FAILURE, "%s: not enough space", dsf);
-               if (lseek(fd, 0, SEEK_SET) != 0)
-                       err(EXIT_FAILURE, "%s", dsf);
-
                /*
                 * When writing to a disk device, the write must be
                 * sector aligned and not write to any partial sectors,
@@ -1152,11 +1149,11 @@ gpart_write_partcode_vtoc8(struct ggeom 
                if (pp->lg_sectorsize != sizeof(struct vtoc8))
                        errx(EXIT_FAILURE, "%s: unexpected sector "
                            "size (%d)\n", dsf, pp->lg_sectorsize);
+               if (pp->lg_mediasize < VTOC_BOOTSIZE)
+                       continue;
                fd = open(dsf, O_WRONLY);
                if (fd == -1)
                        err(EXIT_FAILURE, "%s", dsf);
-               if (lseek(fd, VTOC_BOOTSIZE, SEEK_SET) != VTOC_BOOTSIZE)
-                       continue;
                /*
                 * We ignore the first VTOC_BOOTSIZE bytes of boot code in
                 * order to avoid overwriting the label.
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to