From 9493db6048413ebb2e5659f2043f546e4d4e2f4c Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sun, 6 Jun 2021 13:56:10 +0100 Subject: [PATCH] Do not allow CD-only tags on non-CD media in CDRWin images. Fixes #502 --- Aaru.Images/CDRWin/CDRWin.cs | 1 + Aaru.Images/CDRWin/Read.cs | 21 ++++++++++++ Aaru.Images/CDRWin/Write.cs | 66 ++++++++++++++++++++++-------------- 3 files changed, 62 insertions(+), 26 deletions(-) diff --git a/Aaru.Images/CDRWin/CDRWin.cs b/Aaru.Images/CDRWin/CDRWin.cs index 10ee1b9bf..578b4dda0 100644 --- a/Aaru.Images/CDRWin/CDRWin.cs +++ b/Aaru.Images/CDRWin/CDRWin.cs @@ -49,6 +49,7 @@ namespace Aaru.DiscImages CdrWinDisc _discImage; ImageInfo _imageInfo; Stream _imageStream; + bool _isCd; /// Dictionary, index is track #, value is TrackFile Dictionary _offsetMap; SectorBuilder _sectorBuilder; diff --git a/Aaru.Images/CDRWin/Read.cs b/Aaru.Images/CDRWin/Read.cs index 6d3748d67..03d615f29 100644 --- a/Aaru.Images/CDRWin/Read.cs +++ b/Aaru.Images/CDRWin/Read.cs @@ -1352,6 +1352,27 @@ namespace Aaru.DiscImages _sectorBuilder = new SectorBuilder(); + int mediaTypeAsInt = (int)_discImage.MediaType; + + _isCd = (mediaTypeAsInt >= 10 && mediaTypeAsInt <= 39) || mediaTypeAsInt == 112 || + mediaTypeAsInt == 113 || (mediaTypeAsInt >= 150 && mediaTypeAsInt <= 152) || + mediaTypeAsInt == 154 || mediaTypeAsInt == 155 || + (mediaTypeAsInt >= 171 && mediaTypeAsInt <= 179) || + (mediaTypeAsInt >= 740 && mediaTypeAsInt <= 749); + + if(!_isCd) + { + _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorSync); + _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorHeader); + _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorSubHeader); + _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEcc); + _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEccP); + _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEccQ); + _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEdc); + _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdTrackFlags); + _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdTrackIsrc); + } + return true; } catch(Exception ex) diff --git a/Aaru.Images/CDRWin/Write.cs b/Aaru.Images/CDRWin/Write.cs index ec287e5ef..1c3f5c294 100644 --- a/Aaru.Images/CDRWin/Write.cs +++ b/Aaru.Images/CDRWin/Write.cs @@ -105,8 +105,18 @@ namespace Aaru.DiscImages Tracks = new List() }; - _trackFlags = new Dictionary(); - _trackIsrcs = new Dictionary(); + int mediaTypeAsInt = (int)_discImage.MediaType; + + _isCd = (mediaTypeAsInt >= 10 && mediaTypeAsInt <= 39) || mediaTypeAsInt == 112 || mediaTypeAsInt == 113 || + (mediaTypeAsInt >= 150 && mediaTypeAsInt <= 152) || mediaTypeAsInt == 154 || + mediaTypeAsInt == 155 || (mediaTypeAsInt >= 171 && mediaTypeAsInt <= 179) || + (mediaTypeAsInt >= 740 && mediaTypeAsInt <= 749); + + if(_isCd) + { + _trackFlags = new Dictionary(); + _trackIsrcs = new Dictionary(); + } IsWriting = true; ErrorMessage = null; @@ -125,11 +135,11 @@ namespace Aaru.DiscImages switch(tag) { - case MediaTagType.CD_MCN: + case MediaTagType.CD_MCN when _isCd: _discImage.Mcn = Encoding.ASCII.GetString(data); return true; - case MediaTagType.CD_TEXT: + case MediaTagType.CD_TEXT when _isCd: var cdTextStream = new FileStream(_writingBaseName + "_cdtext.bin", FileMode.Create, FileAccess.ReadWrite, FileShare.None); @@ -501,23 +511,26 @@ namespace Aaru.DiscImages (byte minute, byte second, byte frame) msf = LbaToMsf(track.TrackStartSector); _descriptorStream.WriteLine(" TRACK {0:D2} {1}", track.TrackSequence, GetTrackMode(track)); - if(_trackFlags.TryGetValue((byte)track.TrackSequence, out byte flagsByte)) - if(flagsByte != 0 && - flagsByte != (byte)CdFlags.DataTrack) - { - var flags = (CdFlags)flagsByte; + if(_isCd) + { + if(_trackFlags.TryGetValue((byte)track.TrackSequence, out byte flagsByte)) + if(flagsByte != 0 && + flagsByte != (byte)CdFlags.DataTrack) + { + var flags = (CdFlags)flagsByte; - _descriptorStream.WriteLine(" FLAGS{0}{1}{2}", - flags.HasFlag(CdFlags.CopyPermitted) ? " DCP" : "", - flags.HasFlag(CdFlags.FourChannel) ? " 4CH" : "", - flags.HasFlag(CdFlags.PreEmphasis) ? " PRE" : ""); - } + _descriptorStream.WriteLine(" FLAGS{0}{1}{2}", + flags.HasFlag(CdFlags.CopyPermitted) ? " DCP" : "", + flags.HasFlag(CdFlags.FourChannel) ? " 4CH" : "", + flags.HasFlag(CdFlags.PreEmphasis) ? " PRE" : ""); + } - if(_trackIsrcs.TryGetValue((byte)track.TrackSequence, out string isrc) && - !string.IsNullOrWhiteSpace(isrc)) - _descriptorStream.WriteLine(" ISRC {0}", isrc); + if(_trackIsrcs.TryGetValue((byte)track.TrackSequence, out string isrc) && + !string.IsNullOrWhiteSpace(isrc)) + _descriptorStream.WriteLine(" ISRC {0}", isrc); + } - if(track.TrackPregap > 0) + if(track.TrackPregap > 0 && _isCd) { _descriptorStream.WriteLine(" INDEX {0:D2} {1:D2}:{2:D2}:{3:D2}", 0, msf.minute, msf.second, msf.frame); @@ -531,13 +544,14 @@ namespace Aaru.DiscImages _descriptorStream.WriteLine(" INDEX {0:D2} {1:D2}:{2:D2}:{3:D2}", 1, msf.minute, msf.second, msf.frame); - foreach(KeyValuePair index in track.Indexes.Where(i => i.Key > 1)) - { - msf = LbaToMsf((ulong)index.Value); + if(_isCd) + foreach(KeyValuePair index in track.Indexes.Where(i => i.Key > 1)) + { + msf = LbaToMsf((ulong)index.Value); - _descriptorStream.WriteLine(" INDEX {0:D2} {1:D2}:{2:D2}:{3:D2}", index.Key, msf.minute, - msf.second, msf.frame); - } + _descriptorStream.WriteLine(" INDEX {0:D2} {1:D2}:{2:D2}:{3:D2}", index.Key, msf.minute, + msf.second, msf.frame); + } ushort lastSession = _writingTracks.Max(t => t.TrackSession); @@ -592,7 +606,7 @@ namespace Aaru.DiscImages switch(tag) { - case SectorTagType.CdTrackFlags: + case SectorTagType.CdTrackFlags when _isCd: { if(data.Length != 1) { @@ -605,7 +619,7 @@ namespace Aaru.DiscImages return true; } - case SectorTagType.CdTrackIsrc: + case SectorTagType.CdTrackIsrc when _isCd: { if(data != null) _trackIsrcs[(byte)sectorAddress] = Encoding.UTF8.GetString(data);