summaryrefslogtreecommitdiffstats
path: root/sbin
diff options
context:
space:
mode:
authorae <ae@FreeBSD.org>2015-07-28 08:22:50 +0000
committerae <ae@FreeBSD.org>2015-07-28 08:22:50 +0000
commit76b23ad9233a2cab90f418b48b8d644dd41682c7 (patch)
tree97360a3b76ffd6721a7185cfc5d09f416234e2a8 /sbin
parent76e00b9ec32a3cae1b057d7276283134d767ec4c (diff)
downloadFreeBSD-src-76b23ad9233a2cab90f418b48b8d644dd41682c7.zip
FreeBSD-src-76b23ad9233a2cab90f418b48b8d644dd41682c7.tar.gz
MFC r285735:
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
Diffstat (limited to 'sbin')
-rw-r--r--sbin/geom/class/part/geom_part.c11
1 files changed, 4 insertions, 7 deletions
diff --git a/sbin/geom/class/part/geom_part.c b/sbin/geom/class/part/geom_part.c
index 83e0b11..521ac23 100644
--- a/sbin/geom/class/part/geom_part.c
+++ b/sbin/geom/class/part/geom_part.c
@@ -1095,14 +1095,11 @@ gpart_write_partcode(struct ggeom *gp, int idx, void *code, ssize_t size)
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,
@@ -1141,11 +1138,11 @@ gpart_write_partcode_vtoc8(struct ggeom *gp, int idx, void *code)
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.
OpenPOWER on IntegriCloud