@@ -2,6 +2,7 @@ package sshfx
22
33import (
44 "errors"
5+ "fmt"
56 "io"
67)
78
@@ -123,8 +124,12 @@ func readPacket(r io.Reader, b []byte, maxPacketLength uint32) ([]byte, error) {
123124 b = make ([]byte , smallBufferSize )
124125 }
125126
126- if _ , err := io .ReadFull (r , b [:4 ]); err != nil {
127- return nil , err
127+ if n , err := io .ReadFull (r , b [:4 ]); err != nil {
128+ if err == io .EOF {
129+ // Do not ever wrap io.EOF.
130+ return nil , err
131+ }
132+ return nil , fmt .Errorf ("error reading packet length: %d of 4: %w" , n , err )
128133 }
129134
130135 length := unmarshalPacketLength (b )
@@ -150,13 +155,24 @@ func readPacket(r io.Reader, b []byte, maxPacketLength uint32) ([]byte, error) {
150155 }
151156
152157 n , err := io .ReadFull (r , b [:length ])
153- if err == io .EOF {
154- // ReadFull only returns EOF if it has read no bytes.
155- // In this case, that means a partial packet (length but no body),
156- // and thus unexpected.
157- err = io .ErrUnexpectedEOF
158+ b = b [:n ]
159+
160+ if err != nil {
161+ if err == io .EOF {
162+ // ReadFull only returns EOF if it has read no bytes.
163+ // In this case, that means a partial packet (length but no body),
164+ // and thus unexpected.
165+ err = io .ErrUnexpectedEOF
166+ }
167+
168+ if n > 0 {
169+ return b , fmt .Errorf ("error reading packet body: %d of %d: (%s) %w" , n , length , PacketType (b [0 ]), err )
170+ }
171+
172+ return b , fmt .Errorf ("error reading packet body: %d of %d: %w" , n , length , err )
158173 }
159- return b [:n ], err
174+
175+ return b , nil
160176}
161177
162178// ReadFrom provides a simple functional packet reader,
0 commit comments