summaryrefslogtreecommitdiffstats
path: root/libblkid/src/superblocks
diff options
context:
space:
mode:
authorNate Clark2017-01-04 21:24:32 +0100
committerNate Clark2017-01-04 21:24:32 +0100
commitf82c804869bb8613fa0924e3111b7eb55bb04fcd (patch)
tree393878acf5ecc1e31f626359bbd3d1257fcd90ab /libblkid/src/superblocks
parentlibblkid/minix: Match minix superblock types (diff)
downloadkernel-qcow2-util-linux-f82c804869bb8613fa0924e3111b7eb55bb04fcd.tar.gz
kernel-qcow2-util-linux-f82c804869bb8613fa0924e3111b7eb55bb04fcd.tar.xz
kernel-qcow2-util-linux-f82c804869bb8613fa0924e3111b7eb55bb04fcd.zip
libblkid/minix: Use same checks for version 3
fsck.minix performs the same sanity checks on all versions of the superblock. Update the probe to perform the same sanity checks so it is less likely a different type of filesystem will be identified as minix. Signed-off-by: Nate Clark <nate@neworld.us>
Diffstat (limited to 'libblkid/src/superblocks')
-rw-r--r--libblkid/src/superblocks/minix.c37
1 files changed, 23 insertions, 14 deletions
diff --git a/libblkid/src/superblocks/minix.c b/libblkid/src/superblocks/minix.c
index 628b246ee..3e126e0ea 100644
--- a/libblkid/src/superblocks/minix.c
+++ b/libblkid/src/superblocks/minix.c
@@ -87,14 +87,12 @@ static int probe_minix(blkid_probe pr,
if (version < 1)
return 1;
+ unsigned long zones, ninodes, imaps, zmaps;
+ off_t firstz;
+ size_t zone_size;
+
if (version <= 2) {
struct minix_super_block *sb = (struct minix_super_block *) data;
- unsigned long zones, ninodes, imaps, zmaps;
- off_t firstz;
-
- if (sb->s_imap_blocks == 0 || sb->s_zmap_blocks == 0 ||
- sb->s_log_zone_size != 0)
- return 1;
zones = version == 2 ? minix_swab32(swabme, sb->s_zones) :
minix_swab16(swabme, sb->s_nzones);
@@ -102,19 +100,30 @@ static int probe_minix(blkid_probe pr,
imaps = minix_swab16(swabme, sb->s_imap_blocks);
zmaps = minix_swab16(swabme, sb->s_zmap_blocks);
firstz = minix_swab16(swabme, sb->s_firstdatazone);
-
- /* sanity checks to be sure that the FS is really minix */
- if (imaps * MINIX_BLOCK_SIZE * 8 < ninodes + 1)
- return 1;
- if (zmaps * MINIX_BLOCK_SIZE * 8 < zones - firstz + 1)
- return 1;
+ zone_size = sb->s_log_zone_size;
} else if (version == 3) {
struct minix3_super_block *sb = (struct minix3_super_block *) data;
- if (sb->s_imap_blocks == 0 || sb->s_zmap_blocks == 0)
- return 1;
+ zones = minix_swab32(swabme, sb->s_zones);
+ ninodes = minix_swab32(swabme, sb->s_ninodes);
+ imaps = minix_swab16(swabme, sb->s_imap_blocks);
+ zmaps = minix_swab16(swabme, sb->s_zmap_blocks);
+ firstz = minix_swab16(swabme, sb->s_firstdatazone);
+ zone_size = sb->s_log_zone_size;
}
+ /* sanity checks to be sure that the FS is really minix.
+ * see disk-utils/fsck.minix.c read_superblock
+ */
+ if (zone_size != 0 || ninodes == 0 || ninodes == UINT32_MAX)
+ return 1;
+ if (imaps * MINIX_BLOCK_SIZE * 8 < ninodes + 1)
+ return 1;
+ if (firstz > (off_t) zones)
+ return 1;
+ if (zmaps * MINIX_BLOCK_SIZE * 8 < zones - firstz + 1)
+ return 1;
+
/* unfortunately, some parts of ext3 is sometimes possible to
* interpreted as minix superblock. So check for extN magic
* string. (For extN magic string and offsets see ext.c.)