@@ -60,6 +60,7 @@ func NewReader(r io.Reader) (*Reader, error) {
6060 }
6161
6262 var lzmaHeader [lzma .HeaderLen ]byte
63+
6364 lzmaHeader [0 ] = lzma.Properties {LC : 3 , LP : 0 , PB : 2 }.Code ()
6465 binary .LittleEndian .PutUint32 (lzmaHeader [1 :5 ], dictSize )
6566 copy (lzmaHeader [5 :], rb [len (rb )- 16 :len (rb )- 8 ])
@@ -85,39 +86,44 @@ func NewReader(r io.Reader) (*Reader, error) {
8586
8687// Read reads uncompressed data from the stream.
8788func (z * Reader ) Read (p []byte ) (n int , err error ) {
88- for n == 0 {
89+ for {
8990 n , err = z .decompressor .Read (p )
90- if err != nil {
91- return n , err
92- }
9391
94- z .crc = crc32 .Update (z .crc , crc32 .IEEETable , p [:n ])
95- z .dataSize += uint64 (n )
92+ if n > 0 {
93+ z .crc = crc32 .Update (z .crc , crc32 .IEEETable , p [:n ])
94+ z .dataSize += uint64 (n )
9695
97- if ! errors .Is (err , io .EOF ) {
98- return n , err
96+ return n , nil
9997 }
10098
101- var trailer [trailerSize ]byte
102- if _ , err := io .ReadFull (z .r , trailer [:]); err != nil {
103- return n , err
99+ if err == nil {
100+ continue
104101 }
105102
106- crc := binary .LittleEndian .Uint32 (trailer [:4 ])
107- if crc != z .crc {
108- return n , & InvalidCRCError {crc }
109- }
103+ if errors .Is (err , io .EOF ) {
104+ var trailer [trailerSize ]byte
105+ if _ , err := io .ReadFull (z .r , trailer [:]); err != nil {
106+ return n , err
107+ }
110108
111- dataSize := binary .LittleEndian .Uint64 (trailer [4 : 12 ])
112- if dataSize != z .dataSize {
113- return n , & InvalidDataSizeError { dataSize }
114- }
109+ crc := binary .LittleEndian .Uint32 (trailer [: 4 ])
110+ if crc != z .crc {
111+ return n , & InvalidCRCError { crc }
112+ }
115113
116- memberSize := binary .LittleEndian .Uint64 (trailer [12 :])
117- if memberSize != z .memberSize {
118- return n , & InvalidMemberSizeError {memberSize }
114+ dataSize := binary .LittleEndian .Uint64 (trailer [4 :12 ])
115+ if dataSize != z .dataSize {
116+ return n , & InvalidDataSizeError {dataSize }
117+ }
118+
119+ memberSize := binary .LittleEndian .Uint64 (trailer [12 :])
120+ if memberSize != z .memberSize {
121+ return n , & InvalidMemberSizeError {memberSize }
122+ }
123+
124+ return n , io .EOF
119125 }
120- }
121126
122- return n , nil
127+ return n , err
128+ }
123129}
0 commit comments