Do not set INDEX 1 to a value higher than what the TOC already said.

This commit is contained in:
2022-04-10 14:10:41 +01:00
parent 9fc10e1e57
commit 40ed1b19e2
9 changed files with 49 additions and 20 deletions

View File

@@ -270,7 +270,8 @@ namespace Aaru.Core.Devices.Dumping
bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel, bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel,
desiredSubchannel, sub, i + r, 1, subLog, isrcs, 1, ref mcn, tracks, desiredSubchannel, sub, i + r, 1, subLog, isrcs, 1, ref mcn, tracks,
subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel, subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel,
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true); _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true,
out List<ulong> _);
// Set tracks and go back // Set tracks and go back
if(indexesChanged) if(indexesChanged)
@@ -355,12 +356,17 @@ namespace Aaru.Core.Devices.Dumping
bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel, bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel,
desiredSubchannel, sub, i, blocksToRead, subLog, isrcs, 1, ref mcn, tracks, desiredSubchannel, sub, i, blocksToRead, subLog, isrcs, 1, ref mcn, tracks,
subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel, subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel,
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true); _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true,
out List<ulong> newPregapSectors);
// Set tracks and go back // Set tracks and go back
if(indexesChanged) if(indexesChanged)
{ {
(_outputPlugin as IWritableOpticalImage).SetTracks(tracks.ToList()); (_outputPlugin as IWritableOpticalImage).SetTracks(tracks.ToList());
foreach(ulong newPregapSector in newPregapSectors)
_resume.BadBlocks.Add(newPregapSector);
i -= blocksToRead; i -= blocksToRead;
continue; continue;

View File

@@ -508,12 +508,16 @@ namespace Aaru.Core.Devices.Dumping
desiredSubchannel, sub, i + r, 1, subLog, isrcs, (byte)track.TrackSequence, desiredSubchannel, sub, i + r, 1, subLog, isrcs, (byte)track.TrackSequence,
ref mcn, tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin, ref mcn, tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin,
_fixSubchannel, _fixSubchannelCrc, _dumpLog, UpdateStatus, _fixSubchannel, _fixSubchannelCrc, _dumpLog, UpdateStatus,
smallestPregapLbaPerTrack, true); smallestPregapLbaPerTrack, true, out List<ulong> newPregapSectors);
// Set tracks and go back // Set tracks and go back
if(indexesChanged) if(indexesChanged)
{ {
(_outputPlugin as IWritableOpticalImage).SetTracks(tracks.ToList()); (_outputPlugin as IWritableOpticalImage).SetTracks(tracks.ToList());
foreach(ulong newPregapSector in newPregapSectors)
_resume.BadBlocks.Add(newPregapSector);
i -= blocksToRead; i -= blocksToRead;
continue; continue;
@@ -652,12 +656,16 @@ namespace Aaru.Core.Devices.Dumping
desiredSubchannel, sub, i, blocksToRead, subLog, isrcs, (byte)track.TrackSequence, desiredSubchannel, sub, i, blocksToRead, subLog, isrcs, (byte)track.TrackSequence,
ref mcn, tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin, ref mcn, tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin,
_fixSubchannel, _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, _fixSubchannel, _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack,
true); true, out List<ulong> newPregapSectors);
// Set tracks and go back // Set tracks and go back
if(indexesChanged) if(indexesChanged)
{ {
(_outputPlugin as IWritableOpticalImage).SetTracks(tracks.ToList()); (_outputPlugin as IWritableOpticalImage).SetTracks(tracks.ToList());
foreach(ulong newPregapSector in newPregapSectors)
_resume.BadBlocks.Add(newPregapSector);
i -= blocksToRead; i -= blocksToRead;
continue; continue;

View File

@@ -367,7 +367,7 @@ namespace Aaru.Core.Devices.Dumping
bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel, bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel,
desiredSubchannel, sub, badSector, 1, subLog, isrcs, (byte)track.TrackSequence, ref mcn, desiredSubchannel, sub, badSector, 1, subLog, isrcs, (byte)track.TrackSequence, ref mcn,
tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel, tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel,
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true); _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true, out _);
// Set tracks and go back // Set tracks and go back
if(!indexesChanged) if(!indexesChanged)
@@ -499,7 +499,7 @@ namespace Aaru.Core.Devices.Dumping
desiredSubchannel, sub, badSector, 1, subLog, isrcs, (byte)track.TrackSequence, desiredSubchannel, sub, badSector, 1, subLog, isrcs, (byte)track.TrackSequence,
ref mcn, tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin, ref mcn, tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin,
_fixSubchannel, _fixSubchannelCrc, _dumpLog, UpdateStatus, _fixSubchannel, _fixSubchannelCrc, _dumpLog, UpdateStatus,
smallestPregapLbaPerTrack, true); smallestPregapLbaPerTrack, true, out _);
// Set tracks and go back // Set tracks and go back
if(indexesChanged) if(indexesChanged)
@@ -662,7 +662,7 @@ namespace Aaru.Core.Devices.Dumping
subLog, isrcs, (byte)track.TrackSequence, ref mcn, tracks, subLog, isrcs, (byte)track.TrackSequence, ref mcn, tracks,
subchannelExtents, _fixSubchannelPosition, _outputPlugin, subchannelExtents, _fixSubchannelPosition, _outputPlugin,
_fixSubchannel, _fixSubchannelCrc, _dumpLog, UpdateStatus, _fixSubchannel, _fixSubchannelCrc, _dumpLog, UpdateStatus,
smallestPregapLbaPerTrack, true); smallestPregapLbaPerTrack, true, out _);
if(subchannelExtents.Contains(bs)) if(subchannelExtents.Contains(bs))
continue; continue;

