Skip to content

Commit e0f2eaa

Browse files
Improve Header coverage
1 parent 290392f commit e0f2eaa

File tree

3 files changed

+47
-5
lines changed

3 files changed

+47
-5
lines changed

OpenMcdf.Tests/BinaryReaderTests.cs

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,19 @@ public sealed class BinaryReaderTests
66
[TestMethod]
77
public void ReadGuid()
88
{
9-
byte[] bytes = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10 };
9+
byte[] bytes = [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10];
1010
using MemoryStream stream = new(bytes);
1111
using CfbBinaryReader reader = new(stream);
1212
Guid guid = reader.ReadGuid();
1313
Assert.AreEqual(new Guid(bytes), guid);
14+
15+
Assert.ThrowsException<EndOfStreamException>(() => reader.ReadGuid());
1416
}
1517

1618
[TestMethod]
1719
public void ReadFileTime()
1820
{
19-
byte[] bytes = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
21+
byte[] bytes = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
2022
using MemoryStream stream = new(bytes);
2123
using CfbBinaryReader reader = new(stream);
2224
DateTime actual = reader.ReadFileTime();
@@ -29,7 +31,39 @@ public void ReadFileTime()
2931
public void ReadHeader(string fileName)
3032
{
3133
using FileStream stream = File.OpenRead(fileName);
32-
using CfbBinaryReader reader = new(stream);
34+
using MemoryStream memoryStream = new();
35+
stream.CopyAllTo(memoryStream);
36+
37+
using CfbBinaryReader reader = new(memoryStream);
3338
Header header = reader.ReadHeader();
39+
40+
stream.CopyAllTo(memoryStream);
41+
memoryStream.WriteByte(1); // Corrupt signature
42+
Assert.ThrowsException<FormatException>(() => reader.ReadHeader());
43+
44+
stream.CopyAllTo(memoryStream);
45+
memoryStream.Position = 24;
46+
memoryStream.WriteByte(1); // Corrupt CLSID
47+
Assert.ThrowsException<FormatException>(() => reader.ReadHeader());
48+
49+
stream.CopyAllTo(memoryStream);
50+
memoryStream.Position = 26;
51+
memoryStream.WriteByte(1); // Corrupt Major version
52+
Assert.ThrowsException<FormatException>(() => reader.ReadHeader());
53+
54+
stream.CopyAllTo(memoryStream);
55+
memoryStream.Position = 28;
56+
memoryStream.WriteByte(1); // Corrupt byte order
57+
Assert.ThrowsException<FormatException>(() => reader.ReadHeader());
58+
59+
stream.CopyAllTo(memoryStream);
60+
memoryStream.Position = 32;
61+
memoryStream.WriteByte(1); // Corrupt mini sector shift
62+
Assert.ThrowsException<FormatException>(() => reader.ReadHeader());
63+
64+
stream.CopyAllTo(memoryStream);
65+
memoryStream.Position = 32;
66+
memoryStream.WriteByte(1); // Corrupt mini sector shift
67+
Assert.ThrowsException<FormatException>(() => reader.ReadHeader());
3468
}
3569
}

OpenMcdf/Header.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ internal sealed class Header : IEquatable<Header?>
1616
/// <summary>
1717
/// Identification signature for the compound file structure.
1818
/// </summary>
19-
internal static readonly byte[] Signature = new byte[] { 0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1 };
19+
internal static readonly byte[] Signature = [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1];
2020

2121
internal static readonly byte[] Unused = new byte[6];
2222

OpenMcdf/StreamExtensions.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,5 +59,13 @@ public static void WriteByteCore(this Stream stream, byte value)
5959
}
6060

6161
#endif
62-
}
6362

63+
public static void CopyAllTo(this Stream source, Stream destination)
64+
{
65+
source.Position = 0;
66+
destination.Position = 0;
67+
destination.SetLength(source.Length);
68+
source.CopyTo(destination);
69+
destination.Position = 0;
70+
}
71+
}

0 commit comments

Comments
 (0)