summaryrefslogtreecommitdiffstats
path: root/sys/geom
diff options
context:
space:
mode:
authorae <ae@FreeBSD.org>2011-05-08 12:16:39 +0000
committerae <ae@FreeBSD.org>2011-05-08 12:16:39 +0000
commit37c4b4161f69961dbcefc2220e7a0468fb4d1387 (patch)
tree4ff154d91f63bb535cba4a0bff0694937918f505 /sys/geom
parent03c359efa661788b5abc31e5eb82f230991d27bb (diff)
downloadFreeBSD-src-37c4b4161f69961dbcefc2220e7a0468fb4d1387.zip
FreeBSD-src-37c4b4161f69961dbcefc2220e7a0468fb4d1387.tar.gz
Limit number of sectors that can be addressed.
Reject table if blkcount from metadata is greater than provider.
Diffstat (limited to 'sys/geom')
-rw-r--r--sys/geom/part/g_part_apm.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/sys/geom/part/g_part_apm.c b/sys/geom/part/g_part_apm.c
index 9806bb8..cd318c7 100644
--- a/sys/geom/part/g_part_apm.c
+++ b/sys/geom/part/g_part_apm.c
@@ -255,7 +255,7 @@ g_part_apm_create(struct g_part_table *basetable, struct g_part_parms *gpp)
return (ENOSPC);
/* APM uses 32-bit LBAs. */
- last = MIN(pp->mediasize / pp->sectorsize, 0xffffffff) - 1;
+ last = MIN(pp->mediasize / pp->sectorsize, UINT32_MAX) - 1;
basetable->gpt_first = 2 + basetable->gpt_entries;
basetable->gpt_last = last;
@@ -398,6 +398,8 @@ g_part_apm_probe(struct g_part_table *basetable, struct g_consumer *cp)
g_free(buf);
if (table->ddr.ddr_blksize != pp->sectorsize)
return (ENXIO);
+ if (table->ddr.ddr_blkcount > pp->mediasize / pp->sectorsize)
+ return (ENXIO);
} else {
/*
* Check for Tivo drives, which have no DDR and a different
@@ -412,7 +414,8 @@ g_part_apm_probe(struct g_part_table *basetable, struct g_consumer *cp)
}
table->ddr.ddr_sig = APM_DDR_SIG; /* XXX */
table->ddr.ddr_blksize = pp->sectorsize; /* XXX */
- table->ddr.ddr_blkcount = pp->mediasize / pp->sectorsize;/* XXX */
+ table->ddr.ddr_blkcount =
+ MIN(pp->mediasize / pp->sectorsize, UINT32_MAX);
table->tivo_series1 = 1;
g_free(buf);
}
OpenPOWER on IntegriCloud