View File

@@ -163,7 +163,7 @@ namespace Aaru.Core.Devices.Dumping
bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel, bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel,
desiredSubchannel, sub, i, _maximumReadable, subLog, isrcs, 0xAA, ref mcn, tracks, desiredSubchannel, sub, i, _maximumReadable, subLog, isrcs, 0xAA, ref mcn, tracks,
subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel, subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel,
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true); _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true, out _);
// Set tracks and go back // Set tracks and go back
if(indexesChanged) if(indexesChanged)
@@ -331,7 +331,7 @@ namespace Aaru.Core.Devices.Dumping
bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel, bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel,
desiredSubchannel, sub, i, _maximumReadable, subLog, isrcs, 0xAA, ref mcn, tracks, desiredSubchannel, sub, i, _maximumReadable, subLog, isrcs, 0xAA, ref mcn, tracks,
subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel, subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel,
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true); _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true, out _);
// Set tracks and go back // Set tracks and go back
if(indexesChanged) if(indexesChanged)

View File

@@ -271,7 +271,7 @@ namespace Aaru.Core.Devices.Dumping
bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel, bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel,
desiredSubchannel, sub, badSector, 1, subLog, isrcs, (byte)track.TrackSequence, ref mcn, desiredSubchannel, sub, badSector, 1, subLog, isrcs, (byte)track.TrackSequence, ref mcn,
tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel, tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel,
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true); _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true, out _);
// Set tracks and go back // Set tracks and go back
if(!indexesChanged) if(!indexesChanged)

View File

