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);