Fix cross track detection in DiscJuggler disc images. Fixes #398

This commit is contained in:
2020-11-04 02:46:40 +00:00
parent 6b741992af
commit 7723fc2d0d

View File

@@ -760,9 +760,11 @@ namespace Aaru.DiscImages
public byte[] ReadSectors(ulong sectorAddress, uint length) public byte[] ReadSectors(ulong sectorAddress, uint length)
{ {
foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetmap where sectorAddress >= kvp.Value foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetmap where sectorAddress >= kvp.Value
from track in Tracks where track.TrackSequence == kvp.Key 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); return ReadSectors(sectorAddress - kvp.Value, length, kvp.Key);
throw new ArgumentOutOfRangeException(nameof(sectorAddress), $"Sector address {sectorAddress} not found"); 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) public byte[] ReadSectorsTag(ulong sectorAddress, uint length, SectorTagType tag)
{ {
foreach(KeyValuePair<uint, ulong> kvp in _offsetmap. foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetmap where sectorAddress >= kvp.Value
Where(kvp => sectorAddress >= kvp.Value). from track in Tracks where track.TrackSequence == kvp.Key
Where(kvp => Tracks. where sectorAddress - kvp.Value <
Where(track => track.TrackSequence == kvp.Key). (track.TrackEndSector - track.TrackStartSector) + 1
Any(track => sectorAddress < track.TrackEndSector))) select kvp)
return ReadSectorsTag(sectorAddress - kvp.Value, length, kvp.Key, tag); return ReadSectorsTag(sectorAddress - kvp.Value, length, kvp.Key, tag);
throw new ArgumentOutOfRangeException(nameof(sectorAddress), $"Sector address {sectorAddress} not found"); throw new ArgumentOutOfRangeException(nameof(sectorAddress), $"Sector address {sectorAddress} not found");
@@ -797,9 +799,9 @@ namespace Aaru.DiscImages
if(aaruTrack is null) if(aaruTrack is null)
throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image"); 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), 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 sectorOffset;
uint sectorSize; uint sectorSize;
@@ -918,9 +920,9 @@ namespace Aaru.DiscImages
if(aaruTrack is null) if(aaruTrack is null)
throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image"); 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), 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) if(aaruTrack.TrackType == TrackType.Data)
throw new ArgumentException("Unsupported tag requested", nameof(tag)); throw new ArgumentException("Unsupported tag requested", nameof(tag));
@@ -1170,8 +1172,9 @@ namespace Aaru.DiscImages
{ {
foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetmap where sectorAddress >= kvp.Value foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetmap where sectorAddress >= kvp.Value
from track in Tracks where track.TrackSequence == kvp.Key from track in Tracks where track.TrackSequence == kvp.Key
where sectorAddress - kvp.Value < where sectorAddress - kvp.Value <
track.TrackEndSector - track.TrackStartSector select kvp) (track.TrackEndSector - track.TrackStartSector) + 1
select kvp)
return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key); return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key);
throw new ArgumentOutOfRangeException(nameof(sectorAddress), $"Sector address {sectorAddress} not found"); throw new ArgumentOutOfRangeException(nameof(sectorAddress), $"Sector address {sectorAddress} not found");
@@ -1194,9 +1197,9 @@ namespace Aaru.DiscImages
if(aaruTrack is null) if(aaruTrack is null)
throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image"); 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), 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 sectorSize = (uint)aaruTrack.TrackRawBytesPerSector;
uint sectorSkip = 0; uint sectorSkip = 0;