diff --git a/sys/geom/label/g_label_ufs.c b/sys/geom/label/g_label_ufs.c index dc188f7a6939..d15cbec0471a 100644 --- a/sys/geom/label/g_label_ufs.c +++ b/sys/geom/label/g_label_ufs.c @@ -60,6 +60,16 @@ g_label_ufs_taste(struct g_consumer *cp, char *label, size_t size) * provider based on that. */ for (sb = 0; (superblock = superblocks[sb]) != -1; sb++) { + /* + * Take care not to issue an invalid I/O request. The + * offset and size of the superblock candidate must be + * multiples of the provider's sector size, otherwise an + * FFS can't exist on the provider anyway. + */ + if (superblock % cp->provider->sectorsize != 0 || + SBLOCKSIZE % cp->provider->sectorsize != 0) + continue; + fs = (struct fs *)g_read_data(cp, superblock, SBLOCKSIZE, &error); if (fs == NULL || error != 0)