From e32b05768f71d7df28b02329e015ff2a44d711db Mon Sep 17 00:00:00 2001 From: Pieter de Boer Date: Fri, 24 Jan 2014 10:10:44 +0100 Subject: [PATCH] Fix length overrun in EDNS0 parsing. Original text: (in Dutch) Ik kreeg crashes (index out of range) in het parsen van een EDNS0_LLQ optie, doordat de method: 'func (e *EDNS0_LLQ) unpack(b []byte)' een byte slice van 1 byte groot kreeg waar dan meerdere uint16's uit gelezen werden. --- edns.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/edns.go b/edns.go index 06896c38..3d553f9b 100644 --- a/edns.go +++ b/edns.go @@ -345,6 +345,9 @@ func (e *EDNS0_UL) pack() ([]byte, error) { func (e *EDNS0_UL) Option() uint16 { return EDNS0UL } func (e *EDNS0_UL) unpack(b []byte) { + if len(b) < 4 { + return + } e.Lease = uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3]) } func (e *EDNS0_UL) String() string { return strconv.FormatUint(uint64(e.Lease), 10) } @@ -383,6 +386,9 @@ func (e *EDNS0_LLQ) pack() ([]byte, error) { } func (e *EDNS0_LLQ) unpack(b []byte) { + if len(b) < 18 { + return + } e.Version, _ = unpackUint16(b, 0) e.Opcode, _ = unpackUint16(b, 2) e.Error, _ = unpackUint16(b, 4)