diff --git a/DiscImageChef.Filesystems/Acorn.cs b/DiscImageChef.Filesystems/Acorn.cs index 08e0e9e2..ab663795 100644 --- a/DiscImageChef.Filesystems/Acorn.cs +++ b/DiscImageChef.Filesystems/Acorn.cs @@ -391,6 +391,9 @@ namespace DiscImageChef.Filesystems if(bootBlockSize % imagePlugin.ImageInfo.sectorSize > 0) sectorsToRead++; + if(sbSector + partition.Start + sectorsToRead >= partition.End) + return false; + byte[] bootSector = imagePlugin.ReadSectors(sbSector + partition.Start, sectorsToRead); int bootChk = 0; for(int i = 0; i < 0x1FF; i++) diff --git a/DiscImageChef.Filesystems/BTRFS.cs b/DiscImageChef.Filesystems/BTRFS.cs index 609fdf6d..7b83ed6f 100644 --- a/DiscImageChef.Filesystems/BTRFS.cs +++ b/DiscImageChef.Filesystems/BTRFS.cs @@ -130,7 +130,7 @@ namespace DiscImageChef.Filesystems ulong sbSectorOff = 0x10000 / imagePlugin.GetSectorSize(); uint sbSectorSize = 0x1000 / imagePlugin.GetSectorSize(); - if((sbSectorOff + sbSectorSize) >= partition.End) + if((sbSectorOff + partition.Start) >= partition.End) return false; byte[] sector = imagePlugin.ReadSectors(sbSectorOff + partition.Start, sbSectorSize); diff --git a/DiscImageChef.Filesystems/F2FS.cs b/DiscImageChef.Filesystems/F2FS.cs index 1bfe192c..a07156b9 100644 --- a/DiscImageChef.Filesystems/F2FS.cs +++ b/DiscImageChef.Filesystems/F2FS.cs @@ -139,6 +139,9 @@ namespace DiscImageChef.Filesystems if(Marshal.SizeOf(f2fsSb) % imagePlugin.GetSectorSize() != 0) sbSize++; + if(partition.Start + sbAddr >= partition.End) + return false; + byte[] sector = imagePlugin.ReadSectors(partition.Start + sbAddr, sbSize); if(sector.Length < Marshal.SizeOf(f2fsSb)) return false; diff --git a/DiscImageChef.Filesystems/FAT.cs b/DiscImageChef.Filesystems/FAT.cs index 01d984c1..3018763c 100644 --- a/DiscImageChef.Filesystems/FAT.cs +++ b/DiscImageChef.Filesystems/FAT.cs @@ -143,14 +143,17 @@ namespace DiscImageChef.Filesystems return false; // HPFS - uint hpfs_magic1, hpfs_magic2; + if(16 + partition.Start <= partition.End) + { + uint hpfs_magic1, hpfs_magic2; - byte[] hpfs_sb_sector = imagePlugin.ReadSector(16 + partition.Start); // Seek to superblock, on logical sector 16 - hpfs_magic1 = BitConverter.ToUInt32(hpfs_sb_sector, 0x000); - hpfs_magic2 = BitConverter.ToUInt32(hpfs_sb_sector, 0x004); + byte[] hpfs_sb_sector = imagePlugin.ReadSector(16 + partition.Start); // Seek to superblock, on logical sector 16 + hpfs_magic1 = BitConverter.ToUInt32(hpfs_sb_sector, 0x000); + hpfs_magic2 = BitConverter.ToUInt32(hpfs_sb_sector, 0x004); - if(hpfs_magic1 == 0xF995E849 && hpfs_magic2 == 0xFA53E9C5) - return false; + if(hpfs_magic1 == 0xF995E849 && hpfs_magic2 == 0xFA53E9C5) + return false; + } // FAT32 for sure if(bits_in_bps == 1 && correct_spc && fats_no <= 2 && sectors == 0 && fat_sectors == 0 && fat32_signature == 0x29 && fat32_string == "FAT32 ") @@ -840,7 +843,7 @@ namespace DiscImageChef.Filesystems StringBuilder atariSb = new StringBuilder(); atariSb.AppendFormat("cmdload will be loaded with value {0:X4}h", BigEndianBitConverter.ToUInt16(bpb_sector, 0x01E)).AppendLine(); atariSb.AppendFormat("Boot program will be loaded at address {0:X4}h", atariBPB.ldaaddr).AppendLine(); - atariSb.AppendFormat("FAT and directory will be cahed at address {0:X4}h", atariBPB.fatbuf).AppendLine(); + atariSb.AppendFormat("FAT and directory will be cached at address {0:X4}h", atariBPB.fatbuf).AppendLine(); if(atariBPB.ldmode == 0) { byte[] tmp = new byte[8]; @@ -1130,8 +1133,12 @@ namespace DiscImageChef.Filesystems public ushort sectcnt; /// Address where boot code should be loaded. public ushort ldaaddr; + /// Padding. + public ushort padding; /// Address where FAT and root directory sectors must be loaded. public ushort fatbuf; + /// Unknown. + public ushort unknown; /// Filename to be loaded for booting. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)] public byte[] fname; diff --git a/DiscImageChef.Filesystems/HPFS.cs b/DiscImageChef.Filesystems/HPFS.cs index 98fe00ac..4c263d3f 100644 --- a/DiscImageChef.Filesystems/HPFS.cs +++ b/DiscImageChef.Filesystems/HPFS.cs @@ -59,10 +59,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, Partition partition) { - if((2 + partition.Start) >= partition.End) - return false; - - if(imagePlugin.ImageInfo.sectors <= 16) + if((16 + partition.Start) >= partition.End) return false; uint magic1, magic2; diff --git a/DiscImageChef.Filesystems/JFS.cs b/DiscImageChef.Filesystems/JFS.cs index 5656206c..e7f9ab4a 100644 --- a/DiscImageChef.Filesystems/JFS.cs +++ b/DiscImageChef.Filesystems/JFS.cs @@ -152,6 +152,9 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, Partition partition) { uint bootSectors = JFS_BootBlocksSize / imagePlugin.GetSectorSize(); + if(partition.Start + bootSectors >= partition.End) + return false; + byte[] sector = imagePlugin.ReadSector(partition.Start + bootSectors); if(sector.Length < 512) return false; diff --git a/DiscImageChef.Filesystems/NILFS2.cs b/DiscImageChef.Filesystems/NILFS2.cs index 8c210ff0..2e7f5353 100644 --- a/DiscImageChef.Filesystems/NILFS2.cs +++ b/DiscImageChef.Filesystems/NILFS2.cs @@ -127,6 +127,9 @@ namespace DiscImageChef.Filesystems if(Marshal.SizeOf(nilfsSb) % imagePlugin.GetSectorSize() != 0) sbSize++; + if(partition.Start + sbAddr + sbSize >= partition.End) + return false; + byte[] sector = imagePlugin.ReadSectors(partition.Start + sbAddr, sbSize); if(sector.Length < Marshal.SizeOf(nilfsSb)) return false; diff --git a/DiscImageChef.Filesystems/PFS.cs b/DiscImageChef.Filesystems/PFS.cs index 249896be..55bd5769 100644 --- a/DiscImageChef.Filesystems/PFS.cs +++ b/DiscImageChef.Filesystems/PFS.cs @@ -180,7 +180,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, Partition partition) { - if(partition.Start >= partition.End) + if(partition.Length < 3) return false; BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; diff --git a/DiscImageChef.Filesystems/ProDOS.cs b/DiscImageChef.Filesystems/ProDOS.cs index dfa58e84..42a08881 100644 --- a/DiscImageChef.Filesystems/ProDOS.cs +++ b/DiscImageChef.Filesystems/ProDOS.cs @@ -96,7 +96,7 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, Partition partition) { - if(partition.End < 3) + if(partition.Length < 3) return false; // Blocks 0 and 1 are boot code diff --git a/DiscImageChef.Filesystems/QNX6.cs b/DiscImageChef.Filesystems/QNX6.cs index b3e1326a..0053e007 100644 --- a/DiscImageChef.Filesystems/QNX6.cs +++ b/DiscImageChef.Filesystems/QNX6.cs @@ -123,6 +123,9 @@ namespace DiscImageChef.Filesystems uint sectors = QNX6_SuperBlockSize / imagePlugin.GetSectorSize(); uint bootSectors = QNX6_BootBlocksSize / imagePlugin.GetSectorSize(); + if(partition.Start + bootSectors + sectors >= partition.End) + return false; + byte[] audiSector = imagePlugin.ReadSectors(partition.Start, sectors); byte[] sector = imagePlugin.ReadSectors(partition.Start + bootSectors, sectors); if(sector.Length < QNX6_SuperBlockSize) diff --git a/DiscImageChef.Filesystems/Reiser.cs b/DiscImageChef.Filesystems/Reiser.cs index 42526b69..dbff5738 100644 --- a/DiscImageChef.Filesystems/Reiser.cs +++ b/DiscImageChef.Filesystems/Reiser.cs @@ -121,6 +121,9 @@ namespace DiscImageChef.Filesystems if(Marshal.SizeOf(reiserSb) % imagePlugin.GetSectorSize() != 0) sbSize++; + if(partition.Start + sbAddr + sbSize >= partition.End) + return false; + byte[] sector = imagePlugin.ReadSectors(partition.Start + sbAddr, sbSize); if(sector.Length < Marshal.SizeOf(reiserSb)) return false; diff --git a/DiscImageChef.Filesystems/Reiser4.cs b/DiscImageChef.Filesystems/Reiser4.cs index d22be7f7..d0e4804c 100644 --- a/DiscImageChef.Filesystems/Reiser4.cs +++ b/DiscImageChef.Filesystems/Reiser4.cs @@ -86,6 +86,9 @@ namespace DiscImageChef.Filesystems if(Marshal.SizeOf(reiserSb) % imagePlugin.GetSectorSize() != 0) sbSize++; + if(partition.Start + sbAddr + sbSize >= partition.End) + return false; + byte[] sector = imagePlugin.ReadSectors(partition.Start + sbAddr, sbSize); if(sector.Length < Marshal.SizeOf(reiserSb)) return false; diff --git a/DiscImageChef.Filesystems/UCSDPascal/Info.cs b/DiscImageChef.Filesystems/UCSDPascal/Info.cs index d5f5cd23..3fd2d6ec 100644 --- a/DiscImageChef.Filesystems/UCSDPascal/Info.cs +++ b/DiscImageChef.Filesystems/UCSDPascal/Info.cs @@ -41,7 +41,7 @@ namespace DiscImageChef.Filesystems.UCSDPascal { public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, Partition partition) { - if(imagePlugin.GetSectors() < 3) + if(partition.Length < 3) return false; // Blocks 0 and 1 are boot code diff --git a/DiscImageChef.Filesystems/VxFS.cs b/DiscImageChef.Filesystems/VxFS.cs index b32d9a33..c6fa757d 100644 --- a/DiscImageChef.Filesystems/VxFS.cs +++ b/DiscImageChef.Filesystems/VxFS.cs @@ -210,10 +210,11 @@ namespace DiscImageChef.Filesystems public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, Partition partition) { - if(partition.Start >= partition.End) - return false; - ulong vmfsSuperOff = VxFS_Base / imagePlugin.ImageInfo.sectorSize; + + if(partition.Start + vmfsSuperOff >= partition.End) + return false; + byte[] sector = imagePlugin.ReadSector(partition.Start + vmfsSuperOff); uint magic = BitConverter.ToUInt32(sector, 0x00);