volume_id: abort early on read failures. should help with probing missing fdd's
No binary (build failed)
—
(log yok)
| @@ -35,8 +35,9 @@ struct cramfs_super { | |
| uint8_t name[16]; | |
| } __attribute__((__packed__)); | |
| - | int volume_id_probe_cramfs(struct volume_id *id, uint64_t off) |
| + | int volume_id_probe_cramfs(struct volume_id *id /*,uint64_t off*/) |
| { | |
| + | #define off ((uint64_t)0) |
| struct cramfs_super *cs; | |
| dbg("probing at offset 0x%llx", (unsigned long long) off); | |
| @@ -43,8 +43,9 @@ struct ext2_super_block { | |
| #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x00000008 | |
| #define EXT_SUPERBLOCK_OFFSET 0x400 | |
| - | int volume_id_probe_ext(struct volume_id *id, uint64_t off) |
| + | int volume_id_probe_ext(struct volume_id *id /*,uint64_t off*/) |
| { | |
| + | #define off ((uint64_t)0) |
| struct ext2_super_block *es; | |
| dbg("ext: probing at offset 0x%llx", (unsigned long long) off); | |
| @@ -119,8 +119,9 @@ static uint8_t *get_attr_volume_id(struct vfat_dir_entry *dir, int count) | |
| return NULL; | |
| } | |
| - | int volume_id_probe_vfat(struct volume_id *id, uint64_t fat_partition_off) |
| + | int volume_id_probe_vfat(struct volume_id *id /*,uint64_t fat_partition_off*/) |
| { | |
| + | #define fat_partition_off ((uint64_t)0) |
| struct vfat_super_block *vs; | |
| struct vfat_dir_entry *dir; | |
| uint16_t sector_size_bytes; | |
| @@ -37,7 +37,7 @@ get_label_uuid(int fd, char **label, char **uuid) | |
| if (ioctl(/*vid->*/fd, BLKGETSIZE64, &size) != 0) | |
| size = 0; | |
| - | if (volume_id_probe_all(vid, 0, size) != 0) |
| + | if (volume_id_probe_all(vid, /*0,*/ size) != 0) |
| goto ret; | |
| if (vid->label[0] != '\0' || vid->uuid[0] != '\0') { | |
| @@ -131,8 +131,9 @@ struct hfsplus_vol_header { | |
| #define HFS_NODE_LEAF 0xff | |
| #define HFSPLUS_POR_CNID 1 | |
| - | int volume_id_probe_hfs_hfsplus(struct volume_id *id, uint64_t off) |
| + | int volume_id_probe_hfs_hfsplus(struct volume_id *id /*,uint64_t off*/) |
| { | |
| + | uint64_t off = 0; |
| unsigned blocksize; | |
| unsigned cat_block; | |
| unsigned ext_block_start; | |
| @@ -47,8 +47,9 @@ struct high_sierra_volume_descriptor { | |
| uint8_t version; | |
| } __attribute__((__packed__)); | |
| - | int volume_id_probe_iso9660(struct volume_id *id, uint64_t off) |
| + | int volume_id_probe_iso9660(struct volume_id *id /*,uint64_t off*/) |
| { | |
| + | #define off ((uint64_t)0) |
| uint8_t *buf; | |
| struct iso_volume_descriptor *is; | |
| struct high_sierra_volume_descriptor *hs; | |
| @@ -35,8 +35,9 @@ struct jfs_super_block { | |
| #define JFS_SUPERBLOCK_OFFSET 0x8000 | |
| - | int volume_id_probe_jfs(struct volume_id *id, uint64_t off) |
| + | int volume_id_probe_jfs(struct volume_id *id /*,uint64_t off*/) |
| { | |
| + | #define off ((uint64_t)0) |
| struct jfs_super_block *js; | |
| dbg("probing at offset 0x%llx", (unsigned long long) off); | |
| @@ -42,8 +42,9 @@ struct mdp_super_block { | |
| #define MD_RESERVED_BYTES 0x10000 | |
| #define MD_MAGIC 0xa92b4efc | |
| - | int volume_id_probe_linux_raid(struct volume_id *id, uint64_t off, uint64_t size) |
| + | int volume_id_probe_linux_raid(struct volume_id *id /*,uint64_t off*/, uint64_t size) |
| { | |
| + | #define off ((uint64_t)0) |
| uint64_t sboff; | |
| uint8_t uuid[16]; | |
| struct mdp_super_block *mdp; | |
| @@ -31,8 +31,9 @@ struct swap_header_v1_2 { | |
| #define LARGEST_PAGESIZE 0x4000 | |
| - | int volume_id_probe_linux_swap(struct volume_id *id, uint64_t off) |
| + | int volume_id_probe_linux_swap(struct volume_id *id /*,uint64_t off*/) |
| { | |
| + | #define off ((uint64_t)0) |
| struct swap_header_v1_2 *sw; | |
| const uint8_t *buf; | |
| unsigned page; | |
| @@ -80,8 +80,9 @@ struct BUG_bad_size_luks_phdr { | |
| 1 : -1]; | |
| }; | |
| - | int volume_id_probe_luks(struct volume_id *id, uint64_t off) |
| + | int volume_id_probe_luks(struct volume_id *id /*,uint64_t off*/) |
| { | |
| + | #define off ((uint64_t)0) |
| struct luks_phdr *header; | |
| header = volume_id_get_buffer(id, off, sizeof(*header)); | |
| @@ -84,8 +84,9 @@ struct volume_info { | |
| #define MFT_RECORD_ATTR_OBJECT_ID 0x40 | |
| #define MFT_RECORD_ATTR_END 0xffffffffu | |
| - | int volume_id_probe_ntfs(struct volume_id *id, uint64_t off) |
| + | int volume_id_probe_ntfs(struct volume_id *id /*,uint64_t off*/) |
| { | |
| + | #define off ((uint64_t)0) |
| unsigned sector_size; | |
| unsigned cluster_size; | |
| uint64_t mft_cluster; | |
| @@ -80,8 +80,9 @@ struct ocfs2_super_block { | |
| uint8_t s_uuid[OCFS2_VOL_UUID_LEN]; /* 128-bit uuid */ | |
| } __attribute__((__packed__)); | |
| - | int volume_id_probe_ocfs2(struct volume_id *id, uint64_t off) |
| + | int volume_id_probe_ocfs2(struct volume_id *id /*,uint64_t off*/) |
| { | |
| + | #define off ((uint64_t)0) |
| struct ocfs2_super_block *os; | |
| dbg("probing at offset 0x%llx", (unsigned long long) off); | |
| @@ -48,8 +48,9 @@ struct reiser4_super_block { | |
| #define REISERFS1_SUPERBLOCK_OFFSET 0x2000 | |
| #define REISERFS_SUPERBLOCK_OFFSET 0x10000 | |
| - | int volume_id_probe_reiserfs(struct volume_id *id, uint64_t off) |
| + | int volume_id_probe_reiserfs(struct volume_id *id /*,uint64_t off*/) |
| { | |
| + | #define off ((uint64_t)0) |
| struct reiserfs_super_block *rs; | |
| struct reiser4_super_block *rs4; | |
| @@ -27,8 +27,9 @@ struct romfs_super { | |
| uint8_t name[0]; | |
| } __attribute__((__packed__)); | |
| - | int volume_id_probe_romfs(struct volume_id *id, uint64_t off) |
| + | int volume_id_probe_romfs(struct volume_id *id /*,uint64_t off*/) |
| { | |
| + | #define off ((uint64_t)0) |
| struct romfs_super *rfs; | |
| dbg("probing at offset 0x%llx", (unsigned long long) off); | |
| @@ -83,8 +83,9 @@ struct xenix_super { | |
| #define XENIX_MAGIC 0x2b5544 | |
| #define SYSV_MAX_BLOCKSIZE 0x800 | |
| - | int volume_id_probe_sysv(struct volume_id *id, uint64_t off) |
| + | int volume_id_probe_sysv(struct volume_id *id /*,uint64_t off*/) |
| { | |
| + | #define off ((uint64_t)0) |
| struct sysv_super *vs; | |
| struct xenix_super *xs; | |
| unsigned boff; | |
| @@ -55,8 +55,9 @@ struct volume_structure_descriptor { | |
| #define UDF_VSD_OFFSET 0x8000 | |
| - | int volume_id_probe_udf(struct volume_id *id, uint64_t off) |
| + | int volume_id_probe_udf(struct volume_id *id /*,uint64_t off*/) |
| { | |
| + | #define off ((uint64_t)0) |
| struct volume_descriptor *vd; | |
| struct volume_structure_descriptor *vsd; | |
| unsigned bs; | |
| @@ -254,9 +254,15 @@ void *volume_id_get_buffer(struct volume_id *id, uint64_t off, size_t len) | |
| dbg("requested 0x%x bytes, got 0x%x bytes", | |
| (unsigned) len, (unsigned) read_len); | |
| err: | |
| - | /* id->seekbuf_len or id->sbbuf_len is wrong now! Fixing. |
| - | * Most likely user will not do any additional |
| - | * calls anyway, it's a corrupted fs or something. */ |
| + | /* No filesystem can be this tiny. It's most likely |
| + | * non-associated loop device, empty drive and so on. |
| + | * Flag it, making it possible to short circuit future |
| + | * accesses. Rationale: |
| + | * users complained of slow blkid due to empty floppy drives. |
| + | */ |
| + | if (off < 64*1024) |
| + | id->error = 1; |
| + | /* id->seekbuf_len or id->sbbuf_len is wrong now! Fixing. */ |
| volume_id_free_buffer(id); | |
| return NULL; | |
| } | |
| @@ -45,8 +45,8 @@ | |
| #define ENABLE_FEATURE_VOLUMEID_UFS 0 | |
| - | typedef int (*raid_probe_fptr)(struct volume_id *id, uint64_t off, uint64_t size); |
| - | typedef int (*probe_fptr)(struct volume_id *id, uint64_t off); |
| + | typedef int (*raid_probe_fptr)(struct volume_id *id, /*uint64_t off,*/ uint64_t size); |
| + | typedef int (*probe_fptr)(struct volume_id *id /*, uint64_t off*/); |
| static const raid_probe_fptr raid1[] = { | |
| #if ENABLE_FEATURE_VOLUMEID_LINUXRAID | |
| @@ -150,43 +150,49 @@ static const probe_fptr fs2[] = { | |
| #endif | |
| }; | |
| - | int volume_id_probe_all(struct volume_id *id, uint64_t off, uint64_t size) |
| + | int volume_id_probe_all(struct volume_id *id, /*uint64_t off,*/ uint64_t size) |
| { | |
| unsigned i; | |
| - | if (id == NULL) |
| - | return -EINVAL; |
| - | |
| /* probe for raid first, cause fs probes may be successful on raid members */ | |
| if (size) { | |
| - | for (i = 0; i < ARRAY_SIZE(raid1); i++) |
| - | if (raid1[i](id, off, size) == 0) |
| + | for (i = 0; i < ARRAY_SIZE(raid1); i++) { |
| + | if (raid1[i](id, /*off,*/ size) == 0) |
| + | goto ret; |
| + | if (id->error) |
| goto ret; | |
| + | } |
| } | |
| - | for (i = 0; i < ARRAY_SIZE(raid2); i++) |
| - | if (raid2[i](id, off) == 0) |
| + | for (i = 0; i < ARRAY_SIZE(raid2); i++) { |
| + | if (raid2[i](id /*,off*/) == 0) |
| goto ret; | |
| + | if (id->error) |
| + | goto ret; |
| + | } |
| /* signature in the first block, only small buffer needed */ | |
| - | for (i = 0; i < ARRAY_SIZE(fs1); i++) |
| - | if (fs1[i](id, off) == 0) |
| + | for (i = 0; i < ARRAY_SIZE(fs1); i++) { |
| + | if (fs1[i](id /*,off*/) == 0) |
| goto ret; | |
| + | if (id->error) |
| + | goto ret; |
| + | } |
| /* fill buffer with maximum */ | |
| volume_id_get_buffer(id, 0, SB_BUFFER_SIZE); | |
| - | for (i = 0; i < ARRAY_SIZE(fs2); i++) |
| - | if (fs2[i](id, off) == 0) |
| + | for (i = 0; i < ARRAY_SIZE(fs2); i++) { |
| + | if (fs2[i](id /*,off*/) == 0) |
| goto ret; | |
| - | return -1; |
| + | if (id->error) |
| + | goto ret; |
| + | } |
| ret: | |
| - | /* If the filestystem in recognized, we free the allocated buffers, |
| - | otherwise they will stay in place for the possible next probe call */ |
| volume_id_free_buffer(id); | |
| + | return (- id->error); /* 0 or -1 */ |
| - | return 0; |
| } | |
| /* open volume by device node */ | |
| @@ -63,6 +63,7 @@ struct volume_id_partition { | |
| struct volume_id { | |
| int fd; | |
| // int fd_close:1; | |
| + | int error; |
| size_t sbbuf_len; | |
| size_t seekbuf_len; | |
| uint8_t *sbbuf; | |
| @@ -86,7 +87,7 @@ struct volume_id { | |
| }; | |
| struct volume_id *volume_id_open_node(int fd); | |
| - | int volume_id_probe_all(struct volume_id *id, uint64_t off, uint64_t size); |
| + | int volume_id_probe_all(struct volume_id *id, /*uint64_t off,*/ uint64_t size); |
| void free_volume_id(struct volume_id *id); | |
| /* util.h */ | |
| @@ -164,67 +165,67 @@ void volume_id_free_buffer(struct volume_id *id); | |
| /* RAID */ | |
| - | //int volume_id_probe_highpoint_37x_raid(struct volume_id *id, uint64_t off); |
| - | //int volume_id_probe_highpoint_45x_raid(struct volume_id *id, uint64_t off, uint64_t size); |
| + | //int volume_id_probe_highpoint_37x_raid(struct volume_id *id /*,uint64_t off*/); |
| + | //int volume_id_probe_highpoint_45x_raid(struct volume_id *id /*,uint64_t off*/, uint64_t size); |
| - | //int volume_id_probe_intel_software_raid(struct volume_id *id, uint64_t off, uint64_t size); |
| + | //int volume_id_probe_intel_software_raid(struct volume_id *id /*,uint64_t off*/, uint64_t size); |
| - | int volume_id_probe_linux_raid(struct volume_id *id, uint64_t off, uint64_t size); |
| + | int volume_id_probe_linux_raid(struct volume_id *id /*,uint64_t off*/, uint64_t size); |
| - | //int volume_id_probe_lsi_mega_raid(struct volume_id *id, uint64_t off, uint64_t size); |
| + | //int volume_id_probe_lsi_mega_raid(struct volume_id *id /*,uint64_t off*/, uint64_t size); |
| - | //int volume_id_probe_nvidia_raid(struct volume_id *id, uint64_t off, uint64_t size); |
| + | //int volume_id_probe_nvidia_raid(struct volume_id *id /*,uint64_t off*/, uint64_t size); |
| - | //int volume_id_probe_promise_fasttrack_raid(struct volume_id *id, uint64_t off, uint64_t size); |
| + | //int volume_id_probe_promise_fasttrack_raid(struct volume_id *id /*,uint64_t off*/, uint64_t size); |
| - | //int volume_id_probe_silicon_medley_raid(struct volume_id *id, uint64_t off, uint64_t size); |
| + | //int volume_id_probe_silicon_medley_raid(struct volume_id *id /*,uint64_t off*/, uint64_t size); |
| - | //int volume_id_probe_via_raid(struct volume_id *id, uint64_t off, uint64_t size); |
| + | //int volume_id_probe_via_raid(struct volume_id *id /*,uint64_t off*/, uint64_t size); |
| - | //int volume_id_probe_lvm1(struct volume_id *id, uint64_t off); |
| - | //int volume_id_probe_lvm2(struct volume_id *id, uint64_t off); |
| + | //int volume_id_probe_lvm1(struct volume_id *id /*,uint64_t off*/); |
| + | //int volume_id_probe_lvm2(struct volume_id *id /*,uint64_t off*/); |
| /* FS */ | |
| - | int volume_id_probe_cramfs(struct volume_id *id, uint64_t off); |
| + | int volume_id_probe_cramfs(struct volume_id *id /*,uint64_t off*/); |
| - | int volume_id_probe_ext(struct volume_id *id, uint64_t off); |
| + | int volume_id_probe_ext(struct volume_id *id /*,uint64_t off*/); |
| - | int volume_id_probe_vfat(struct volume_id *id, uint64_t off); |
| + | int volume_id_probe_vfat(struct volume_id *id /*,uint64_t off*/); |
| - | int volume_id_probe_hfs_hfsplus(struct volume_id *id, uint64_t off); |
| + | int volume_id_probe_hfs_hfsplus(struct volume_id *id /*,uint64_t off*/); |
| - | //int volume_id_probe_hpfs(struct volume_id *id, uint64_t off); |
| + | //int volume_id_probe_hpfs(struct volume_id *id /*,uint64_t off*/); |
| - | int volume_id_probe_iso9660(struct volume_id *id, uint64_t off); |
| + | int volume_id_probe_iso9660(struct volume_id *id /*,uint64_t off*/); |
| - | int volume_id_probe_jfs(struct volume_id *id, uint64_t off); |
| + | int volume_id_probe_jfs(struct volume_id *id /*,uint64_t off*/); |
| - | int volume_id_probe_linux_swap(struct volume_id *id, uint64_t off); |
| + | int volume_id_probe_linux_swap(struct volume_id *id /*,uint64_t off*/); |
| - | int volume_id_probe_luks(struct volume_id *id, uint64_t off); |
| + | int volume_id_probe_luks(struct volume_id *id /*,uint64_t off*/); |
| - | //int volume_id_probe_mac_partition_map(struct volume_id *id, uint64_t off); |
| + | //int volume_id_probe_mac_partition_map(struct volume_id *id /*,uint64_t off*/); |
| - | //int volume_id_probe_minix(struct volume_id *id, uint64_t off); |
| + | //int volume_id_probe_minix(struct volume_id *id /*,uint64_t off*/); |
| - | //int volume_id_probe_msdos_part_table(struct volume_id *id, uint64_t off); |
| + | //int volume_id_probe_msdos_part_table(struct volume_id *id /*,uint64_t off*/); |
| - | int volume_id_probe_ntfs(struct volume_id *id, uint64_t off); |
| + | int volume_id_probe_ntfs(struct volume_id *id /*,uint64_t off*/); |
| - | int volume_id_probe_ocfs2(struct volume_id *id, uint64_t off); |
| + | int volume_id_probe_ocfs2(struct volume_id *id /*,uint64_t off*/); |
| - | int volume_id_probe_reiserfs(struct volume_id *id, uint64_t off); |
| + | int volume_id_probe_reiserfs(struct volume_id *id /*,uint64_t off*/); |
| - | int volume_id_probe_romfs(struct volume_id *id, uint64_t off); |
| + | int volume_id_probe_romfs(struct volume_id *id /*,uint64_t off*/); |
| - | int volume_id_probe_sysv(struct volume_id *id, uint64_t off); |
| + | int volume_id_probe_sysv(struct volume_id *id /*,uint64_t off*/); |
| - | int volume_id_probe_udf(struct volume_id *id, uint64_t off); |
| + | int volume_id_probe_udf(struct volume_id *id /*,uint64_t off*/); |
| - | //int volume_id_probe_ufs(struct volume_id *id, uint64_t off); |
| + | //int volume_id_probe_ufs(struct volume_id *id /*,uint64_t off*/); |
| - | int volume_id_probe_xfs(struct volume_id *id, uint64_t off); |
| + | int volume_id_probe_xfs(struct volume_id *id /*,uint64_t off*/); |
| #if __GNUC_PREREQ(4,1) | |
| # pragma GCC visibility pop | |
| @@ -35,8 +35,9 @@ struct xfs_super_block { | |
| uint64_t fdblocks; | |
| } __attribute__((__packed__)); | |
| - | int volume_id_probe_xfs(struct volume_id *id, uint64_t off) |
| + | int volume_id_probe_xfs(struct volume_id *id /*,uint64_t off*/) |
| { | |
| + | #define off ((uint64_t)0) |
| struct xfs_super_block *xs; | |
| dbg("probing at offset 0x%llx", (unsigned long long) off); | |