@@ -7,23 +7,34 @@ namespace OpenMcdf3;
7
7
/// </summary>
8
8
internal sealed class CfbBinaryReader : BinaryReader
9
9
{
10
+ readonly byte [ ] guidBuffer = new byte [ 16 ] ;
10
11
readonly byte [ ] buffer = new byte [ DirectoryEntry . NameFieldLength ] ;
11
12
12
13
public CfbBinaryReader ( Stream input )
13
14
: base ( input , Encoding . Unicode , true )
14
15
{
15
16
}
16
17
17
- public Guid ReadGuid ( ) => new ( ReadBytes ( 16 ) ) ;
18
+ public Guid ReadGuid ( )
19
+ {
20
+ int bytesRead = 0 ;
21
+ do
22
+ {
23
+ int n = Read ( guidBuffer , bytesRead , guidBuffer . Length - bytesRead ) ;
24
+ if ( n == 0 )
25
+ throw new EndOfStreamException ( ) ;
26
+ bytesRead += n ;
27
+ } while ( bytesRead < guidBuffer . Length ) ;
28
+
29
+ return new Guid ( guidBuffer ) ;
30
+ }
18
31
19
32
public DateTime ReadFileTime ( )
20
33
{
21
34
long fileTime = ReadInt64 ( ) ;
22
35
return DateTime . FromFileTimeUtc ( fileTime ) ;
23
36
}
24
37
25
- private void ReadBytes ( byte [ ] buffer ) => Read ( buffer , 0 , buffer . Length ) ;
26
-
27
38
public Header ReadHeader ( )
28
39
{
29
40
Header header = new ( ) ;
@@ -90,8 +101,9 @@ public DirectoryEntry ReadDirectoryEntry(Version version)
90
101
91
102
DirectoryEntry entry = new ( ) ;
92
103
Read ( buffer , 0 , DirectoryEntry . NameFieldLength ) ;
93
- int nameLength = Math . Max ( 0 , ReadUInt16 ( ) - 2 ) ;
94
- entry . Name = Encoding . Unicode . GetString ( buffer , 0 , nameLength ) ;
104
+ ushort nameLength = ReadUInt16 ( ) ;
105
+ int clampedNameLength = Math . Max ( 0 , Math . Min ( ushort . MaxValue , nameLength - 2 ) ) ;
106
+ entry . Name = Encoding . Unicode . GetString ( buffer , 0 , clampedNameLength ) ;
95
107
entry . Type = ReadStorageType ( ) ;
96
108
entry . Color = ReadColor ( ) ;
97
109
entry . LeftSiblingId = ReadUInt32 ( ) ;
0 commit comments