mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Fix cross track detection in DiscJuggler disc images. Fixes #398
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user