Skip to content

Commit 2d65d76

Browse files
committed
fix: avoid accidental OOM due to bogus allocation
1 parent 63a352f commit 2d65d76

File tree

2 files changed

+8
-3
lines changed

2 files changed

+8
-3
lines changed

ap/ap.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ func (ap *Accesspoint) performKeyExchange() ([]byte, error) {
425425

426426
// receive APResponseMessage message
427427
var apResponse pb.APResponseMessage
428-
if err := readMessage(cc, &apResponse); err != nil {
428+
if err := readMessage(cc, -1, &apResponse); err != nil {
429429
return nil, fmt.Errorf("failed reading APResponseMessage message: %w", err)
430430
}
431431

@@ -502,7 +502,7 @@ func (ap *Accesspoint) authenticate(ctx context.Context, credentials *pb.LoginCr
502502
var challengeResp pb.APResponseMessage
503503
if peekBytes, err := ap.encConn.peekUnencrypted(9); err != nil {
504504
return fmt.Errorf("failed peeking unencrypted bytes: %w", err)
505-
} else if err = readMessage(bytes.NewReader(peekBytes), &challengeResp); err == nil {
505+
} else if err = readMessage(bytes.NewReader(peekBytes), 9, &challengeResp); err == nil {
506506
return &AccesspointLoginError{Message: challengeResp.LoginFailed}
507507
}
508508

ap/conn.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,18 @@ func writeMessage(w io.Writer, withHello bool, m proto.Message) error {
3737
return nil
3838
}
3939

40-
func readMessage(r io.Reader, m proto.Message) error {
40+
func readMessage(r io.Reader, maxLength int, m proto.Message) error {
4141
// read length
4242
var length uint32
4343
if err := binary.Read(r, binary.BigEndian, &length); err != nil {
4444
return fmt.Errorf("failed reading message length: %w", err)
4545
}
4646

47+
// check length to avoid a mega allocation
48+
if maxLength > 0 && length > uint32(maxLength) {
49+
return fmt.Errorf("message too long: %d", length)
50+
}
51+
4752
// read message
4853
data := make([]byte, length-4)
4954
if _, err := io.ReadFull(r, data); err != nil {

0 commit comments

Comments
 (0)