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