diff --git a/Aaru.Images/DiscJuggler/Read.cs b/Aaru.Images/DiscJuggler/Read.cs index 6334f4234..c5a62253a 100644 --- a/Aaru.Images/DiscJuggler/Read.cs +++ b/Aaru.Images/DiscJuggler/Read.cs @@ -760,9 +760,11 @@ namespace Aaru.DiscImages public byte[] ReadSectors(ulong sectorAddress, uint length) { - foreach(KeyValuePair kvp in from kvp in _offsetmap where sectorAddress >= kvp.Value + foreach(KeyValuePair kvp in from kvp in _offsetmap where sectorAddress >= kvp.Value from track in Tracks where track.TrackSequence == kvp.Key - where sectorAddress < track.TrackEndSector select kvp) + where sectorAddress - kvp.Value < + (track.TrackEndSector - track.TrackStartSector) + 1 + select kvp) return ReadSectors(sectorAddress - kvp.Value, length, kvp.Key); throw new ArgumentOutOfRangeException(nameof(sectorAddress), $"Sector address {sectorAddress} not found"); @@ -770,11 +772,11 @@ namespace Aaru.DiscImages public byte[] ReadSectorsTag(ulong sectorAddress, uint length, SectorTagType tag) { - foreach(KeyValuePair kvp in _offsetmap. - Where(kvp => sectorAddress >= kvp.Value). - Where(kvp => Tracks. - Where(track => track.TrackSequence == kvp.Key). - Any(track => sectorAddress < track.TrackEndSector))) + foreach(KeyValuePair kvp in from kvp in _offsetmap where sectorAddress >= kvp.Value + from track in Tracks where track.TrackSequence == kvp.Key + where sectorAddress - kvp.Value < + (track.TrackEndSector - track.TrackStartSector) + 1 + select kvp) return ReadSectorsTag(sectorAddress - kvp.Value, length, kvp.Key, tag); throw new ArgumentOutOfRangeException(nameof(sectorAddress), $"Sector address {sectorAddress} not found"); @@ -797,9 +799,9 @@ namespace Aaru.DiscImages if(aaruTrack is null) throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image"); - if(length + sectorAddress > aaruTrack.TrackEndSector) + if(length + sectorAddress > (aaruTrack.TrackEndSector - aaruTrack.TrackStartSector) + 1) throw new ArgumentOutOfRangeException(nameof(length), - $"Requested more sectors ({length + sectorAddress}) than present in track ({aaruTrack.TrackEndSector}), won't cross tracks"); + $"Requested more sectors ({length + sectorAddress}) than present in track ({(aaruTrack.TrackEndSector - aaruTrack.TrackStartSector) + 1}), won't cross tracks"); uint sectorOffset; uint sectorSize; @@ -918,9 +920,9 @@ namespace Aaru.DiscImages if(aaruTrack is null) throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image"); - if(length + sectorAddress > aaruTrack.TrackEndSector) + if(length + sectorAddress > (aaruTrack.TrackEndSector - aaruTrack.TrackStartSector) + 1) throw new ArgumentOutOfRangeException(nameof(length), - $"Requested more sectors ({length + sectorAddress}) than present in track ({aaruTrack.TrackEndSector}), won't cross tracks"); + $"Requested more sectors ({length + sectorAddress}) than present in track ({(aaruTrack.TrackEndSector - aaruTrack.TrackStartSector) + 1}), won't cross tracks"); if(aaruTrack.TrackType == TrackType.Data) throw new ArgumentException("Unsupported tag requested", nameof(tag)); @@ -1170,8 +1172,9 @@ namespace Aaru.DiscImages { foreach(KeyValuePair kvp in from kvp in _offsetmap where sectorAddress >= kvp.Value from track in Tracks where track.TrackSequence == kvp.Key - where sectorAddress - kvp.Value < - track.TrackEndSector - track.TrackStartSector select kvp) + where sectorAddress - kvp.Value < + (track.TrackEndSector - track.TrackStartSector) + 1 + select kvp) return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key); throw new ArgumentOutOfRangeException(nameof(sectorAddress), $"Sector address {sectorAddress} not found"); @@ -1194,9 +1197,9 @@ namespace Aaru.DiscImages if(aaruTrack is null) throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image"); - if(length + sectorAddress > aaruTrack.TrackEndSector) + if(length + sectorAddress > (aaruTrack.TrackEndSector - aaruTrack.TrackStartSector) + 1) throw new ArgumentOutOfRangeException(nameof(length), - $"Requested more sectors ({length + sectorAddress}) than present in track ({aaruTrack.TrackEndSector}), won't cross tracks"); + $"Requested more sectors ({length + sectorAddress}) than present in track ({(aaruTrack.TrackEndSector - aaruTrack.TrackStartSector) + 1}), won't cross tracks"); uint sectorSize = (uint)aaruTrack.TrackRawBytesPerSector; uint sectorSkip = 0;