From 40ed1b19e2e1b0de7997891bd652cb09d6d469d7 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sun, 10 Apr 2022 14:10:41 +0100 Subject: [PATCH] Do not set INDEX 1 to a value higher than what the TOC already said. --- .../Devices/Dumping/CompactDisc/CdiReady.cs | 10 ++++++-- Aaru.Core/Devices/Dumping/CompactDisc/Data.cs | 12 ++++++++-- .../Devices/Dumping/CompactDisc/Error.cs | 6 ++--- .../Devices/Dumping/CompactDisc/LeadOuts.cs | 4 ++-- Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs | 2 +- Aaru.Core/Media/CompactDisc.cs | 23 +++++++++++++++---- .../Issues/OpticalImageConvertIssueTest.cs | 4 ++-- .../WritableOpticalMediaImageTest.cs | 4 ++-- Aaru/Commands/Image/Convert.cs | 4 ++-- 9 files changed, 49 insertions(+), 20 deletions(-) diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/CdiReady.cs b/Aaru.Core/Devices/Dumping/CompactDisc/CdiReady.cs index d4d81672d..a8272e525 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/CdiReady.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/CdiReady.cs @@ -270,7 +270,8 @@ namespace Aaru.Core.Devices.Dumping bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel, desiredSubchannel, sub, i + r, 1, subLog, isrcs, 1, ref mcn, tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel, - _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true); + _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true, + out List _); // Set tracks and go back if(indexesChanged) @@ -355,12 +356,17 @@ namespace Aaru.Core.Devices.Dumping bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel, desiredSubchannel, sub, i, blocksToRead, subLog, isrcs, 1, ref mcn, tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel, - _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true); + _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true, + out List newPregapSectors); // Set tracks and go back if(indexesChanged) { (_outputPlugin as IWritableOpticalImage).SetTracks(tracks.ToList()); + + foreach(ulong newPregapSector in newPregapSectors) + _resume.BadBlocks.Add(newPregapSector); + i -= blocksToRead; continue; diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs index f58c40481..f26b72462 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs @@ -508,12 +508,16 @@ namespace Aaru.Core.Devices.Dumping desiredSubchannel, sub, i + r, 1, subLog, isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel, _fixSubchannelCrc, _dumpLog, UpdateStatus, - smallestPregapLbaPerTrack, true); + smallestPregapLbaPerTrack, true, out List newPregapSectors); // Set tracks and go back if(indexesChanged) { (_outputPlugin as IWritableOpticalImage).SetTracks(tracks.ToList()); + + foreach(ulong newPregapSector in newPregapSectors) + _resume.BadBlocks.Add(newPregapSector); + i -= blocksToRead; continue; @@ -652,12 +656,16 @@ namespace Aaru.Core.Devices.Dumping desiredSubchannel, sub, i, blocksToRead, subLog, isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel, _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, - true); + true, out List newPregapSectors); // Set tracks and go back if(indexesChanged) { (_outputPlugin as IWritableOpticalImage).SetTracks(tracks.ToList()); + + foreach(ulong newPregapSector in newPregapSectors) + _resume.BadBlocks.Add(newPregapSector); + i -= blocksToRead; continue; diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs index 9d590ed91..fb459fa18 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs @@ -367,7 +367,7 @@ namespace Aaru.Core.Devices.Dumping bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel, desiredSubchannel, sub, badSector, 1, subLog, isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel, - _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true); + _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true, out _); // Set tracks and go back if(!indexesChanged) @@ -499,7 +499,7 @@ namespace Aaru.Core.Devices.Dumping desiredSubchannel, sub, badSector, 1, subLog, isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel, _fixSubchannelCrc, _dumpLog, UpdateStatus, - smallestPregapLbaPerTrack, true); + smallestPregapLbaPerTrack, true, out _); // Set tracks and go back if(indexesChanged) @@ -662,7 +662,7 @@ namespace Aaru.Core.Devices.Dumping subLog, isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel, _fixSubchannelCrc, _dumpLog, UpdateStatus, - smallestPregapLbaPerTrack, true); + smallestPregapLbaPerTrack, true, out _); if(subchannelExtents.Contains(bs)) continue; diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/LeadOuts.cs b/Aaru.Core/Devices/Dumping/CompactDisc/LeadOuts.cs index 05af61387..3ef508b68 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/LeadOuts.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/LeadOuts.cs @@ -163,7 +163,7 @@ namespace Aaru.Core.Devices.Dumping bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel, desiredSubchannel, sub, i, _maximumReadable, subLog, isrcs, 0xAA, ref mcn, tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel, - _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true); + _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true, out _); // Set tracks and go back if(indexesChanged) @@ -331,7 +331,7 @@ namespace Aaru.Core.Devices.Dumping bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel, desiredSubchannel, sub, i, _maximumReadable, subLog, isrcs, 0xAA, ref mcn, tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel, - _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true); + _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true, out _); // Set tracks and go back if(indexesChanged) diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs index 5d6aaffbe..3d2b47545 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs @@ -271,7 +271,7 @@ namespace Aaru.Core.Devices.Dumping bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel, desiredSubchannel, sub, badSector, 1, subLog, isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel, - _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true); + _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true, out _); // Set tracks and go back if(!indexesChanged) diff --git a/Aaru.Core/Media/CompactDisc.cs b/Aaru.Core/Media/CompactDisc.cs index 51d34aecf..a74ddaf06 100644 --- a/Aaru.Core/Media/CompactDisc.cs +++ b/Aaru.Core/Media/CompactDisc.cs @@ -72,7 +72,8 @@ namespace Aaru.Core.Media bool fixSubchannelPosition, IWritableImage outputPlugin, bool fixSubchannel, bool fixSubchannelCrc, DumpLog dumpLog, UpdateStatusHandler updateStatus, - Dictionary smallestPregapLbaPerTrack, bool dumping) + Dictionary smallestPregapLbaPerTrack, bool dumping, + out List newPregapSectors) { // We need to work in PW raw subchannels if(supportedSubchannel == MmcSubchannel.Q16) @@ -88,8 +89,9 @@ namespace Aaru.Core.Media byte[] deSub = Subchannel.Deinterleave(sub); - bool indexesChanged = CheckIndexesFromSubchannel(deSub, isrcs, currentTrack, ref mcn, tracks, dumpLog, - updateStatus, smallestPregapLbaPerTrack, dumping); + bool indexesChanged = CheckIndexesFromSubchannel(deSub, isrcs, currentTrack, ref mcn, tracks, dumpLog, + updateStatus, smallestPregapLbaPerTrack, dumping, + out newPregapSectors); if(!fixSubchannelPosition || desiredSubchannel == MmcSubchannel.None) @@ -313,9 +315,11 @@ namespace Aaru.Core.Media static bool CheckIndexesFromSubchannel(byte[] deSub, Dictionary isrcs, byte currentTrack, ref string mcn, Track[] tracks, DumpLog dumpLog, UpdateStatusHandler updateStatus, - Dictionary smallestPregapLbaPerTrack, bool dumping) + Dictionary smallestPregapLbaPerTrack, bool dumping, + out List newPregapSectors) { bool status = false; + newPregapSectors = new List(); // Check subchannel for(int subPos = 0; subPos < deSub.Length; subPos += 96) @@ -437,6 +441,9 @@ namespace Aaru.Core.Media updateStatus?. 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; } @@ -458,6 +465,9 @@ namespace Aaru.Core.Media updateStatus?. 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; continue; @@ -471,6 +481,11 @@ namespace Aaru.Core.Media byte aframe = (byte)((q[9] / 16 * 10) + (q[9] & 0x0F)); 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]) && aPos >= tracks[i].Indexes[q[2]]) continue; diff --git a/Aaru.Tests/Issues/OpticalImageConvertIssueTest.cs b/Aaru.Tests/Issues/OpticalImageConvertIssueTest.cs index 0e1240c2e..5b82b77dd 100644 --- a/Aaru.Tests/Issues/OpticalImageConvertIssueTest.cs +++ b/Aaru.Tests/Issues/OpticalImageConvertIssueTest.cs @@ -301,7 +301,7 @@ namespace Aaru.Tests.Issues bool indexesChanged = CompactDisc.WriteSubchannelToImage(MmcSubchannel.Raw, MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, 1, null, 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) outputOptical.SetTracks(tracks.ToList()); @@ -321,7 +321,7 @@ namespace Aaru.Tests.Issues bool indexesChanged = CompactDisc.WriteSubchannelToImage(MmcSubchannel.Raw, MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, sectorsToDo, 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) outputOptical.SetTracks(tracks.ToList()); diff --git a/Aaru.Tests/WritableImages/WritableOpticalMediaImageTest.cs b/Aaru.Tests/WritableImages/WritableOpticalMediaImageTest.cs index 58afbc6cc..c689d51ae 100644 --- a/Aaru.Tests/WritableImages/WritableOpticalMediaImageTest.cs +++ b/Aaru.Tests/WritableImages/WritableOpticalMediaImageTest.cs @@ -359,7 +359,7 @@ namespace Aaru.Tests.WritableImages MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, 1, null, isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents, true, outputFormat, true, true, null, null, - smallestPregapLbaPerTrack, false); + smallestPregapLbaPerTrack, false, out _); if(indexesChanged) outputFormat.SetTracks(tracks.ToList()); @@ -382,7 +382,7 @@ namespace Aaru.Tests.WritableImages MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, sectorsToDo, null, isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents, true, outputFormat, true, true, null, null, - smallestPregapLbaPerTrack, false); + smallestPregapLbaPerTrack, false, out _); if(indexesChanged) outputFormat.SetTracks(tracks.ToList()); diff --git a/Aaru/Commands/Image/Convert.cs b/Aaru/Commands/Image/Convert.cs index e329e1ee2..5c1ae38b3 100644 --- a/Aaru/Commands/Image/Convert.cs +++ b/Aaru/Commands/Image/Convert.cs @@ -949,7 +949,7 @@ namespace Aaru.Commands.Image MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, 1, null, isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents, fixSubchannelPosition, outputFormat, fixSubchannel, fixSubchannelCrc, null, - null, smallestPregapLbaPerTrack, false); + null, smallestPregapLbaPerTrack, false, out _); if(indexesChanged) outputOptical.SetTracks(tracks.ToList()); @@ -971,7 +971,7 @@ namespace Aaru.Commands.Image MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, sectorsToDo, null, isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents, fixSubchannelPosition, outputFormat, fixSubchannel, - fixSubchannelCrc, null, null, smallestPregapLbaPerTrack, false); + fixSubchannelCrc, null, null, smallestPregapLbaPerTrack, false, out _); if(indexesChanged) outputOptical.SetTracks(tracks.ToList());