diff --git a/DiscImageChef.Partitions/BSD.cs b/DiscImageChef.Partitions/BSD.cs index 6654b028c..cee6c6a1f 100644 --- a/DiscImageChef.Partitions/BSD.cs +++ b/DiscImageChef.Partitions/BSD.cs @@ -73,6 +73,9 @@ namespace DiscImageChef.Partitions foreach(uint offset in labelOffsets) { byte[] sector = new byte[MAX_LABEL_SIZE]; + + if(offset + MAX_LABEL_SIZE > tmp.Length) break; + Array.Copy(tmp, offset, sector, 0, MAX_LABEL_SIZE); dl = Marshal.ByteArrayToStructureLittleEndian(sector); DicConsole.DebugWriteLine("BSD plugin", @@ -372,89 +375,89 @@ namespace DiscImageChef.Partitions /// /// /// - public uint d_magic; + public readonly uint d_magic; /// /// /// - public dType d_type; + public readonly dType d_type; /// Disk subtype - public ushort d_subtype; + public readonly ushort d_subtype; /// Type name [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] - public byte[] d_typename; + public readonly byte[] d_typename; /// Pack identifier [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] - public byte[] d_packname; + public readonly byte[] d_packname; /// Bytes per sector - public uint d_secsize; + public readonly uint d_secsize; /// Sectors per track - public uint d_nsectors; + public readonly uint d_nsectors; /// Tracks per cylinder - public uint d_ntracks; + public readonly uint d_ntracks; /// Cylinders per unit - public uint d_ncylinders; + public readonly uint d_ncylinders; /// Sectors per cylinder - public uint d_secpercyl; + public readonly uint d_secpercyl; /// Sectors per unit - public uint d_secperunit; + public readonly uint d_secperunit; /// Spare sectors per track - public ushort d_sparespertrack; + public readonly ushort d_sparespertrack; /// Spare sectors per cylinder - public ushort d_sparespercyl; + public readonly ushort d_sparespercyl; /// Alternate cylinders - public uint d_acylinders; + public readonly uint d_acylinders; /// Rotational speed - public ushort d_rpm; + public readonly ushort d_rpm; /// Hardware sector interleave - public ushort d_interleave; + public readonly ushort d_interleave; /// Sector 0 skew per track - public ushort d_trackskew; + public readonly ushort d_trackskew; /// Sector 0 sker per cylinder - public ushort d_cylskeew; + public readonly ushort d_cylskeew; /// Head switch time in microseconds - public uint d_headswitch; + public readonly uint d_headswitch; /// Track to track seek in microseconds - public uint d_trkseek; + public readonly uint d_trkseek; /// /// /// - public dFlags d_flags; + public readonly dFlags d_flags; /// Drive-specific information [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] - public uint[] d_drivedata; + public readonly uint[] d_drivedata; /// Reserved [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] - public uint[] d_spare; + public readonly uint[] d_spare; /// again - public uint d_magic2; + public readonly uint d_magic2; /// XOR of data - public ushort d_checksum; + public readonly ushort d_checksum; /// How many partitions - public ushort d_npartitions; + public readonly ushort d_npartitions; /// Size of boot area in bytes - public uint d_bbsize; + public readonly uint d_bbsize; /// Maximum size of superblock in bytes - public uint d_sbsize; + public readonly uint d_sbsize; /// Partitions [MarshalAs(UnmanagedType.ByValArray, SizeConst = 22)] - public BSDPartition[] d_partitions; + public readonly BSDPartition[] d_partitions; } [StructLayout(LayoutKind.Sequential, Pack = 1)] struct BSDPartition { /// Sectors in partition - public uint p_size; + public readonly uint p_size; /// Starting sector - public uint p_offset; + public readonly uint p_offset; /// Fragment size - public uint p_fsize; + public readonly uint p_fsize; /// Filesystem type, - public fsType p_fstype; + public readonly fsType p_fstype; /// Fragment size - public byte p_frag; + public readonly byte p_frag; /// Cylinder per group - public ushort p_cpg; + public readonly ushort p_cpg; } } } \ No newline at end of file