From 679e8f80703afa7ebbda05b08a9c798aa5ca63fa Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Wed, 9 Jul 2014 19:49:14 +0100 Subject: [PATCH] Checks there is a minimum of sectors. --- DiscImageChef/Plugins/AppleHFS.cs | 3 +++ DiscImageChef/Plugins/AppleHFSPlus.cs | 3 +++ DiscImageChef/Plugins/AppleMFS.cs | 3 +++ DiscImageChef/Plugins/BFS.cs | 3 +++ DiscImageChef/Plugins/FAT.cs | 3 +++ DiscImageChef/Plugins/FFS.cs | 3 +++ DiscImageChef/Plugins/HPFS.cs | 3 +++ DiscImageChef/Plugins/MinixFS.cs | 3 +++ DiscImageChef/Plugins/NTFS.cs | 3 +++ DiscImageChef/Plugins/ODS.cs | 3 +++ DiscImageChef/Plugins/Opera.cs | 3 +++ DiscImageChef/Plugins/PCEngine.cs | 3 +++ DiscImageChef/Plugins/SolarFS.cs | 3 +++ DiscImageChef/Plugins/SysV.cs | 3 +++ DiscImageChef/Plugins/UNIXBFS.cs | 3 +++ DiscImageChef/Plugins/ext2FS.cs | 3 +++ DiscImageChef/Plugins/extFS.cs | 3 +++ 17 files changed, 51 insertions(+) diff --git a/DiscImageChef/Plugins/AppleHFS.cs b/DiscImageChef/Plugins/AppleHFS.cs index 97448ece..e7dcdf77 100644 --- a/DiscImageChef/Plugins/AppleHFS.cs +++ b/DiscImageChef/Plugins/AppleHFS.cs @@ -60,6 +60,9 @@ namespace DiscImageChef.Plugins public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionOffset) { + if ((2 + partitionOffset) >= imagePlugin.GetSectors()) + return false; + byte[] mdb_sector = imagePlugin.ReadSector(2 + partitionOffset); UInt16 drSigWord = BigEndianBitConverter.ToUInt16(mdb_sector, 0); diff --git a/DiscImageChef/Plugins/AppleHFSPlus.cs b/DiscImageChef/Plugins/AppleHFSPlus.cs index 9f5b3186..c583d6f7 100644 --- a/DiscImageChef/Plugins/AppleHFSPlus.cs +++ b/DiscImageChef/Plugins/AppleHFSPlus.cs @@ -59,6 +59,9 @@ namespace DiscImageChef.Plugins public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionOffset) { + if ((2 + partitionOffset) >= imagePlugin.GetSectors()) + return false; + UInt16 drSigWord; UInt16 xdrStABNt; UInt16 drAlBlSt; diff --git a/DiscImageChef/Plugins/AppleMFS.cs b/DiscImageChef/Plugins/AppleMFS.cs index 7b117881..25d239ab 100644 --- a/DiscImageChef/Plugins/AppleMFS.cs +++ b/DiscImageChef/Plugins/AppleMFS.cs @@ -59,6 +59,9 @@ namespace DiscImageChef.Plugins { UInt16 drSigWord; + if ((2 + partitionOffset) >= imagePlugin.GetSectors()) + return false; + byte[] mdb_sector = imagePlugin.ReadSector(2 + partitionOffset); drSigWord = BigEndianBitConverter.ToUInt16(mdb_sector, 0x000); diff --git a/DiscImageChef/Plugins/BFS.cs b/DiscImageChef/Plugins/BFS.cs index fa6aca4f..e5ec585a 100644 --- a/DiscImageChef/Plugins/BFS.cs +++ b/DiscImageChef/Plugins/BFS.cs @@ -65,6 +65,9 @@ namespace DiscImageChef.Plugins public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionOffset) { + if ((2 + partitionOffset) >= imagePlugin.GetSectors()) + return false; + UInt32 magic; UInt32 magic_be; diff --git a/DiscImageChef/Plugins/FAT.cs b/DiscImageChef/Plugins/FAT.cs index bb868f9f..4c20dfc5 100644 --- a/DiscImageChef/Plugins/FAT.cs +++ b/DiscImageChef/Plugins/FAT.cs @@ -54,6 +54,9 @@ namespace DiscImageChef.Plugins public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionOffset) { + if ((2 + partitionOffset) >= imagePlugin.GetSectors()) + return false; + byte media_descriptor; // Not present on DOS <= 3, present on TOS but != of first FAT entry byte fats_no; // Must be 1 or 2. Dunno if it can be 0 in the wild, but it CANNOT BE bigger than 2 byte[] fat32_signature = new byte[8]; // "FAT32 " diff --git a/DiscImageChef/Plugins/FFS.cs b/DiscImageChef/Plugins/FFS.cs index b77a5bcd..f4fe3867 100644 --- a/DiscImageChef/Plugins/FFS.cs +++ b/DiscImageChef/Plugins/FFS.cs @@ -53,6 +53,9 @@ namespace DiscImageChef.Plugins public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionOffset) { + if ((2 + partitionOffset) >= imagePlugin.GetSectors()) + return false; + UInt32 magic; uint sb_size_in_sectors; byte[] ufs_sb_sectors; diff --git a/DiscImageChef/Plugins/HPFS.cs b/DiscImageChef/Plugins/HPFS.cs index 0714d433..c13e2267 100644 --- a/DiscImageChef/Plugins/HPFS.cs +++ b/DiscImageChef/Plugins/HPFS.cs @@ -54,6 +54,9 @@ namespace DiscImageChef.Plugins public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionOffset) { + if ((2 + partitionOffset) >= imagePlugin.GetSectors()) + return false; + UInt32 magic1, magic2; byte[] hpfs_sb_sector = imagePlugin.ReadSector(16 + partitionOffset); // Seek to superblock, on logical sector 16 diff --git a/DiscImageChef/Plugins/MinixFS.cs b/DiscImageChef/Plugins/MinixFS.cs index 10993acd..aeb96f9f 100644 --- a/DiscImageChef/Plugins/MinixFS.cs +++ b/DiscImageChef/Plugins/MinixFS.cs @@ -75,6 +75,9 @@ namespace DiscImageChef.Plugins public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionOffset) { + if ((2 + partitionOffset) >= imagePlugin.GetSectors()) + return false; + UInt16 magic; byte[] minix_sb_sector = imagePlugin.ReadSector(2 + partitionOffset); diff --git a/DiscImageChef/Plugins/NTFS.cs b/DiscImageChef/Plugins/NTFS.cs index eafb0aca..be83a277 100644 --- a/DiscImageChef/Plugins/NTFS.cs +++ b/DiscImageChef/Plugins/NTFS.cs @@ -53,6 +53,9 @@ namespace DiscImageChef.Plugins public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionOffset) { + if ((2 + partitionOffset) >= imagePlugin.GetSectors()) + return false; + byte[] eigth_bytes = new byte[8]; byte signature1, fats_no; UInt16 spfat, signature2; diff --git a/DiscImageChef/Plugins/ODS.cs b/DiscImageChef/Plugins/ODS.cs index 155b6b16..c5d33717 100644 --- a/DiscImageChef/Plugins/ODS.cs +++ b/DiscImageChef/Plugins/ODS.cs @@ -60,6 +60,9 @@ namespace DiscImageChef.Plugins public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionOffset) { + if ((2 + partitionOffset) >= imagePlugin.GetSectors()) + return false; + if (imagePlugin.GetSectorSize() < 512) return false; diff --git a/DiscImageChef/Plugins/Opera.cs b/DiscImageChef/Plugins/Opera.cs index 9c799eb4..8dff8fc1 100644 --- a/DiscImageChef/Plugins/Opera.cs +++ b/DiscImageChef/Plugins/Opera.cs @@ -53,6 +53,9 @@ namespace DiscImageChef.Plugins public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionOffset) { + if ((2 + partitionOffset) >= imagePlugin.GetSectors()) + return false; + byte[] sb_sector = imagePlugin.ReadSector(0 + partitionOffset); byte record_type; diff --git a/DiscImageChef/Plugins/PCEngine.cs b/DiscImageChef/Plugins/PCEngine.cs index a096bcb3..56ef54d8 100644 --- a/DiscImageChef/Plugins/PCEngine.cs +++ b/DiscImageChef/Plugins/PCEngine.cs @@ -52,6 +52,9 @@ namespace DiscImageChef.Plugins public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionOffset) { + if ((2 + partitionOffset) >= imagePlugin.GetSectors()) + return false; + byte[] system_descriptor = new byte[23]; byte[] sector = imagePlugin.ReadSector(1 + partitionOffset); diff --git a/DiscImageChef/Plugins/SolarFS.cs b/DiscImageChef/Plugins/SolarFS.cs index 2b0af3c2..96b38ee5 100644 --- a/DiscImageChef/Plugins/SolarFS.cs +++ b/DiscImageChef/Plugins/SolarFS.cs @@ -53,6 +53,9 @@ namespace DiscImageChef.Plugins public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionOffset) { + if ((2 + partitionOffset) >= imagePlugin.GetSectors()) + return false; + byte signature; // 0x29 string fs_type; // "SOL_FS " diff --git a/DiscImageChef/Plugins/SysV.cs b/DiscImageChef/Plugins/SysV.cs index b0901e94..81647baf 100644 --- a/DiscImageChef/Plugins/SysV.cs +++ b/DiscImageChef/Plugins/SysV.cs @@ -68,6 +68,9 @@ namespace DiscImageChef.Plugins public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionOffset) { + if ((2 + partitionOffset) >= imagePlugin.GetSectors()) + return false; + UInt32 magic; string s_fname, s_fpack; UInt16 s_nfree, s_ninode; diff --git a/DiscImageChef/Plugins/UNIXBFS.cs b/DiscImageChef/Plugins/UNIXBFS.cs index 54dd19e8..cb93aa1d 100644 --- a/DiscImageChef/Plugins/UNIXBFS.cs +++ b/DiscImageChef/Plugins/UNIXBFS.cs @@ -55,6 +55,9 @@ namespace DiscImageChef.Plugins public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionOffset) { + if ((2 + partitionOffset) >= imagePlugin.GetSectors()) + return false; + UInt32 magic; magic = BitConverter.ToUInt32(imagePlugin.ReadSector(0 + partitionOffset), 0); diff --git a/DiscImageChef/Plugins/ext2FS.cs b/DiscImageChef/Plugins/ext2FS.cs index 1cf6aa5a..0a209ed9 100644 --- a/DiscImageChef/Plugins/ext2FS.cs +++ b/DiscImageChef/Plugins/ext2FS.cs @@ -53,6 +53,9 @@ namespace DiscImageChef.Plugins public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionOffset) { + if ((2 + partitionOffset) >= imagePlugin.GetSectors()) + return false; + byte[] sb_sector = imagePlugin.ReadSector(2 + partitionOffset); UInt16 magic = BitConverter.ToUInt16(sb_sector, 0x038); diff --git a/DiscImageChef/Plugins/extFS.cs b/DiscImageChef/Plugins/extFS.cs index a4e58b79..fd182b57 100644 --- a/DiscImageChef/Plugins/extFS.cs +++ b/DiscImageChef/Plugins/extFS.cs @@ -53,6 +53,9 @@ namespace DiscImageChef.Plugins public override bool Identify(ImagePlugins.ImagePlugin imagePlugin, ulong partitionOffset) { + if ((2 + partitionOffset) >= imagePlugin.GetSectors()) + return false; + byte[] sb_sector = imagePlugin.ReadSector(2 + partitionOffset); // Superblock resides at 0x400 UInt16 magic = BitConverter.ToUInt16(sb_sector, 0x038); // Here should reside magic number