diff options
author | Alan Somers <asomers@FreeBSD.org> | 2022-11-09 02:59:50 +0000 |
---|---|---|
committer | Alan Somers <asomers@FreeBSD.org> | 2022-11-09 17:21:12 +0000 |
commit | 05d0f4308caaa3e9b8cbcbb30b2d7f39dd367a57 (patch) | |
tree | 4853775d1ce4dde77d28b78b4518ba969e90eb1d | |
parent | 817f1f3064db25f821032c8fffb131183206bba1 (diff) | |
download | src-05d0f4308caaa3e9b8cbcbb30b2d7f39dd367a57.tar.gz src-05d0f4308caaa3e9b8cbcbb30b2d7f39dd367a57.zip |
Don't panic when tasting a disk with sectorsize=0
This can sometimes happen with broken HDDs.
MFC after: 2 weeks
Sponsored by: Axcient
Reviewed by: markj
Differential Revision: https://reviews.freebsd.org/D37313
-rw-r--r-- | sys/geom/label/g_label.c | 4 | ||||
-rw-r--r-- | sys/geom/label/g_label_ext2fs.c | 5 | ||||
-rw-r--r-- | sys/geom/label/g_label_iso9660.c | 5 | ||||
-rw-r--r-- | sys/geom/label/g_label_reiserfs.c | 5 | ||||
-rw-r--r-- | sys/geom/label/g_label_ufs.c | 1 |
5 files changed, 14 insertions, 6 deletions
diff --git a/sys/geom/label/g_label.c b/sys/geom/label/g_label.c index 2244931cd19b..8f6ac38179a6 100644 --- a/sys/geom/label/g_label.c +++ b/sys/geom/label/g_label.c @@ -394,6 +394,10 @@ g_label_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) if (pp->acw > 0) return (NULL); + /* Skip broken disks that don't set their sector size */ + if (pp->sectorsize == 0) + return (NULL); + if (strcmp(pp->geom->class->name, mp->name) == 0) return (NULL); diff --git a/sys/geom/label/g_label_ext2fs.c b/sys/geom/label/g_label_ext2fs.c index 3420efb7ca3a..0f21de1ce313 100644 --- a/sys/geom/label/g_label_ext2fs.c +++ b/sys/geom/label/g_label_ext2fs.c @@ -62,10 +62,11 @@ g_label_ext2fs_taste(struct g_consumer *cp, char *label, size_t size) pp = cp->provider; label[0] = '\0'; - if ((EXT2FS_SB_OFFSET % pp->sectorsize) != 0) - return; + KASSERT(pp->sectorsize != 0, ("Tasting a disk with 0 sectorsize")); if (pp->sectorsize < sizeof(*fs)) return; + if ((EXT2FS_SB_OFFSET % pp->sectorsize) != 0) + return; fs = g_read_data(cp, EXT2FS_SB_OFFSET, pp->sectorsize, NULL); if (fs == NULL) diff --git a/sys/geom/label/g_label_iso9660.c b/sys/geom/label/g_label_iso9660.c index b46a47bbd36a..1ac7283b34e6 100644 --- a/sys/geom/label/g_label_iso9660.c +++ b/sys/geom/label/g_label_iso9660.c @@ -52,10 +52,11 @@ g_label_iso9660_taste(struct g_consumer *cp, char *label, size_t size) pp = cp->provider; label[0] = '\0'; - if ((ISO9660_OFFSET % pp->sectorsize) != 0) - return; + KASSERT(pp->sectorsize != 0, ("Tasting a disk with 0 sectorsize")); if (pp->sectorsize < 0x28 + VOLUME_LEN) return; + if ((ISO9660_OFFSET % pp->sectorsize) != 0) + return; sector = g_read_data(cp, ISO9660_OFFSET, pp->sectorsize, NULL); if (sector == NULL) return; diff --git a/sys/geom/label/g_label_reiserfs.c b/sys/geom/label/g_label_reiserfs.c index d6f9a0428b6a..8fe1a72458e4 100644 --- a/sys/geom/label/g_label_reiserfs.c +++ b/sys/geom/label/g_label_reiserfs.c @@ -59,10 +59,11 @@ g_label_reiserfs_read_super(struct g_consumer *cp, off_t offset) secsize = cp->provider->sectorsize; - if ((offset % secsize) != 0) - return (NULL); + KASSERT(secsize != 0, ("Tasting a disk with 0 sectorsize")); if (secsize < sizeof(*fs)) return (NULL); + if ((offset % secsize) != 0) + return (NULL); fs = g_read_data(cp, offset, secsize, NULL); if (fs == NULL) diff --git a/sys/geom/label/g_label_ufs.c b/sys/geom/label/g_label_ufs.c index 691f875cf6cc..9f22427666e9 100644 --- a/sys/geom/label/g_label_ufs.c +++ b/sys/geom/label/g_label_ufs.c @@ -139,6 +139,7 @@ g_label_ufs_taste_common(struct g_consumer *cp, char *label, size_t size, int wh label[0] = '\0'; fs = NULL; + KASSERT(pp->sectorsize != 0, ("Tasting a disk with 0 sectorsize")); if (SBLOCKSIZE % pp->sectorsize != 0 || ffs_sbget(cp, &fs, UFS_STDSB, UFS_NOHASHFAIL | UFS_NOCSUM | UFS_NOMSG, M_GEOM, g_use_g_read_data) != 0) { |