diff --git a/Aaru.Checksums b/Aaru.Checksums index 7437cb04a..5bb04c020 160000 --- a/Aaru.Checksums +++ b/Aaru.Checksums @@ -1 +1 @@ -Subproject commit 7437cb04a50cd711a4485db5de40927e80203fe4 +Subproject commit 5bb04c02045ba76d5f43dee174f62d6ba40ddad6 diff --git a/Aaru.Compression/Aaru.Compression.csproj b/Aaru.Compression/Aaru.Compression.csproj index a522dd1e4..375b91c64 100644 --- a/Aaru.Compression/Aaru.Compression.csproj +++ b/Aaru.Compression/Aaru.Compression.csproj @@ -76,11 +76,14 @@ - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/Aaru.Compression/NonClosableStream.cs b/Aaru.Compression/NonClosableStream.cs index c99626c4d..bc75c079e 100644 --- a/Aaru.Compression/NonClosableStream.cs +++ b/Aaru.Compression/NonClosableStream.cs @@ -33,6 +33,7 @@ namespace Aaru.Compression; using System.IO; +using Aaru.Helpers; /// /// Creates a MemoryStream that ignores close commands @@ -57,7 +58,7 @@ sealed class NonClosableStream : Stream public override void Flush() => _baseStream.Flush(); - public override int Read(byte[] buffer, int offset, int count) => _baseStream.Read(buffer, offset, count); + public override int Read(byte[] buffer, int offset, int count) => _baseStream.EnsureRead(buffer, offset, count); public override long Seek(long offset, SeekOrigin origin) => _baseStream.Seek(offset, origin); diff --git a/Aaru.Compression/TeleDiskLzh.cs b/Aaru.Compression/TeleDiskLzh.cs index 3a6a6db7f..dfc720476 100644 --- a/Aaru.Compression/TeleDiskLzh.cs +++ b/Aaru.Compression/TeleDiskLzh.cs @@ -46,6 +46,7 @@ namespace Aaru.Compression; using System; using System.IO; +using Aaru.Helpers; /* * Based on Japanese version 29-NOV-1988 @@ -225,7 +226,7 @@ public class TeleDiskLzh size = _inStream.Length - _inStream.Position; buf = new byte[size]; - _inStream.Read(buf, 0, (int)size); + _inStream.EnsureRead(buf, 0, (int)size); return size; } diff --git a/Aaru.Core/DataFile.cs b/Aaru.Core/DataFile.cs index 609c11eb3..37d829503 100644 --- a/Aaru.Core/DataFile.cs +++ b/Aaru.Core/DataFile.cs @@ -35,6 +35,7 @@ namespace Aaru.Core; using System.Diagnostics.CodeAnalysis; using System.IO; using Aaru.Console; +using Aaru.Helpers; /// Abstracts a datafile with a block based interface [SuppressMessage("ReSharper", "UnusedMethodReturnValue.Global"), SuppressMessage("ReSharper", "UnusedMember.Global")] @@ -55,7 +56,7 @@ public sealed class DataFile /// Offset of where data will be read /// How many bytes to read /// How many bytes were read - public int Read(byte[] array, int offset, int count) => _dataFs.Read(array, offset, count); + public int Read(byte[] array, int offset, int count) => _dataFs.EnsureRead(array, offset, count); /// Seeks to the specified block /// Block to seek to diff --git a/Aaru.Core/Sidecar/BlockMedia.cs b/Aaru.Core/Sidecar/BlockMedia.cs index e4c8c41b3..455e6bb46 100644 --- a/Aaru.Core/Sidecar/BlockMedia.cs +++ b/Aaru.Core/Sidecar/BlockMedia.cs @@ -47,6 +47,7 @@ using Aaru.Console; using Aaru.Decoders.PCMCIA; using Aaru.DiscImages; using Aaru.Filters; +using Aaru.Helpers; using Schemas; using MediaType = Aaru.CommonTypes.Metadata.MediaType; using Tuple = Aaru.Decoders.PCMCIA.Tuple; @@ -1041,7 +1042,7 @@ public sealed partial class Sidecar scpImage.Header.offsets[t] + 1]; scpStream.Position = scpImage.Header.offsets[t]; - scpStream.Read(trackContents, 0, trackContents.Length); + scpStream.EnsureRead(trackContents, 0, trackContents.Length); scpBlockTrackType.Size = (ulong)trackContents.Length; scpBlockTrackType.Checksums = Checksum.GetChecksums(trackContents).ToArray(); } @@ -1146,7 +1147,7 @@ public sealed partial class Sidecar Stream kfStream = kvp.Value.GetDataForkStream(); var trackContents = new byte[kfStream.Length]; kfStream.Position = 0; - kfStream.Read(trackContents, 0, trackContents.Length); + kfStream.EnsureRead(trackContents, 0, trackContents.Length); kfBlockTrackType.Size = (ulong)trackContents.Length; kfBlockTrackType.Checksums = Checksum.GetChecksums(trackContents).ToArray(); @@ -1232,7 +1233,7 @@ public sealed partial class Sidecar dfiBlockTrackType.Image.offset = (ulong)offset; var trackContents = new byte[length]; dfiStream.Position = offset; - dfiStream.Read(trackContents, 0, trackContents.Length); + dfiStream.EnsureRead(trackContents, 0, trackContents.Length); dfiBlockTrackType.Size = (ulong)trackContents.Length; dfiBlockTrackType.Checksums = Checksum.GetChecksums(trackContents).ToArray(); } diff --git a/Aaru.Core/Sidecar/BlockTape.cs b/Aaru.Core/Sidecar/BlockTape.cs index afcbd5e68..e8de0566e 100644 --- a/Aaru.Core/Sidecar/BlockTape.cs +++ b/Aaru.Core/Sidecar/BlockTape.cs @@ -34,6 +34,7 @@ namespace Aaru.Core; using System.Collections.Generic; using System.IO; +using Aaru.Helpers; using Schemas; /// Sidecar operations @@ -133,7 +134,7 @@ public sealed partial class Sidecar if(sectors - doneSectors >= sectorsToRead) { sector = new byte[sectorsToRead * blockSize]; - _fs.Read(sector, 0, sector.Length); + _fs.EnsureRead(sector, 0, sector.Length); UpdateProgress2($"Hashing block {doneSectors} of {sectors} on file {i + 1} of {files.Count}", (long)doneSectors, (long)sectors); @@ -143,7 +144,7 @@ public sealed partial class Sidecar else { sector = new byte[(uint)(sectors - doneSectors) * blockSize]; - _fs.Read(sector, 0, sector.Length); + _fs.EnsureRead(sector, 0, sector.Length); UpdateProgress2($"Hashing block {doneSectors} of {sectors} on file {i + 1} of {files.Count}", (long)doneSectors, (long)sectors); diff --git a/Aaru.Core/Sidecar/Sidecar.cs b/Aaru.Core/Sidecar/Sidecar.cs index 75f2fecca..eb6a63423 100644 --- a/Aaru.Core/Sidecar/Sidecar.cs +++ b/Aaru.Core/Sidecar/Sidecar.cs @@ -40,6 +40,7 @@ using Aaru.CommonTypes; using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Interfaces; using Aaru.Console; +using Aaru.Helpers; using Schemas; public sealed partial class Sidecar @@ -104,7 +105,7 @@ public sealed partial class Sidecar return _sidecar; data = new byte[1048576]; - _fs.Read(data, 0, 1048576); + _fs.EnsureRead(data, 0, 1048576); UpdateProgress("Hashing image file byte {0} of {1}", position, _fi.Length); @@ -114,7 +115,7 @@ public sealed partial class Sidecar } data = new byte[_fi.Length - position]; - _fs.Read(data, 0, (int)(_fi.Length - position)); + _fs.EnsureRead(data, 0, (int)(_fi.Length - position)); UpdateProgress("Hashing image file byte {0} of {1}", position, _fi.Length); diff --git a/Aaru.Devices/Linux/Device.cs b/Aaru.Devices/Linux/Device.cs index 97341a4d2..8337d2661 100644 --- a/Aaru.Devices/Linux/Device.cs +++ b/Aaru.Devices/Linux/Device.cs @@ -35,12 +35,13 @@ namespace Aaru.Devices.Linux; using System; using System.Globalization; using System.IO; -using System.Runtime.InteropServices; using System.Runtime.Versioning; using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Interop; using Aaru.CommonTypes.Structs.Devices.SCSI; using Aaru.Decoders.SecureDigital; +using Aaru.Helpers; +using Marshal = System.Runtime.InteropServices.Marshal; using PlatformID = Aaru.CommonTypes.Interop.PlatformID; using VendorString = Aaru.Decoders.MMC.VendorString; @@ -219,7 +220,7 @@ partial class Device : Devices.Device var usbFs = new FileStream(resolvedLink + "/descriptors", FileMode.Open, FileAccess.Read); var usbBuf = new byte[65536]; - int usbCount = usbFs.Read(usbBuf, 0, 65536); + int usbCount = usbFs.EnsureRead(usbBuf, 0, 65536); dev.UsbDescriptors = new byte[usbCount]; Array.Copy(usbBuf, 0, dev.UsbDescriptors, 0, usbCount); usbFs.Close(); @@ -377,7 +378,7 @@ partial class Device : Devices.Device var cisFs = new FileStream(possibleDir + "/cis", FileMode.Open, FileAccess.Read); var cisBuf = new byte[65536]; - int cisCount = cisFs.Read(cisBuf, 0, 65536); + int cisCount = cisFs.EnsureRead(cisBuf, 0, 65536); dev.Cis = new byte[cisCount]; Array.Copy(cisBuf, 0, dev.Cis, 0, cisCount); cisFs.Close(); diff --git a/Aaru.Filesystems/FAT/File.cs b/Aaru.Filesystems/FAT/File.cs index 579deced0..777c1f99a 100644 --- a/Aaru.Filesystems/FAT/File.cs +++ b/Aaru.Filesystems/FAT/File.cs @@ -146,7 +146,7 @@ public sealed partial class FAT ms.Position = offsetInCluster; buf = new byte[size]; - ms.Read(buf, 0, (int)size); + ms.EnsureRead(buf, 0, (int)size); return ErrorNumber.NoError; } diff --git a/Aaru.Filesystems/FATX/File.cs b/Aaru.Filesystems/FATX/File.cs index 263b9b6dc..0e4723d9f 100644 --- a/Aaru.Filesystems/FATX/File.cs +++ b/Aaru.Filesystems/FATX/File.cs @@ -137,7 +137,7 @@ public sealed partial class XboxFatPlugin ms.Position = offsetInCluster; buf = new byte[size]; - ms.Read(buf, 0, (int)size); + ms.EnsureRead(buf, 0, (int)size); return ErrorNumber.NoError; } diff --git a/Aaru.Filters/Aaru.Filters.csproj b/Aaru.Filters/Aaru.Filters.csproj index 8c15bb516..fc9c55b0a 100644 --- a/Aaru.Filters/Aaru.Filters.csproj +++ b/Aaru.Filters/Aaru.Filters.csproj @@ -43,19 +43,19 @@ true - - - - - - - - - - - - - + + + + + + + + + + + + + @@ -63,13 +63,13 @@ - - - + + + - - - + + + \ No newline at end of file diff --git a/Aaru.Filters/AppleDouble.cs b/Aaru.Filters/AppleDouble.cs index b271a675b..70860f3ad 100644 --- a/Aaru.Filters/AppleDouble.cs +++ b/Aaru.Filters/AppleDouble.cs @@ -184,7 +184,7 @@ public sealed class AppleDouble : IFilter if(prodosStream.Length > 26) { var prodosB = new byte[26]; - prodosStream.Read(prodosB, 0, 26); + prodosStream.EnsureRead(prodosB, 0, 26); _header = Marshal.ByteArrayToStructureBigEndian
(prodosB); prodosStream.Close(); @@ -202,7 +202,7 @@ public sealed class AppleDouble : IFilter if(unixStream.Length > 26) { var unixB = new byte[26]; - unixStream.Read(unixB, 0, 26); + unixStream.EnsureRead(unixB, 0, 26); _header = Marshal.ByteArrayToStructureBigEndian
(unixB); unixStream.Close(); @@ -220,7 +220,7 @@ public sealed class AppleDouble : IFilter if(dosStream.Length > 26) { var dosB = new byte[26]; - dosStream.Read(dosB, 0, 26); + dosStream.EnsureRead(dosB, 0, 26); _header = Marshal.ByteArrayToStructureBigEndian
(dosB); dosStream.Close(); @@ -238,7 +238,7 @@ public sealed class AppleDouble : IFilter if(doslStream.Length > 26) { var doslB = new byte[26]; - doslStream.Read(doslB, 0, 26); + doslStream.EnsureRead(doslB, 0, 26); _header = Marshal.ByteArrayToStructureBigEndian
(doslB); doslStream.Close(); @@ -256,7 +256,7 @@ public sealed class AppleDouble : IFilter if(netatalkStream.Length > 26) { var netatalkB = new byte[26]; - netatalkStream.Read(netatalkB, 0, 26); + netatalkStream.EnsureRead(netatalkB, 0, 26); _header = Marshal.ByteArrayToStructureBigEndian
(netatalkB); netatalkStream.Close(); @@ -274,7 +274,7 @@ public sealed class AppleDouble : IFilter if(daveStream.Length > 26) { var daveB = new byte[26]; - daveStream.Read(daveB, 0, 26); + daveStream.EnsureRead(daveB, 0, 26); _header = Marshal.ByteArrayToStructureBigEndian
(daveB); daveStream.Close(); @@ -292,7 +292,7 @@ public sealed class AppleDouble : IFilter if(osxStream.Length > 26) { var osxB = new byte[26]; - osxStream.Read(osxB, 0, 26); + osxStream.EnsureRead(osxB, 0, 26); _header = Marshal.ByteArrayToStructureBigEndian
(osxB); osxStream.Close(); @@ -312,7 +312,7 @@ public sealed class AppleDouble : IFilter return false; var unarB = new byte[26]; - unarStream.Read(unarB, 0, 26); + unarStream.EnsureRead(unarB, 0, 26); _header = Marshal.ByteArrayToStructureBigEndian
(unarB); unarStream.Close(); @@ -372,7 +372,7 @@ public sealed class AppleDouble : IFilter if(prodosStream.Length > 26) { var prodosB = new byte[26]; - prodosStream.Read(prodosB, 0, 26); + prodosStream.EnsureRead(prodosB, 0, 26); _header = Marshal.ByteArrayToStructureBigEndian
(prodosB); prodosStream.Close(); @@ -390,7 +390,7 @@ public sealed class AppleDouble : IFilter if(unixStream.Length > 26) { var unixB = new byte[26]; - unixStream.Read(unixB, 0, 26); + unixStream.EnsureRead(unixB, 0, 26); _header = Marshal.ByteArrayToStructureBigEndian
(unixB); unixStream.Close(); @@ -408,7 +408,7 @@ public sealed class AppleDouble : IFilter if(dosStream.Length > 26) { var dosB = new byte[26]; - dosStream.Read(dosB, 0, 26); + dosStream.EnsureRead(dosB, 0, 26); _header = Marshal.ByteArrayToStructureBigEndian
(dosB); dosStream.Close(); @@ -426,7 +426,7 @@ public sealed class AppleDouble : IFilter if(doslStream.Length > 26) { var doslB = new byte[26]; - doslStream.Read(doslB, 0, 26); + doslStream.EnsureRead(doslB, 0, 26); _header = Marshal.ByteArrayToStructureBigEndian
(doslB); doslStream.Close(); @@ -444,7 +444,7 @@ public sealed class AppleDouble : IFilter if(netatalkStream.Length > 26) { var netatalkB = new byte[26]; - netatalkStream.Read(netatalkB, 0, 26); + netatalkStream.EnsureRead(netatalkB, 0, 26); _header = Marshal.ByteArrayToStructureBigEndian
(netatalkB); netatalkStream.Close(); @@ -462,7 +462,7 @@ public sealed class AppleDouble : IFilter if(daveStream.Length > 26) { var daveB = new byte[26]; - daveStream.Read(daveB, 0, 26); + daveStream.EnsureRead(daveB, 0, 26); _header = Marshal.ByteArrayToStructureBigEndian
(daveB); daveStream.Close(); @@ -480,7 +480,7 @@ public sealed class AppleDouble : IFilter if(osxStream.Length > 26) { var osxB = new byte[26]; - osxStream.Read(osxB, 0, 26); + osxStream.EnsureRead(osxB, 0, 26); _header = Marshal.ByteArrayToStructureBigEndian
(osxB); osxStream.Close(); @@ -498,7 +498,7 @@ public sealed class AppleDouble : IFilter if(unarStream.Length > 26) { var unarB = new byte[26]; - unarStream.Read(unarB, 0, 26); + unarStream.EnsureRead(unarB, 0, 26); _header = Marshal.ByteArrayToStructureBigEndian
(unarB); unarStream.Close(); @@ -516,7 +516,7 @@ public sealed class AppleDouble : IFilter fs.Seek(0, SeekOrigin.Begin); var hdrB = new byte[26]; - fs.Read(hdrB, 0, 26); + fs.EnsureRead(hdrB, 0, 26); _header = Marshal.ByteArrayToStructureBigEndian
(hdrB); var entries = new Entry[_header.entries]; @@ -524,7 +524,7 @@ public sealed class AppleDouble : IFilter for(var i = 0; i < _header.entries; i++) { var entry = new byte[12]; - fs.Read(entry, 0, 12); + fs.EnsureRead(entry, 0, 12); entries[i] = Marshal.ByteArrayToStructureBigEndian(entry); } @@ -540,7 +540,7 @@ public sealed class AppleDouble : IFilter case EntryId.FileDates: fs.Seek(entry.offset, SeekOrigin.Begin); var datesB = new byte[16]; - fs.Read(datesB, 0, 16); + fs.EnsureRead(datesB, 0, 16); FileDates dates = Marshal.ByteArrayToStructureBigEndian(datesB); @@ -551,7 +551,7 @@ public sealed class AppleDouble : IFilter case EntryId.FileInfo: fs.Seek(entry.offset, SeekOrigin.Begin); var finfo = new byte[entry.length]; - fs.Read(finfo, 0, finfo.Length); + fs.EnsureRead(finfo, 0, finfo.Length); if(_macintoshHome.SequenceEqual(_header.homeFilesystem)) { diff --git a/Aaru.Filters/AppleSingle.cs b/Aaru.Filters/AppleSingle.cs index 120cde87a..23bb4e438 100644 --- a/Aaru.Filters/AppleSingle.cs +++ b/Aaru.Filters/AppleSingle.cs @@ -190,7 +190,7 @@ public sealed class AppleSingle : IFilter var hdrB = new byte[26]; stream.Seek(0, SeekOrigin.Begin); - stream.Read(hdrB, 0, 26); + stream.EnsureRead(hdrB, 0, 26); _header = Marshal.ByteArrayToStructureBigEndian
(hdrB); return _header.magic == MAGIC && _header.version is VERSION or VERSION2; @@ -208,7 +208,7 @@ public sealed class AppleSingle : IFilter return false; var hdrB = new byte[26]; - fstream.Read(hdrB, 0, 26); + fstream.EnsureRead(hdrB, 0, 26); _header = Marshal.ByteArrayToStructureBigEndian
(hdrB); fstream.Close(); @@ -223,7 +223,7 @@ public sealed class AppleSingle : IFilter ms.Seek(0, SeekOrigin.Begin); var hdrB = new byte[26]; - ms.Read(hdrB, 0, 26); + ms.EnsureRead(hdrB, 0, 26); _header = Marshal.ByteArrayToStructureBigEndian
(hdrB); var entries = new Entry[_header.entries]; @@ -231,7 +231,7 @@ public sealed class AppleSingle : IFilter for(var i = 0; i < _header.entries; i++) { var entry = new byte[12]; - ms.Read(entry, 0, 12); + ms.EnsureRead(entry, 0, 12); entries[i] = Marshal.ByteArrayToStructureBigEndian(entry); } @@ -248,7 +248,7 @@ public sealed class AppleSingle : IFilter case AppleSingleEntryID.FileDates: ms.Seek(entry.offset, SeekOrigin.Begin); var datesB = new byte[16]; - ms.Read(datesB, 0, 16); + ms.EnsureRead(datesB, 0, 16); FileDates dates = Marshal.ByteArrayToStructureBigEndian(datesB); @@ -259,7 +259,7 @@ public sealed class AppleSingle : IFilter case AppleSingleEntryID.FileInfo: ms.Seek(entry.offset, SeekOrigin.Begin); var finfo = new byte[entry.length]; - ms.Read(finfo, 0, finfo.Length); + ms.EnsureRead(finfo, 0, finfo.Length); if(_macintoshHome.SequenceEqual(_header.homeFilesystem)) { @@ -309,7 +309,7 @@ public sealed class AppleSingle : IFilter stream.Seek(0, SeekOrigin.Begin); var hdrB = new byte[26]; - stream.Read(hdrB, 0, 26); + stream.EnsureRead(hdrB, 0, 26); _header = Marshal.ByteArrayToStructureBigEndian
(hdrB); var entries = new Entry[_header.entries]; @@ -317,7 +317,7 @@ public sealed class AppleSingle : IFilter for(var i = 0; i < _header.entries; i++) { var entry = new byte[12]; - stream.Read(entry, 0, 12); + stream.EnsureRead(entry, 0, 12); entries[i] = Marshal.ByteArrayToStructureBigEndian(entry); } @@ -334,7 +334,7 @@ public sealed class AppleSingle : IFilter case AppleSingleEntryID.FileDates: stream.Seek(entry.offset, SeekOrigin.Begin); var datesB = new byte[16]; - stream.Read(datesB, 0, 16); + stream.EnsureRead(datesB, 0, 16); FileDates dates = Marshal.ByteArrayToStructureBigEndian(datesB); @@ -345,7 +345,7 @@ public sealed class AppleSingle : IFilter case AppleSingleEntryID.FileInfo: stream.Seek(entry.offset, SeekOrigin.Begin); var finfo = new byte[entry.length]; - stream.Read(finfo, 0, finfo.Length); + stream.EnsureRead(finfo, 0, finfo.Length); if(_macintoshHome.SequenceEqual(_header.homeFilesystem)) { @@ -396,7 +396,7 @@ public sealed class AppleSingle : IFilter fs.Seek(0, SeekOrigin.Begin); var hdrB = new byte[26]; - fs.Read(hdrB, 0, 26); + fs.EnsureRead(hdrB, 0, 26); _header = Marshal.ByteArrayToStructureBigEndian
(hdrB); var entries = new Entry[_header.entries]; @@ -404,7 +404,7 @@ public sealed class AppleSingle : IFilter for(var i = 0; i < _header.entries; i++) { var entry = new byte[12]; - fs.Read(entry, 0, 12); + fs.EnsureRead(entry, 0, 12); entries[i] = Marshal.ByteArrayToStructureBigEndian(entry); } @@ -421,7 +421,7 @@ public sealed class AppleSingle : IFilter case AppleSingleEntryID.FileDates: fs.Seek(entry.offset, SeekOrigin.Begin); var datesB = new byte[16]; - fs.Read(datesB, 0, 16); + fs.EnsureRead(datesB, 0, 16); FileDates dates = Marshal.ByteArrayToStructureBigEndian(datesB); @@ -432,7 +432,7 @@ public sealed class AppleSingle : IFilter case AppleSingleEntryID.FileInfo: fs.Seek(entry.offset, SeekOrigin.Begin); var finfo = new byte[entry.length]; - fs.Read(finfo, 0, finfo.Length); + fs.EnsureRead(finfo, 0, finfo.Length); if(_macintoshHome.SequenceEqual(_header.homeFilesystem)) { diff --git a/Aaru.Filters/BZip2.cs b/Aaru.Filters/BZip2.cs index 2a42f2eba..5bc6e76ff 100644 --- a/Aaru.Filters/BZip2.cs +++ b/Aaru.Filters/BZip2.cs @@ -36,6 +36,7 @@ using System; using System.IO; using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Interfaces; +using Aaru.Helpers; using Ionic.BZip2; /// @@ -97,7 +98,7 @@ public class BZip2 : IFilter var buffer = new byte[4]; stream.Seek(0, SeekOrigin.Begin); - stream.Read(buffer, 0, 4); + stream.EnsureRead(buffer, 0, 4); stream.Seek(0, SeekOrigin.Begin); if(buffer[0] != 0x42 || @@ -111,7 +112,7 @@ public class BZip2 : IFilter return true; stream.Seek(-512, SeekOrigin.End); - stream.Read(buffer, 0, 4); + stream.EnsureRead(buffer, 0, 4); stream.Seek(0, SeekOrigin.Begin); // Check it is not an UDIF @@ -128,7 +129,7 @@ public class BZip2 : IFilter var buffer = new byte[4]; stream.Seek(0, SeekOrigin.Begin); - stream.Read(buffer, 0, 4); + stream.EnsureRead(buffer, 0, 4); stream.Seek(0, SeekOrigin.Begin); if(buffer[0] != 0x42 || @@ -142,7 +143,7 @@ public class BZip2 : IFilter return true; stream.Seek(-512, SeekOrigin.End); - stream.Read(buffer, 0, 4); + stream.EnsureRead(buffer, 0, 4); stream.Seek(0, SeekOrigin.Begin); // Check it is not an UDIF diff --git a/Aaru.Filters/ForcedSeekStream.cs b/Aaru.Filters/ForcedSeekStream.cs index 5f0e3eca7..cb845976d 100644 --- a/Aaru.Filters/ForcedSeekStream.cs +++ b/Aaru.Filters/ForcedSeekStream.cs @@ -34,6 +34,7 @@ namespace Aaru.Filters; using System; using System.IO; +using Aaru.Helpers; /// /// ForcedSeekStream allows to seek a forward-readable stream (like System.IO.Compression streams) by doing the @@ -106,7 +107,7 @@ public sealed class ForcedSeekStream : Stream where T : Stream do { var buffer = new byte[BUFFER_LEN]; - read = _baseStream.Read(buffer, 0, BUFFER_LEN); + read = _baseStream.EnsureRead(buffer, 0, BUFFER_LEN); _backStream.Write(buffer, 0, read); } while(read == BUFFER_LEN); @@ -145,7 +146,7 @@ public sealed class ForcedSeekStream : Stream where T : Stream while(left > 0) { - int done = _baseStream.Read(buffer, bufPos, left); + int done = _baseStream.EnsureRead(buffer, bufPos, left); left -= done; bufPos += done; } @@ -159,7 +160,7 @@ public sealed class ForcedSeekStream : Stream where T : Stream while(left > 0) { - int done = _baseStream.Read(buffer, bufPos, left); + int done = _baseStream.EnsureRead(buffer, bufPos, left); left -= done; bufPos += done; } @@ -181,13 +182,13 @@ public sealed class ForcedSeekStream : Stream where T : Stream count = (int)(_streamLength - _backStream.Position); if(_backStream.Position + count <= _backStream.Length) - return _backStream.Read(buffer, offset, count); + return _backStream.EnsureRead(buffer, offset, count); long oldPosition = _backStream.Position; SetPosition(_backStream.Position + count); SetPosition(oldPosition); - return _backStream.Read(buffer, offset, count); + return _backStream.EnsureRead(buffer, offset, count); } /// diff --git a/Aaru.Filters/GZip.cs b/Aaru.Filters/GZip.cs index 8ffc1d186..5a5714d5e 100644 --- a/Aaru.Filters/GZip.cs +++ b/Aaru.Filters/GZip.cs @@ -86,7 +86,7 @@ public sealed class GZip : IFilter var buffer = new byte[3]; stream.Seek(0, SeekOrigin.Begin); - stream.Read(buffer, 0, 3); + stream.EnsureRead(buffer, 0, 3); stream.Seek(0, SeekOrigin.Begin); return buffer[0] == 0x1F && buffer[1] == 0x8B && buffer[2] == 0x08; @@ -102,7 +102,7 @@ public sealed class GZip : IFilter var buffer = new byte[3]; stream.Seek(0, SeekOrigin.Begin); - stream.Read(buffer, 0, 3); + stream.EnsureRead(buffer, 0, 3); stream.Seek(0, SeekOrigin.Begin); return buffer[0] == 0x1F && buffer[1] == 0x8B && buffer[2] == 0x08; @@ -118,9 +118,9 @@ public sealed class GZip : IFilter BasePath = null; _dataStream.Seek(4, SeekOrigin.Begin); - _dataStream.Read(mtimeB, 0, 4); + _dataStream.EnsureRead(mtimeB, 0, 4); _dataStream.Seek(-4, SeekOrigin.End); - _dataStream.Read(isizeB, 0, 4); + _dataStream.EnsureRead(isizeB, 0, 4); _dataStream.Seek(0, SeekOrigin.Begin); var mtime = BitConverter.ToUInt32(mtimeB, 0); @@ -145,9 +145,9 @@ public sealed class GZip : IFilter BasePath = null; _dataStream.Seek(4, SeekOrigin.Begin); - _dataStream.Read(mtimeB, 0, 4); + _dataStream.EnsureRead(mtimeB, 0, 4); _dataStream.Seek(-4, SeekOrigin.End); - _dataStream.Read(isizeB, 0, 4); + _dataStream.EnsureRead(isizeB, 0, 4); _dataStream.Seek(0, SeekOrigin.Begin); var mtime = BitConverter.ToUInt32(mtimeB, 0); @@ -172,9 +172,9 @@ public sealed class GZip : IFilter BasePath = System.IO.Path.GetFullPath(path); _dataStream.Seek(4, SeekOrigin.Begin); - _dataStream.Read(mtimeB, 0, 4); + _dataStream.EnsureRead(mtimeB, 0, 4); _dataStream.Seek(-4, SeekOrigin.End); - _dataStream.Read(isizeB, 0, 4); + _dataStream.EnsureRead(isizeB, 0, 4); _dataStream.Seek(0, SeekOrigin.Begin); var mtime = BitConverter.ToUInt32(mtimeB, 0); diff --git a/Aaru.Filters/LZip.cs b/Aaru.Filters/LZip.cs index b30c6c861..8c77cdaec 100644 --- a/Aaru.Filters/LZip.cs +++ b/Aaru.Filters/LZip.cs @@ -36,6 +36,7 @@ using System; using System.IO; using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Interfaces; +using Aaru.Helpers; using SharpCompress.Compressors; using SharpCompress.Compressors.LZMA; @@ -86,7 +87,7 @@ public sealed class LZip : IFilter var buffer = new byte[5]; stream.Seek(0, SeekOrigin.Begin); - stream.Read(buffer, 0, 5); + stream.EnsureRead(buffer, 0, 5); stream.Seek(0, SeekOrigin.Begin); return buffer[0] == 0x4C && buffer[1] == 0x5A && buffer[2] == 0x49 && buffer[3] == 0x50 && buffer[4] == 0x01; @@ -102,7 +103,7 @@ public sealed class LZip : IFilter var buffer = new byte[5]; stream.Seek(0, SeekOrigin.Begin); - stream.Read(buffer, 0, 5); + stream.EnsureRead(buffer, 0, 5); stream.Seek(0, SeekOrigin.Begin); return buffer[0] == 0x4C && buffer[1] == 0x5A && buffer[2] == 0x49 && buffer[3] == 0x50 && buffer[4] == 0x01; @@ -131,7 +132,7 @@ public sealed class LZip : IFilter LastWriteTime = CreationTime; var tmp = new byte[8]; _dataStream.Seek(-16, SeekOrigin.End); - _dataStream.Read(tmp, 0, 8); + _dataStream.EnsureRead(tmp, 0, 8); DataForkLength = BitConverter.ToInt64(tmp, 0); _dataStream.Seek(0, SeekOrigin.Begin); _innerStream = new ForcedSeekStream(DataForkLength, _dataStream, CompressionMode.Decompress); @@ -150,7 +151,7 @@ public sealed class LZip : IFilter LastWriteTime = fi.LastWriteTimeUtc; var tmp = new byte[8]; _dataStream.Seek(-16, SeekOrigin.End); - _dataStream.Read(tmp, 0, 8); + _dataStream.EnsureRead(tmp, 0, 8); DataForkLength = BitConverter.ToInt64(tmp, 0); _dataStream.Seek(0, SeekOrigin.Begin); _innerStream = new ForcedSeekStream(DataForkLength, _dataStream, CompressionMode.Decompress); diff --git a/Aaru.Filters/MacBinary.cs b/Aaru.Filters/MacBinary.cs index 3d2c5d87a..1c71b7eeb 100644 --- a/Aaru.Filters/MacBinary.cs +++ b/Aaru.Filters/MacBinary.cs @@ -164,7 +164,7 @@ public sealed class MacBinary : IFilter var hdrB = new byte[128]; stream.Seek(0, SeekOrigin.Begin); - stream.Read(hdrB, 0, 128); + stream.EnsureRead(hdrB, 0, 128); _header = Marshal.ByteArrayToStructureBigEndian
(hdrB); return _header.magic == MAGIC || _header.version == 0 && _header.filename[0] > 0 && _header.filename[0] < 64 && @@ -184,7 +184,7 @@ public sealed class MacBinary : IFilter return false; var hdrB = new byte[128]; - fstream.Read(hdrB, 0, 128); + fstream.EnsureRead(hdrB, 0, 128); _header = Marshal.ByteArrayToStructureBigEndian
(hdrB); fstream.Close(); @@ -201,7 +201,7 @@ public sealed class MacBinary : IFilter ms.Seek(0, SeekOrigin.Begin); var hdrB = new byte[128]; - ms.Read(hdrB, 0, 128); + ms.EnsureRead(hdrB, 0, 128); _header = Marshal.ByteArrayToStructureBigEndian
(hdrB); uint blocks = 1; @@ -235,7 +235,7 @@ public sealed class MacBinary : IFilter stream.Seek(0, SeekOrigin.Begin); var hdrB = new byte[128]; - stream.Read(hdrB, 0, 128); + stream.EnsureRead(hdrB, 0, 128); _header = Marshal.ByteArrayToStructureBigEndian
(hdrB); uint blocks = 1; @@ -270,7 +270,7 @@ public sealed class MacBinary : IFilter fs.Seek(0, SeekOrigin.Begin); var hdrB = new byte[128]; - fs.Read(hdrB, 0, 128); + fs.EnsureRead(hdrB, 0, 128); _header = Marshal.ByteArrayToStructureBigEndian
(hdrB); uint blocks = 1; diff --git a/Aaru.Filters/OffsetStream.cs b/Aaru.Filters/OffsetStream.cs index 6fe5dad43..4f0c19123 100644 --- a/Aaru.Filters/OffsetStream.cs +++ b/Aaru.Filters/OffsetStream.cs @@ -38,6 +38,7 @@ namespace Aaru.Filters { using System; using System.IO; + using Aaru.Helpers; using Microsoft.Win32.SafeHandles; /// Creates a stream that is a subset of another stream. @@ -642,7 +643,7 @@ namespace Aaru.Filters if(_baseStream.Position + count > _streamEnd + 1) throw new IOException("Cannot read past stream end."); - return _baseStream.Read(buffer, offset, count); + return _baseStream.EnsureRead(buffer, offset, count); } /// diff --git a/Aaru.Filters/PCExchange.cs b/Aaru.Filters/PCExchange.cs index fef643665..dfff8187d 100644 --- a/Aaru.Filters/PCExchange.cs +++ b/Aaru.Filters/PCExchange.cs @@ -132,7 +132,7 @@ public sealed class PcExchange : IFilter { var datEntry = new Entry(); var datEntryB = new byte[Marshal.SizeOf(datEntry)]; - finderDatStream.Read(datEntryB, 0, Marshal.SizeOf(datEntry)); + finderDatStream.EnsureRead(datEntryB, 0, Marshal.SizeOf(datEntry)); datEntry = Helpers.Marshal.ByteArrayToStructureBigEndian(datEntryB); // TODO: Add support for encoding on filters @@ -190,7 +190,7 @@ public sealed class PcExchange : IFilter { var datEntry = new Entry(); var datEntryB = new byte[Marshal.SizeOf(datEntry)]; - finderDatStream.Read(datEntryB, 0, Marshal.SizeOf(datEntry)); + finderDatStream.EnsureRead(datEntryB, 0, Marshal.SizeOf(datEntry)); datEntry = Helpers.Marshal.ByteArrayToStructureBigEndian(datEntryB); string macName = StringHandlers.PascalToString(datEntry.macName, Encoding.GetEncoding("macintosh")); diff --git a/Aaru.Filters/XZ.cs b/Aaru.Filters/XZ.cs index 975ae5982..cf8c983b8 100644 --- a/Aaru.Filters/XZ.cs +++ b/Aaru.Filters/XZ.cs @@ -36,6 +36,7 @@ using System; using System.IO; using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Interfaces; +using Aaru.Helpers; using SharpCompress.Compressors.Xz; /// @@ -90,9 +91,9 @@ public sealed class XZ : IFilter return false; stream.Seek(0, SeekOrigin.Begin); - stream.Read(buffer, 0, 6); + stream.EnsureRead(buffer, 0, 6); stream.Seek(-2, SeekOrigin.End); - stream.Read(footer, 0, 2); + stream.EnsureRead(footer, 0, 2); stream.Seek(0, SeekOrigin.Begin); return buffer[0] == 0xFD && buffer[1] == 0x37 && buffer[2] == 0x7A && buffer[3] == 0x58 && buffer[4] == 0x5A && @@ -113,9 +114,9 @@ public sealed class XZ : IFilter return false; stream.Seek(0, SeekOrigin.Begin); - stream.Read(buffer, 0, 6); + stream.EnsureRead(buffer, 0, 6); stream.Seek(-2, SeekOrigin.End); - stream.Read(footer, 0, 2); + stream.EnsureRead(footer, 0, 2); stream.Seek(0, SeekOrigin.Begin); return buffer[0] == 0xFD && buffer[1] == 0x37 && buffer[2] == 0x7A && buffer[3] == 0x58 && buffer[4] == 0x5A && @@ -201,7 +202,7 @@ public sealed class XZ : IFilter // Seek to footer backwards size field _dataStream.Seek(-8, SeekOrigin.End); var tmp = new byte[4]; - _dataStream.Read(tmp, 0, 4); + _dataStream.EnsureRead(tmp, 0, 4); uint backwardSize = (BitConverter.ToUInt32(tmp, 0) + 1) * 4; // Seek to first indexed record @@ -209,14 +210,14 @@ public sealed class XZ : IFilter // Skip compressed size tmp = new byte[backwardSize - 2]; - _dataStream.Read(tmp, 0, tmp.Length); + _dataStream.EnsureRead(tmp, 0, tmp.Length); ulong number = 0; int ignore = Decode(tmp, tmp.Length, ref number); // Get compressed size _dataStream.Seek(-12 - (backwardSize - 2 - ignore), SeekOrigin.End); tmp = new byte[backwardSize - 2 - ignore]; - _dataStream.Read(tmp, 0, tmp.Length); + _dataStream.EnsureRead(tmp, 0, tmp.Length); Decode(tmp, tmp.Length, ref number); DataForkLength = (long)number; diff --git a/Aaru.Helpers b/Aaru.Helpers index 368e40d7b..f44172edb 160000 --- a/Aaru.Helpers +++ b/Aaru.Helpers @@ -1 +1 @@ -Subproject commit 368e40d7bd9e2d7ec307e1babef1df3fbf9b2da9 +Subproject commit f44172edb9be5513611691ccf16f7ff6d7bf9db6 diff --git a/Aaru.Images/AaruFormat/Helpers.cs b/Aaru.Images/AaruFormat/Helpers.cs index c82db8641..e52f3ff4e 100644 --- a/Aaru.Images/AaruFormat/Helpers.cs +++ b/Aaru.Images/AaruFormat/Helpers.cs @@ -253,7 +253,7 @@ public sealed partial class AaruFormat _imageStream.Position = _outMemoryDdtPosition + Marshal.SizeOf(); _imageStream.Position += (long)(sectorAddress * sizeof(ulong)); var temp = new byte[sizeof(ulong)]; - _imageStream.Read(temp, 0, sizeof(ulong)); + _imageStream.EnsureRead(temp, 0, sizeof(ulong)); _imageStream.Position = oldPosition; entry = BitConverter.ToUInt64(temp, 0); diff --git a/Aaru.Images/AaruFormat/Identify.cs b/Aaru.Images/AaruFormat/Identify.cs index 47d0196a4..0dc432dc0 100644 --- a/Aaru.Images/AaruFormat/Identify.cs +++ b/Aaru.Images/AaruFormat/Identify.cs @@ -48,7 +48,7 @@ public sealed partial class AaruFormat return false; _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); _header = Marshal.ByteArrayToStructureLittleEndian(_structureBytes); return _header.identifier is DIC_MAGIC or AARU_MAGIC && _header.imageMajorVersion <= AARUFMT_VERSION; diff --git a/Aaru.Images/AaruFormat/Read.cs b/Aaru.Images/AaruFormat/Read.cs index 39f794f12..31dbca083 100644 --- a/Aaru.Images/AaruFormat/Read.cs +++ b/Aaru.Images/AaruFormat/Read.cs @@ -49,6 +49,7 @@ using Aaru.CommonTypes.Structs; using Aaru.Compression; using Aaru.Console; using Aaru.Decoders.CD; +using Aaru.Helpers; using Schemas; using Marshal = Aaru.Helpers.Marshal; using Session = Aaru.CommonTypes.Structs.Session; @@ -68,7 +69,7 @@ public sealed partial class AaruFormat return ErrorNumber.InvalidArgument; _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); _header = Marshal.ByteArrayToStructureLittleEndian(_structureBytes); if(_header.imageMajorVersion > AARUFMT_VERSION) @@ -88,7 +89,7 @@ public sealed partial class AaruFormat // Read the index header _imageStream.Position = (long)_header.indexOffset; _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); IndexHeader idxHeader = Marshal.SpanToStructureLittleEndian(_structureBytes); if(idxHeader.identifier != BlockType.Index && @@ -103,7 +104,7 @@ public sealed partial class AaruFormat { _imageStream.Position = (long)_header.indexOffset; _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); IndexHeader2 idxHeader2 = Marshal.SpanToStructureLittleEndian(_structureBytes); AaruConsole.DebugWriteLine("Aaru Format plugin", "Index at {0} contains {1} entries", _header.indexOffset, @@ -117,7 +118,7 @@ public sealed partial class AaruFormat for(ulong i = 0; i < idxHeader2.entries; i++) { _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); IndexEntry entry = Marshal.SpanToStructureLittleEndian(_structureBytes); AaruConsole.DebugWriteLine("Aaru Format plugin", @@ -140,7 +141,7 @@ public sealed partial class AaruFormat for(ushort i = 0; i < idxHeader.entries; i++) { _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); IndexEntry entry = Marshal.SpanToStructureLittleEndian(_structureBytes); AaruConsole.DebugWriteLine("Aaru Format plugin", @@ -173,7 +174,7 @@ public sealed partial class AaruFormat _imageStream.Position = (long)entry.offset; _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); BlockHeader blockHeader = Marshal.SpanToStructureLittleEndian(_structureBytes); _imageInfo.ImageSize += blockHeader.cmpLength; @@ -228,8 +229,8 @@ public sealed partial class AaruFormat DateTime startDecompress = DateTime.Now; var compressedTag = new byte[blockHeader.cmpLength - LZMA_PROPERTIES_LENGTH]; var lzmaProperties = new byte[LZMA_PROPERTIES_LENGTH]; - _imageStream.Read(lzmaProperties, 0, LZMA_PROPERTIES_LENGTH); - _imageStream.Read(compressedTag, 0, compressedTag.Length); + _imageStream.EnsureRead(lzmaProperties, 0, LZMA_PROPERTIES_LENGTH); + _imageStream.EnsureRead(compressedTag, 0, compressedTag.Length); data = new byte[blockHeader.length]; int decompressedLength = LZMA.DecodeBuffer(compressedTag, data, lzmaProperties); @@ -256,7 +257,7 @@ public sealed partial class AaruFormat else if(blockHeader.compression == CompressionType.None) { data = new byte[blockHeader.length]; - _imageStream.Read(data, 0, (int)blockHeader.length); + _imageStream.EnsureRead(data, 0, (int)blockHeader.length); AaruConsole.DebugWriteLine("Aaru Format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); @@ -410,7 +411,7 @@ public sealed partial class AaruFormat break; case BlockType.DeDuplicationTable: _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); DdtHeader ddtHeader = Marshal.SpanToStructureLittleEndian(_structureBytes); _imageInfo.ImageSize += ddtHeader.cmpLength; @@ -434,8 +435,8 @@ public sealed partial class AaruFormat DateTime ddtStart = DateTime.UtcNow; var compressedDdt = new byte[ddtHeader.cmpLength - LZMA_PROPERTIES_LENGTH]; var lzmaProperties = new byte[LZMA_PROPERTIES_LENGTH]; - _imageStream.Read(lzmaProperties, 0, LZMA_PROPERTIES_LENGTH); - _imageStream.Read(compressedDdt, 0, compressedDdt.Length); + _imageStream.EnsureRead(lzmaProperties, 0, LZMA_PROPERTIES_LENGTH); + _imageStream.EnsureRead(compressedDdt, 0, compressedDdt.Length); var decompressedDdt = new byte[ddtHeader.length]; var decompressedLength = @@ -496,8 +497,8 @@ public sealed partial class AaruFormat DateTime ddtStart = DateTime.UtcNow; var compressedDdt = new byte[ddtHeader.cmpLength - LZMA_PROPERTIES_LENGTH]; var lzmaProperties = new byte[LZMA_PROPERTIES_LENGTH]; - _imageStream.Read(lzmaProperties, 0, LZMA_PROPERTIES_LENGTH); - _imageStream.Read(compressedDdt, 0, compressedDdt.Length); + _imageStream.EnsureRead(lzmaProperties, 0, LZMA_PROPERTIES_LENGTH); + _imageStream.EnsureRead(compressedDdt, 0, compressedDdt.Length); var decompressedLength = (ulong)LZMA.DecodeBuffer(compressedDdt, decompressedDdt, lzmaProperties); @@ -522,7 +523,7 @@ public sealed partial class AaruFormat break; case CompressionType.None: - _imageStream.Read(decompressedDdt, 0, decompressedDdt.Length); + _imageStream.EnsureRead(decompressedDdt, 0, decompressedDdt.Length); AaruConsole.DebugWriteLine("Aaru Format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); @@ -563,7 +564,7 @@ public sealed partial class AaruFormat // Logical geometry block. It doesn't have a CRC coz, well, it's not so important case BlockType.GeometryBlock: _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); _geometryBlock = Marshal.SpanToStructureLittleEndian(_structureBytes); if(_geometryBlock.identifier == BlockType.GeometryBlock) @@ -586,7 +587,7 @@ public sealed partial class AaruFormat // Metadata block case BlockType.MetadataBlock: _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); MetadataBlock metadataBlock = Marshal.SpanToStructureLittleEndian(_structureBytes); @@ -603,7 +604,7 @@ public sealed partial class AaruFormat var metadata = new byte[metadataBlock.blockSize]; _imageStream.Position = (long)entry.offset; - _imageStream.Read(metadata, 0, metadata.Length); + _imageStream.EnsureRead(metadata, 0, metadata.Length); if(metadataBlock.mediaSequence > 0 && metadataBlock.lastMediaSequence > 0) @@ -752,7 +753,7 @@ public sealed partial class AaruFormat // Optical disc tracks block case BlockType.TracksBlock: _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); TracksHeader tracksHeader = Marshal.SpanToStructureLittleEndian(_structureBytes); if(tracksHeader.identifier != BlockType.TracksBlock) @@ -765,7 +766,7 @@ public sealed partial class AaruFormat } _structureBytes = new byte[Marshal.SizeOf() * tracksHeader.entries]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); Crc64Context.Data(_structureBytes, out byte[] trksCrc); if(BitConverter.ToUInt64(trksCrc, 0) != tracksHeader.crc64) @@ -789,7 +790,7 @@ public sealed partial class AaruFormat for(ushort i = 0; i < tracksHeader.entries; i++) { _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); TrackEntry trackEntry = Marshal.ByteArrayToStructureLittleEndian(_structureBytes); @@ -834,7 +835,7 @@ public sealed partial class AaruFormat // CICM XML metadata block case BlockType.CicmBlock: _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); CicmMetadataBlock cicmBlock = Marshal.SpanToStructureLittleEndian(_structureBytes); @@ -849,7 +850,7 @@ public sealed partial class AaruFormat GC.GetTotalMemory(false)); var cicmBytes = new byte[cicmBlock.length]; - _imageStream.Read(cicmBytes, 0, cicmBytes.Length); + _imageStream.EnsureRead(cicmBytes, 0, cicmBytes.Length); var cicmMs = new MemoryStream(cicmBytes); var cicmXs = new XmlSerializer(typeof(CICMMetadataType)); @@ -875,7 +876,7 @@ public sealed partial class AaruFormat // Dump hardware block case BlockType.DumpHardwareBlock: _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); DumpHardwareHeader dumpBlock = Marshal.SpanToStructureLittleEndian(_structureBytes); @@ -890,7 +891,7 @@ public sealed partial class AaruFormat GC.GetTotalMemory(false)); _structureBytes = new byte[dumpBlock.length]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); Crc64Context.Data(_structureBytes, out byte[] dumpCrc); if(BitConverter.ToUInt64(dumpCrc, 0) != dumpBlock.crc64) @@ -909,7 +910,7 @@ public sealed partial class AaruFormat for(ushort i = 0; i < dumpBlock.entries; i++) { _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); DumpHardwareEntry dumpEntry = Marshal.SpanToStructureLittleEndian(_structureBytes); @@ -925,7 +926,7 @@ public sealed partial class AaruFormat if(dumpEntry.manufacturerLength > 0) { tmp = new byte[dumpEntry.manufacturerLength - 1]; - _imageStream.Read(tmp, 0, tmp.Length); + _imageStream.EnsureRead(tmp, 0, tmp.Length); _imageStream.Position += 1; dump.Manufacturer = Encoding.UTF8.GetString(tmp); } @@ -933,7 +934,7 @@ public sealed partial class AaruFormat if(dumpEntry.modelLength > 0) { tmp = new byte[dumpEntry.modelLength - 1]; - _imageStream.Read(tmp, 0, tmp.Length); + _imageStream.EnsureRead(tmp, 0, tmp.Length); _imageStream.Position += 1; dump.Model = Encoding.UTF8.GetString(tmp); } @@ -941,7 +942,7 @@ public sealed partial class AaruFormat if(dumpEntry.revisionLength > 0) { tmp = new byte[dumpEntry.revisionLength - 1]; - _imageStream.Read(tmp, 0, tmp.Length); + _imageStream.EnsureRead(tmp, 0, tmp.Length); _imageStream.Position += 1; dump.Revision = Encoding.UTF8.GetString(tmp); } @@ -949,7 +950,7 @@ public sealed partial class AaruFormat if(dumpEntry.firmwareLength > 0) { tmp = new byte[dumpEntry.firmwareLength - 1]; - _imageStream.Read(tmp, 0, tmp.Length); + _imageStream.EnsureRead(tmp, 0, tmp.Length); _imageStream.Position += 1; dump.Firmware = Encoding.UTF8.GetString(tmp); } @@ -957,7 +958,7 @@ public sealed partial class AaruFormat if(dumpEntry.serialLength > 0) { tmp = new byte[dumpEntry.serialLength - 1]; - _imageStream.Read(tmp, 0, tmp.Length); + _imageStream.EnsureRead(tmp, 0, tmp.Length); _imageStream.Position += 1; dump.Serial = Encoding.UTF8.GetString(tmp); } @@ -965,7 +966,7 @@ public sealed partial class AaruFormat if(dumpEntry.softwareNameLength > 0) { tmp = new byte[dumpEntry.softwareNameLength - 1]; - _imageStream.Read(tmp, 0, tmp.Length); + _imageStream.EnsureRead(tmp, 0, tmp.Length); _imageStream.Position += 1; dump.Software.Name = Encoding.UTF8.GetString(tmp); } @@ -973,7 +974,7 @@ public sealed partial class AaruFormat if(dumpEntry.softwareVersionLength > 0) { tmp = new byte[dumpEntry.softwareVersionLength - 1]; - _imageStream.Read(tmp, 0, tmp.Length); + _imageStream.EnsureRead(tmp, 0, tmp.Length); _imageStream.Position += 1; dump.Software.Version = Encoding.UTF8.GetString(tmp); } @@ -981,7 +982,7 @@ public sealed partial class AaruFormat if(dumpEntry.softwareOperatingSystemLength > 0) { tmp = new byte[dumpEntry.softwareOperatingSystemLength - 1]; - _imageStream.Read(tmp, 0, tmp.Length); + _imageStream.EnsureRead(tmp, 0, tmp.Length); _imageStream.Position += 1; dump.Software.OperatingSystem = Encoding.UTF8.GetString(tmp); } @@ -990,7 +991,7 @@ public sealed partial class AaruFormat for(uint j = 0; j < dumpEntry.extents; j++) { - _imageStream.Read(tmp, 0, tmp.Length); + _imageStream.EnsureRead(tmp, 0, tmp.Length); dump.Extents[j] = new ExtentType { @@ -1016,7 +1017,7 @@ public sealed partial class AaruFormat // Tape partition block case BlockType.TapePartitionBlock: _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); TapePartitionHeader partitionHeader = Marshal.SpanToStructureLittleEndian(_structureBytes); @@ -1028,7 +1029,7 @@ public sealed partial class AaruFormat entry.offset); var tapePartitionBytes = new byte[partitionHeader.length]; - _imageStream.Read(tapePartitionBytes, 0, tapePartitionBytes.Length); + _imageStream.EnsureRead(tapePartitionBytes, 0, tapePartitionBytes.Length); Span tapePartitions = MemoryMarshal.Cast(tapePartitionBytes); @@ -1050,7 +1051,7 @@ public sealed partial class AaruFormat // Tape file block case BlockType.TapeFileBlock: _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); TapeFileHeader fileHeader = Marshal.SpanToStructureLittleEndian(_structureBytes); @@ -1061,7 +1062,7 @@ public sealed partial class AaruFormat entry.offset); var tapeFileBytes = new byte[fileHeader.length]; - _imageStream.Read(tapeFileBytes, 0, tapeFileBytes.Length); + _imageStream.EnsureRead(tapeFileBytes, 0, tapeFileBytes.Length); Span tapeFiles = MemoryMarshal.Cast(tapeFileBytes); Files = new List(); @@ -1081,7 +1082,7 @@ public sealed partial class AaruFormat // Optical disc tracks block case BlockType.CompactDiscIndexesBlock: _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); CompactDiscIndexesHeader indexesHeader = Marshal.SpanToStructureLittleEndian(_structureBytes); @@ -1096,7 +1097,7 @@ public sealed partial class AaruFormat } _structureBytes = new byte[Marshal.SizeOf() * indexesHeader.entries]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); Crc64Context.Data(_structureBytes, out byte[] idsxCrc); if(BitConverter.ToUInt64(idsxCrc, 0) != indexesHeader.crc64) @@ -1118,7 +1119,7 @@ public sealed partial class AaruFormat for(ushort i = 0; i < indexesHeader.entries; i++) { _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); compactDiscIndexes.Add(Marshal. ByteArrayToStructureLittleEndian< @@ -1495,7 +1496,7 @@ public sealed partial class AaruFormat // Read block header _imageStream.Position = (long)blockOffset; _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); blockHeader = Marshal.SpanToStructureLittleEndian(_structureBytes); // Decompress block @@ -1507,7 +1508,7 @@ public sealed partial class AaruFormat { case CompressionType.None: block = new byte[blockHeader.length]; - _imageStream.Read(block, 0, (int)blockHeader.length); + _imageStream.EnsureRead(block, 0, (int)blockHeader.length); AaruConsole.DebugWriteLine("Aaru Format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); @@ -1516,8 +1517,8 @@ public sealed partial class AaruFormat case CompressionType.Lzma: var compressedBlock = new byte[blockHeader.cmpLength - LZMA_PROPERTIES_LENGTH]; var lzmaProperties = new byte[LZMA_PROPERTIES_LENGTH]; - _imageStream.Read(lzmaProperties, 0, LZMA_PROPERTIES_LENGTH); - _imageStream.Read(compressedBlock, 0, compressedBlock.Length); + _imageStream.EnsureRead(lzmaProperties, 0, LZMA_PROPERTIES_LENGTH); + _imageStream.EnsureRead(compressedBlock, 0, compressedBlock.Length); block = new byte[blockHeader.length]; decompressedLength = (ulong)LZMA.DecodeBuffer(compressedBlock, block, lzmaProperties); @@ -1536,7 +1537,7 @@ public sealed partial class AaruFormat break; case CompressionType.Flac: var flacBlock = new byte[blockHeader.cmpLength]; - _imageStream.Read(flacBlock, 0, flacBlock.Length); + _imageStream.EnsureRead(flacBlock, 0, flacBlock.Length); block = new byte[blockHeader.length]; decompressedLength = (ulong)FLAC.DecodeBuffer(flacBlock, block); @@ -2010,7 +2011,7 @@ public sealed partial class AaruFormat _sectorPrefixMs.Position = prefixPosition; - _sectorPrefixMs.Read(buffer, 0, 16); + _sectorPrefixMs.EnsureRead(buffer, 0, 16); } } else @@ -2036,7 +2037,7 @@ public sealed partial class AaruFormat _sectorSuffixMs.Position = suffixPosition; - _sectorSuffixMs.Read(buffer, 2064, 288); + _sectorSuffixMs.EnsureRead(buffer, 2064, 288); } } else @@ -2066,7 +2067,7 @@ public sealed partial class AaruFormat _sectorPrefixMs.Position = prefixPosition; - _sectorPrefixMs.Read(buffer, 0, 16); + _sectorPrefixMs.EnsureRead(buffer, 0, 16); } } else @@ -2119,7 +2120,7 @@ public sealed partial class AaruFormat _sectorSuffixMs.Position = suffixPosition; - _sectorSuffixMs.Read(buffer, form2 ? 2348 : 2072, form2 ? 4 : 280); + _sectorSuffixMs.EnsureRead(buffer, form2 ? 2348 : 2072, form2 ? 4 : 280); Array.Copy(data, 0, buffer, 24, form2 ? 2324 : 2048); } } diff --git a/Aaru.Images/AaruFormat/Verify.cs b/Aaru.Images/AaruFormat/Verify.cs index 577914a45..653a38af9 100644 --- a/Aaru.Images/AaruFormat/Verify.cs +++ b/Aaru.Images/AaruFormat/Verify.cs @@ -49,7 +49,7 @@ public sealed partial class AaruFormat _imageStream.Position = (long)_header.indexOffset; _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); IndexHeader idxHeader = Marshal.SpanToStructureLittleEndian(_structureBytes); if(idxHeader.identifier != BlockType.Index) @@ -63,7 +63,7 @@ public sealed partial class AaruFormat idxHeader.entries); _structureBytes = new byte[Marshal.SizeOf() * idxHeader.entries]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); Crc64Context.Data(_structureBytes, out byte[] verifyCrc); if(BitConverter.ToUInt64(verifyCrc, 0) != idxHeader.crc64) @@ -81,7 +81,7 @@ public sealed partial class AaruFormat for(ushort i = 0; i < idxHeader.entries; i++) { _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); IndexEntry entry = Marshal.SpanToStructureLittleEndian(_structureBytes); AaruConsole.DebugWriteLine("Aaru Format plugin", @@ -105,7 +105,7 @@ public sealed partial class AaruFormat { case BlockType.DataBlock: _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); BlockHeader blockHeader = Marshal.SpanToStructureLittleEndian(_structureBytes); crcVerify = new Crc64Context(); @@ -117,13 +117,13 @@ public sealed partial class AaruFormat while(readBytes + verifySize < blockHeader.cmpLength) { verifyBytes = new byte[verifySize]; - _imageStream.Read(verifyBytes, 0, verifyBytes.Length); + _imageStream.EnsureRead(verifyBytes, 0, verifyBytes.Length); crcVerify.Update(verifyBytes); readBytes += (ulong)verifyBytes.LongLength; } verifyBytes = new byte[blockHeader.cmpLength - readBytes]; - _imageStream.Read(verifyBytes, 0, verifyBytes.Length); + _imageStream.EnsureRead(verifyBytes, 0, verifyBytes.Length); crcVerify.Update(verifyBytes); verifyCrc = crcVerify.Final(); @@ -139,7 +139,7 @@ public sealed partial class AaruFormat break; case BlockType.DeDuplicationTable: _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); DdtHeader ddtHeader = Marshal.SpanToStructureLittleEndian(_structureBytes); crcVerify = new Crc64Context(); @@ -152,13 +152,13 @@ public sealed partial class AaruFormat while(readBytes + verifySize < ddtHeader.cmpLength) { verifyBytes = new byte[verifySize]; - _imageStream.Read(verifyBytes, 0, verifyBytes.Length); + _imageStream.EnsureRead(verifyBytes, 0, verifyBytes.Length); crcVerify.Update(verifyBytes); readBytes += (ulong)verifyBytes.LongLength; } verifyBytes = new byte[ddtHeader.cmpLength - readBytes]; - _imageStream.Read(verifyBytes, 0, verifyBytes.Length); + _imageStream.EnsureRead(verifyBytes, 0, verifyBytes.Length); crcVerify.Update(verifyBytes); verifyCrc = crcVerify.Final(); @@ -174,14 +174,14 @@ public sealed partial class AaruFormat break; case BlockType.TracksBlock: _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); TracksHeader trkHeader = Marshal.SpanToStructureLittleEndian(_structureBytes); AaruConsole.DebugWriteLine("Aaru Format plugin", "Track block at {0} contains {1} entries", _header.indexOffset, trkHeader.entries); _structureBytes = new byte[Marshal.SizeOf() * trkHeader.entries]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); Crc64Context.Data(_structureBytes, out verifyCrc); if(BitConverter.ToUInt64(verifyCrc, 0) != trkHeader.crc64) diff --git a/Aaru.Images/AaruFormat/Write.cs b/Aaru.Images/AaruFormat/Write.cs index ab93b55da..b4b5c06bc 100644 --- a/Aaru.Images/AaruFormat/Write.cs +++ b/Aaru.Images/AaruFormat/Write.cs @@ -238,7 +238,7 @@ public sealed partial class AaruFormat if(_imageStream.Length > Marshal.SizeOf()) { _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); _header = Marshal.ByteArrayToStructureLittleEndian(_structureBytes); if(_header.identifier != DIC_MAGIC && @@ -308,7 +308,7 @@ public sealed partial class AaruFormat _imageStream.Position = (long)_header.indexOffset; _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); IndexHeader idxHeader = Marshal.SpanToStructureLittleEndian(_structureBytes); if(idxHeader.identifier != BlockType.Index) @@ -324,7 +324,7 @@ public sealed partial class AaruFormat for(ushort i = 0; i < idxHeader.entries; i++) { _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); IndexEntry entry = Marshal.SpanToStructureLittleEndian(_structureBytes); AaruConsole.DebugWriteLine("Aaru Format plugin", @@ -353,7 +353,7 @@ public sealed partial class AaruFormat _imageStream.Position = (long)entry.offset; _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); BlockHeader blockHeader = Marshal.SpanToStructureLittleEndian(_structureBytes); _imageInfo.ImageSize += blockHeader.cmpLength; @@ -404,8 +404,8 @@ public sealed partial class AaruFormat DateTime startDecompress = DateTime.Now; var compressedTag = new byte[blockHeader.cmpLength - LZMA_PROPERTIES_LENGTH]; var lzmaProperties = new byte[LZMA_PROPERTIES_LENGTH]; - _imageStream.Read(lzmaProperties, 0, LZMA_PROPERTIES_LENGTH); - _imageStream.Read(compressedTag, 0, compressedTag.Length); + _imageStream.EnsureRead(lzmaProperties, 0, LZMA_PROPERTIES_LENGTH); + _imageStream.EnsureRead(compressedTag, 0, compressedTag.Length); data = new byte[blockHeader.length]; int decompressedLength = LZMA.DecodeBuffer(compressedTag, data, lzmaProperties); @@ -431,7 +431,7 @@ public sealed partial class AaruFormat else if(blockHeader.compression == CompressionType.None) { data = new byte[blockHeader.length]; - _imageStream.Read(data, 0, (int)blockHeader.length); + _imageStream.EnsureRead(data, 0, (int)blockHeader.length); AaruConsole.DebugWriteLine("Aaru Format plugin", "Memory snapshot: {0} bytes", GC.GetTotalMemory(false)); @@ -588,7 +588,7 @@ public sealed partial class AaruFormat if(entry.dataType == DataType.UserData) { _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); DdtHeader ddtHeader = Marshal.ByteArrayToStructureLittleEndian(_structureBytes); @@ -616,8 +616,8 @@ public sealed partial class AaruFormat var compressedDdt = new byte[ddtHeader.cmpLength - LZMA_PROPERTIES_LENGTH]; var lzmaProperties = new byte[LZMA_PROPERTIES_LENGTH]; - _imageStream.Read(lzmaProperties, 0, LZMA_PROPERTIES_LENGTH); - _imageStream.Read(compressedDdt, 0, compressedDdt.Length); + _imageStream.EnsureRead(lzmaProperties, 0, LZMA_PROPERTIES_LENGTH); + _imageStream.EnsureRead(compressedDdt, 0, compressedDdt.Length); var decompressedDdt = new byte[ddtHeader.length]; var decompressedLength = @@ -667,7 +667,7 @@ public sealed partial class AaruFormat else if(entry.dataType is DataType.CdSectorPrefixCorrected or DataType.CdSectorSuffixCorrected) { _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); DdtHeader ddtHeader = Marshal.ByteArrayToStructureLittleEndian(_structureBytes); @@ -694,8 +694,8 @@ public sealed partial class AaruFormat var compressedDdt = new byte[ddtHeader.cmpLength - LZMA_PROPERTIES_LENGTH]; var lzmaProperties = new byte[LZMA_PROPERTIES_LENGTH]; - _imageStream.Read(lzmaProperties, 0, LZMA_PROPERTIES_LENGTH); - _imageStream.Read(compressedDdt, 0, compressedDdt.Length); + _imageStream.EnsureRead(lzmaProperties, 0, LZMA_PROPERTIES_LENGTH); + _imageStream.EnsureRead(compressedDdt, 0, compressedDdt.Length); var decompressedLength = (ulong)LZMA.DecodeBuffer(compressedDdt, decompressedDdt, lzmaProperties); @@ -716,7 +716,7 @@ public sealed partial class AaruFormat break; case CompressionType.None: - _imageStream.Read(decompressedDdt, 0, decompressedDdt.Length); + _imageStream.EnsureRead(decompressedDdt, 0, decompressedDdt.Length); break; default: @@ -746,7 +746,7 @@ public sealed partial class AaruFormat // Logical geometry block. It doesn't have a CRC coz, well, it's not so important case BlockType.GeometryBlock: _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); _geometryBlock = Marshal.SpanToStructureLittleEndian(_structureBytes); if(_geometryBlock.identifier == BlockType.GeometryBlock) @@ -769,7 +769,7 @@ public sealed partial class AaruFormat // Metadata block case BlockType.MetadataBlock: _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); MetadataBlock metadataBlock = Marshal.SpanToStructureLittleEndian(_structureBytes); @@ -788,7 +788,7 @@ public sealed partial class AaruFormat var metadata = new byte[metadataBlock.blockSize]; _imageStream.Position = (long)entry.offset; - _imageStream.Read(metadata, 0, metadata.Length); + _imageStream.EnsureRead(metadata, 0, metadata.Length); if(metadataBlock.mediaSequence > 0 && metadataBlock.lastMediaSequence > 0) @@ -945,7 +945,7 @@ public sealed partial class AaruFormat // Optical disc tracks block case BlockType.TracksBlock: _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); TracksHeader tracksHeader = Marshal.SpanToStructureLittleEndian(_structureBytes); @@ -959,7 +959,7 @@ public sealed partial class AaruFormat } _structureBytes = new byte[Marshal.SizeOf() * tracksHeader.entries]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); Crc64Context.Data(_structureBytes, out byte[] trksCrc); if(BitConverter.ToUInt64(trksCrc, 0) != tracksHeader.crc64) @@ -983,7 +983,7 @@ public sealed partial class AaruFormat for(ushort i = 0; i < tracksHeader.entries; i++) { _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); TrackEntry trackEntry = Marshal.ByteArrayToStructureLittleEndian(_structureBytes); @@ -1027,7 +1027,7 @@ public sealed partial class AaruFormat // CICM XML metadata block case BlockType.CicmBlock: _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); CicmMetadataBlock cicmBlock = Marshal.SpanToStructureLittleEndian(_structureBytes); @@ -1039,7 +1039,7 @@ public sealed partial class AaruFormat "Found CICM XML metadata block at position {0}", entry.offset); var cicmBytes = new byte[cicmBlock.length]; - _imageStream.Read(cicmBytes, 0, cicmBytes.Length); + _imageStream.EnsureRead(cicmBytes, 0, cicmBytes.Length); var cicmMs = new MemoryStream(cicmBytes); var cicmXs = new XmlSerializer(typeof(CICMMetadataType)); @@ -1062,7 +1062,7 @@ public sealed partial class AaruFormat // Dump hardware block case BlockType.DumpHardwareBlock: _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); DumpHardwareHeader dumpBlock = Marshal.SpanToStructureLittleEndian(_structureBytes); @@ -1074,7 +1074,7 @@ public sealed partial class AaruFormat entry.offset); _structureBytes = new byte[dumpBlock.length]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); Crc64Context.Data(_structureBytes, out byte[] dumpCrc); if(BitConverter.ToUInt64(dumpCrc, 0) != dumpBlock.crc64) @@ -1093,7 +1093,7 @@ public sealed partial class AaruFormat for(ushort i = 0; i < dumpBlock.entries; i++) { _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); DumpHardwareEntry dumpEntry = Marshal.SpanToStructureLittleEndian(_structureBytes); @@ -1109,7 +1109,7 @@ public sealed partial class AaruFormat if(dumpEntry.manufacturerLength > 0) { tmp = new byte[dumpEntry.manufacturerLength - 1]; - _imageStream.Read(tmp, 0, tmp.Length); + _imageStream.EnsureRead(tmp, 0, tmp.Length); _imageStream.Position += 1; dump.Manufacturer = Encoding.UTF8.GetString(tmp); } @@ -1117,7 +1117,7 @@ public sealed partial class AaruFormat if(dumpEntry.modelLength > 0) { tmp = new byte[dumpEntry.modelLength - 1]; - _imageStream.Read(tmp, 0, tmp.Length); + _imageStream.EnsureRead(tmp, 0, tmp.Length); _imageStream.Position += 1; dump.Model = Encoding.UTF8.GetString(tmp); } @@ -1125,7 +1125,7 @@ public sealed partial class AaruFormat if(dumpEntry.revisionLength > 0) { tmp = new byte[dumpEntry.revisionLength - 1]; - _imageStream.Read(tmp, 0, tmp.Length); + _imageStream.EnsureRead(tmp, 0, tmp.Length); _imageStream.Position += 1; dump.Revision = Encoding.UTF8.GetString(tmp); } @@ -1133,7 +1133,7 @@ public sealed partial class AaruFormat if(dumpEntry.firmwareLength > 0) { tmp = new byte[dumpEntry.firmwareLength - 1]; - _imageStream.Read(tmp, 0, tmp.Length); + _imageStream.EnsureRead(tmp, 0, tmp.Length); _imageStream.Position += 1; dump.Firmware = Encoding.UTF8.GetString(tmp); } @@ -1141,7 +1141,7 @@ public sealed partial class AaruFormat if(dumpEntry.serialLength > 0) { tmp = new byte[dumpEntry.serialLength - 1]; - _imageStream.Read(tmp, 0, tmp.Length); + _imageStream.EnsureRead(tmp, 0, tmp.Length); _imageStream.Position += 1; dump.Serial = Encoding.UTF8.GetString(tmp); } @@ -1149,7 +1149,7 @@ public sealed partial class AaruFormat if(dumpEntry.softwareNameLength > 0) { tmp = new byte[dumpEntry.softwareNameLength - 1]; - _imageStream.Read(tmp, 0, tmp.Length); + _imageStream.EnsureRead(tmp, 0, tmp.Length); _imageStream.Position += 1; dump.Software.Name = Encoding.UTF8.GetString(tmp); } @@ -1157,7 +1157,7 @@ public sealed partial class AaruFormat if(dumpEntry.softwareVersionLength > 0) { tmp = new byte[dumpEntry.softwareVersionLength - 1]; - _imageStream.Read(tmp, 0, tmp.Length); + _imageStream.EnsureRead(tmp, 0, tmp.Length); _imageStream.Position += 1; dump.Software.Version = Encoding.UTF8.GetString(tmp); } @@ -1166,7 +1166,7 @@ public sealed partial class AaruFormat { tmp = new byte[dumpEntry.softwareOperatingSystemLength - 1]; _imageStream.Position += 1; - _imageStream.Read(tmp, 0, tmp.Length); + _imageStream.EnsureRead(tmp, 0, tmp.Length); dump.Software.OperatingSystem = Encoding.UTF8.GetString(tmp); } @@ -1174,7 +1174,7 @@ public sealed partial class AaruFormat for(uint j = 0; j < dumpEntry.extents; j++) { - _imageStream.Read(tmp, 0, tmp.Length); + _imageStream.EnsureRead(tmp, 0, tmp.Length); dump.Extents[j] = new ExtentType { @@ -1197,7 +1197,7 @@ public sealed partial class AaruFormat // Tape partition block case BlockType.TapePartitionBlock: _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); TapePartitionHeader partitionHeader = Marshal.SpanToStructureLittleEndian(_structureBytes); @@ -1209,7 +1209,7 @@ public sealed partial class AaruFormat entry.offset); var tapePartitionBytes = new byte[partitionHeader.length]; - _imageStream.Read(tapePartitionBytes, 0, tapePartitionBytes.Length); + _imageStream.EnsureRead(tapePartitionBytes, 0, tapePartitionBytes.Length); Span tapePartitions = MemoryMarshal.Cast(tapePartitionBytes); @@ -1231,7 +1231,7 @@ public sealed partial class AaruFormat // Tape file block case BlockType.TapeFileBlock: _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); TapeFileHeader fileHeader = Marshal.SpanToStructureLittleEndian(_structureBytes); @@ -1243,7 +1243,7 @@ public sealed partial class AaruFormat entry.offset); var tapeFileBytes = new byte[fileHeader.length]; - _imageStream.Read(tapeFileBytes, 0, tapeFileBytes.Length); + _imageStream.EnsureRead(tapeFileBytes, 0, tapeFileBytes.Length); Span tapeFiles = MemoryMarshal.Cast(tapeFileBytes); Files = new List(); @@ -1263,7 +1263,7 @@ public sealed partial class AaruFormat // Optical disc tracks block case BlockType.CompactDiscIndexesBlock: _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); CompactDiscIndexesHeader indexesHeader = Marshal.SpanToStructureLittleEndian(_structureBytes); @@ -1278,7 +1278,7 @@ public sealed partial class AaruFormat } _structureBytes = new byte[Marshal.SizeOf() * indexesHeader.entries]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); Crc64Context.Data(_structureBytes, out byte[] idsxCrc); if(BitConverter.ToUInt64(idsxCrc, 0) != indexesHeader.crc64) @@ -1301,7 +1301,7 @@ public sealed partial class AaruFormat for(ushort i = 0; i < indexesHeader.entries; i++) { _structureBytes = new byte[Marshal.SizeOf()]; - _imageStream.Read(_structureBytes, 0, _structureBytes.Length); + _imageStream.EnsureRead(_structureBytes, 0, _structureBytes.Length); compactDiscIndexes.Add(Marshal. ByteArrayToStructureLittleEndian< diff --git a/Aaru.Images/Alcohol120/Identify.cs b/Aaru.Images/Alcohol120/Identify.cs index 46d6f1aaa..13555baa7 100644 --- a/Aaru.Images/Alcohol120/Identify.cs +++ b/Aaru.Images/Alcohol120/Identify.cs @@ -49,7 +49,7 @@ public sealed partial class Alcohol120 return false; var hdr = new byte[88]; - stream.Read(hdr, 0, 88); + stream.EnsureRead(hdr, 0, 88); Header header = Marshal.ByteArrayToStructureLittleEndian
(hdr); return header.signature.SequenceEqual(_alcoholSignature) && header.version[0] <= MAXIMUM_SUPPORTED_VERSION; diff --git a/Aaru.Images/Alcohol120/Read.cs b/Aaru.Images/Alcohol120/Read.cs index 0457af4f7..a1ee86f22 100644 --- a/Aaru.Images/Alcohol120/Read.cs +++ b/Aaru.Images/Alcohol120/Read.cs @@ -59,7 +59,7 @@ public sealed partial class Alcohol120 _isDvd = false; var hdr = new byte[88]; - stream.Read(hdr, 0, 88); + stream.EnsureRead(hdr, 0, 88); _header = Marshal.ByteArrayToStructureLittleEndian
(hdr); AaruConsole.DebugWriteLine("Alcohol 120% plugin", "header.signature = {0}", @@ -105,7 +105,7 @@ public sealed partial class Alcohol120 for(var i = 0; i < _header.sessions; i++) { var sesHdr = new byte[24]; - stream.Read(sesHdr, 0, 24); + stream.EnsureRead(sesHdr, 0, 24); Session session = Marshal.SpanToStructureLittleEndian(sesHdr); AaruConsole.DebugWriteLine("Alcohol 120% plugin", "session[{1}].sessionStart = {0}", session.sessionStart, @@ -147,7 +147,7 @@ public sealed partial class Alcohol120 for(var i = 0; i < session.allBlocks; i++) { var trkHdr = new byte[80]; - stream.Read(trkHdr, 0, 80); + stream.EnsureRead(trkHdr, 0, 80); Track track = Marshal.ByteArrayToStructureLittleEndian(trkHdr); if(track.mode is TrackMode.Mode2F1Alt or TrackMode.Mode2F1Alt) @@ -257,7 +257,7 @@ public sealed partial class Alcohol120 { var extHdr = new byte[8]; stream.Seek(track.extraOffset, SeekOrigin.Begin); - stream.Read(extHdr, 0, 8); + stream.EnsureRead(extHdr, 0, 8); TrackExtra extra = Marshal.SpanToStructureLittleEndian(extHdr); AaruConsole.DebugWriteLine("Alcohol 120% plugin", "track[{1}].extra.pregap = {0}", extra.pregap, @@ -288,7 +288,7 @@ public sealed partial class Alcohol120 { var footer = new byte[16]; stream.Seek(footerOff, SeekOrigin.Begin); - stream.Read(footer, 0, 16); + stream.EnsureRead(footer, 0, 16); _alcFooter = Marshal.SpanToStructureLittleEndian