diff --git a/DiscImageChef.DiscImages/CDRDAO.cs b/DiscImageChef.DiscImages/CDRDAO.cs index 6f513ad6..305de8fd 100644 --- a/DiscImageChef.DiscImages/CDRDAO.cs +++ b/DiscImageChef.DiscImages/CDRDAO.cs @@ -248,9 +248,22 @@ namespace DiscImageChef.ImagePlugins imageFilter.GetDataForkStream().Read(testArray, 0, 512); imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin); // Check for unexpected control characters that shouldn't be present in a text file and can crash this plugin - foreach(byte b in testArray) + bool twoConsecutiveNulls = false; + for(int i = 0; i < 512; i++) { - if(b < 0x20 && b != 0x0A && b != 0x0D && b != 0x00) + if(i >= imageFilter.GetDataForkStream().Length) + break; + + if(testArray[i] == 0) + { + if(twoConsecutiveNulls) + return false; + twoConsecutiveNulls = true; + } + else + twoConsecutiveNulls = false; + + if(testArray[i] < 0x20 && testArray[i] != 0x0A && testArray[i] != 0x0D && testArray[i] != 0x00) return false; } diff --git a/DiscImageChef.DiscImages/CDRWin.cs b/DiscImageChef.DiscImages/CDRWin.cs index 907c7fec..333677f3 100644 --- a/DiscImageChef.DiscImages/CDRWin.cs +++ b/DiscImageChef.DiscImages/CDRWin.cs @@ -320,9 +320,22 @@ namespace DiscImageChef.ImagePlugins imageFilter.GetDataForkStream().Read(testArray, 0, 512); imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin); // Check for unexpected control characters that shouldn't be present in a text file and can crash this plugin - foreach(byte b in testArray) + bool twoConsecutiveNulls = false; + for(int i = 0; i < 512; i++) { - if(b < 0x20 && b != 0x0A && b != 0x0D && b != 0x00) + if(i >= imageFilter.GetDataForkStream().Length) + break; + + if(testArray[i] == 0) + { + if(twoConsecutiveNulls) + return false; + twoConsecutiveNulls = true; + } + else + twoConsecutiveNulls = false; + + if(testArray[i] < 0x20 && testArray[i] != 0x0A && testArray[i] != 0x0D && testArray[i] != 0x00) return false; } diff --git a/DiscImageChef.DiscImages/CloneCD.cs b/DiscImageChef.DiscImages/CloneCD.cs index 6f5faab7..a70e2b88 100644 --- a/DiscImageChef.DiscImages/CloneCD.cs +++ b/DiscImageChef.DiscImages/CloneCD.cs @@ -127,9 +127,22 @@ namespace DiscImageChef.DiscImages imageFilter.GetDataForkStream().Read(testArray, 0, 512); imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin); // Check for unexpected control characters that shouldn't be present in a text file and can crash this plugin - foreach(byte b in testArray) + bool twoConsecutiveNulls = false; + for(int i = 0; i < 512; i++) { - if(b < 0x20 && b != 0x0A && b != 0x0D && b != 0x00) + if(i >= imageFilter.GetDataForkStream().Length) + break; + + if(testArray[i] == 0) + { + if(twoConsecutiveNulls) + return false; + twoConsecutiveNulls = true; + } + else + twoConsecutiveNulls = false; + + if(testArray[i] < 0x20 && testArray[i] != 0x0A && testArray[i] != 0x0D && testArray[i] != 0x00) return false; } diff --git a/DiscImageChef.DiscImages/GDI.cs b/DiscImageChef.DiscImages/GDI.cs index ee0ed256..f60a3f03 100644 --- a/DiscImageChef.DiscImages/GDI.cs +++ b/DiscImageChef.DiscImages/GDI.cs @@ -138,9 +138,22 @@ namespace DiscImageChef.ImagePlugins imageFilter.GetDataForkStream().Read(testArray, 0, 512); imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin); // Check for unexpected control characters that shouldn't be present in a text file and can crash this plugin - foreach(byte b in testArray) + bool twoConsecutiveNulls = false; + for(int i = 0; i < 512; i++) { - if(b < 0x20 && b != 0x0A && b != 0x0D && b != 0x00) + if(i >= imageFilter.GetDataForkStream().Length) + break; + + if(testArray[i] == 0) + { + if(twoConsecutiveNulls) + return false; + twoConsecutiveNulls = true; + } + else + twoConsecutiveNulls = false; + + if(testArray[i] < 0x20 && testArray[i] != 0x0A && testArray[i] != 0x0D && testArray[i] != 0x00) return false; } gdiStream = new StreamReader(imageFilter.GetDataForkStream());