@@ -72,7 +72,8 @@ namespace Aaru.Core.Media
bool fixSubchannelPosition, IWritableImage outputPlugin, bool fixSubchannelPosition, IWritableImage outputPlugin,
bool fixSubchannel, bool fixSubchannelCrc, DumpLog dumpLog, bool fixSubchannel, bool fixSubchannelCrc, DumpLog dumpLog,
UpdateStatusHandler updateStatus, UpdateStatusHandler updateStatus,
Dictionary<byte, int> smallestPregapLbaPerTrack, bool dumping) Dictionary<byte, int> smallestPregapLbaPerTrack, bool dumping,
out List<ulong> newPregapSectors)
{ {
// We need to work in PW raw subchannels // We need to work in PW raw subchannels
if(supportedSubchannel == MmcSubchannel.Q16) if(supportedSubchannel == MmcSubchannel.Q16)
@@ -88,8 +89,9 @@ namespace Aaru.Core.Media
byte[] deSub = Subchannel.Deinterleave(sub); byte[] deSub = Subchannel.Deinterleave(sub);
bool indexesChanged = CheckIndexesFromSubchannel(deSub, isrcs, currentTrack, ref mcn, tracks, dumpLog, bool indexesChanged = CheckIndexesFromSubchannel(deSub, isrcs, currentTrack, ref mcn, tracks, dumpLog,
updateStatus, smallestPregapLbaPerTrack, dumping); updateStatus, smallestPregapLbaPerTrack, dumping,
out newPregapSectors);
if(!fixSubchannelPosition || if(!fixSubchannelPosition ||
desiredSubchannel == MmcSubchannel.None) desiredSubchannel == MmcSubchannel.None)
@@ -313,9 +315,11 @@ namespace Aaru.Core.Media
static bool CheckIndexesFromSubchannel(byte[] deSub, Dictionary<byte, string> isrcs, byte currentTrack, static bool CheckIndexesFromSubchannel(byte[] deSub, Dictionary<byte, string> isrcs, byte currentTrack,
ref string mcn, Track[] tracks, DumpLog dumpLog, ref string mcn, Track[] tracks, DumpLog dumpLog,
UpdateStatusHandler updateStatus, UpdateStatusHandler updateStatus,
Dictionary<byte, int> smallestPregapLbaPerTrack, bool dumping) Dictionary<byte, int> smallestPregapLbaPerTrack, bool dumping,
out List<ulong> newPregapSectors)
{ {
bool status = false; bool status = false;
newPregapSectors = new List<ulong>();
// Check subchannel // Check subchannel
for(int subPos = 0; subPos < deSub.Length; subPos += 96) for(int subPos = 0; subPos < deSub.Length; subPos += 96)
@@ -437,6 +441,9 @@ namespace Aaru.Core.Media
updateStatus?. updateStatus?.
Invoke($"Pregap for track {trackNo} set to {tracks[i].TrackPregap} sectors."); Invoke($"Pregap for track {trackNo} set to {tracks[i].TrackPregap} sectors.");
for(var p = 0; p < dif; p++)
newPregapSectors.Add(tracks[i].TrackStartSector + (ulong)p);
status = true; status = true;
} }
@@ -458,6 +465,9 @@ namespace Aaru.Core.Media
updateStatus?. updateStatus?.
Invoke($"Pregap for track {trackNo} set to {tracks[i].TrackPregap} sectors."); Invoke($"Pregap for track {trackNo} set to {tracks[i].TrackPregap} sectors.");
for(var p = 0; p < (int)(tracks[i].TrackPregap - oldPregap); p++)
newPregapSectors.Add(tracks[i].TrackStartSector + (ulong)p);
status = true; status = true;
continue; continue;
@@ -471,6 +481,11 @@ namespace Aaru.Core.Media
byte aframe = (byte)((q[9] / 16 * 10) + (q[9] & 0x0F)); byte aframe = (byte)((q[9] / 16 * 10) + (q[9] & 0x0F));
int aPos = (amin * 60 * 75) + (asec * 75) + aframe - 150; int aPos = (amin * 60 * 75) + (asec * 75) + aframe - 150;
// Do not set INDEX 1 to a value higher than what the TOC already said.
if(q[2] == 1 &&
aPos > (int)tracks[i].TrackStartSector)
continue;
if(tracks[i].Indexes.ContainsKey(q[2]) && if(tracks[i].Indexes.ContainsKey(q[2]) &&
aPos >= tracks[i].Indexes[q[2]]) aPos >= tracks[i].Indexes[q[2]])
continue; continue;

View File

@@ -301,7 +301,7 @@ namespace Aaru.Tests.Issues
bool indexesChanged = CompactDisc.WriteSubchannelToImage(MmcSubchannel.Raw, bool indexesChanged = CompactDisc.WriteSubchannelToImage(MmcSubchannel.Raw,
MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, 1, null, MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, 1, null,
isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents, true, isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents, true,
outputOptical, true, true, null, null, smallestPregapLbaPerTrack, false); outputOptical, true, true, null, null, smallestPregapLbaPerTrack, false, out _);
if(indexesChanged) if(indexesChanged)
outputOptical.SetTracks(tracks.ToList()); outputOptical.SetTracks(tracks.ToList());
@@ -321,7 +321,7 @@ namespace Aaru.Tests.Issues
bool indexesChanged = CompactDisc.WriteSubchannelToImage(MmcSubchannel.Raw, bool indexesChanged = CompactDisc.WriteSubchannelToImage(MmcSubchannel.Raw,
MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, sectorsToDo, MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, sectorsToDo,
null, isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents, null, isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents,
true, outputOptical, true, true, null, null, smallestPregapLbaPerTrack, false); true, outputOptical, true, true, null, null, smallestPregapLbaPerTrack, false, out _);
if(indexesChanged) if(indexesChanged)
outputOptical.SetTracks(tracks.ToList()); outputOptical.SetTracks(tracks.ToList());

View File

@@ -359,7 +359,7 @@ namespace Aaru.Tests.WritableImages
MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, 1, MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, 1,
null, isrcs, (byte)track.TrackSequence, ref mcn, tracks, null, isrcs, (byte)track.TrackSequence, ref mcn, tracks,
subchannelExtents, true, outputFormat, true, true, null, null, subchannelExtents, true, outputFormat, true, true, null, null,
smallestPregapLbaPerTrack, false); smallestPregapLbaPerTrack, false, out _);
if(indexesChanged) if(indexesChanged)
outputFormat.SetTracks(tracks.ToList()); outputFormat.SetTracks(tracks.ToList());
@@ -382,7 +382,7 @@ namespace Aaru.Tests.WritableImages
MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector,
sectorsToDo, null, isrcs, (byte)track.TrackSequence, ref mcn, tracks, sectorsToDo, null, isrcs, (byte)track.TrackSequence, ref mcn, tracks,
subchannelExtents, true, outputFormat, true, true, null, null, subchannelExtents, true, outputFormat, true, true, null, null,
smallestPregapLbaPerTrack, false); smallestPregapLbaPerTrack, false, out _);
if(indexesChanged) if(indexesChanged)
outputFormat.SetTracks(tracks.ToList()); outputFormat.SetTracks(tracks.ToList());

