Skip to content

Commit e55eb41

Browse files
committed
add debugging context to readPacket errors
1 parent 432973c commit e55eb41

File tree

1 file changed

+24
-8
lines changed

1 file changed

+24
-8
lines changed

encoding/ssh/filexfer/packets.go

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package sshfx
22

33
import (
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

Comments
 (0)