View File

@@ -949,7 +949,7 @@ namespace Aaru.Commands.Image
MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, 1, null, MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, 1, null,
isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents, isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents,
fixSubchannelPosition, outputFormat, fixSubchannel, fixSubchannelCrc, null, fixSubchannelPosition, outputFormat, fixSubchannel, fixSubchannelCrc, null,
null, smallestPregapLbaPerTrack, false); null, smallestPregapLbaPerTrack, false, out _);
if(indexesChanged) if(indexesChanged)
outputOptical.SetTracks(tracks.ToList()); outputOptical.SetTracks(tracks.ToList());
@@ -971,7 +971,7 @@ namespace Aaru.Commands.Image
MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector,
sectorsToDo, null, isrcs, (byte)track.TrackSequence, ref mcn, tracks, sectorsToDo, null, isrcs, (byte)track.TrackSequence, ref mcn, tracks,
subchannelExtents, fixSubchannelPosition, outputFormat, fixSubchannel, subchannelExtents, fixSubchannelPosition, outputFormat, fixSubchannel,
fixSubchannelCrc, null, null, smallestPregapLbaPerTrack, false); fixSubchannelCrc, null, null, smallestPregapLbaPerTrack, false, out _);
if(indexesChanged) if(indexesChanged)
outputOptical.SetTracks(tracks.ToList()); outputOptical.SetTracks(tracks.ToList());