fix udp datagram parser

This commit is contained in:
rui.zheng
2017-01-19 13:34:58 +08:00
parent 3d7715d71d
commit 0f737bddba
+10 -6
View File
@@ -8,6 +8,7 @@ import (
"errors"
"fmt"
"io"
"io/ioutil"
"net"
"strconv"
"sync"
@@ -591,7 +592,6 @@ func NewUDPDatagram(header *UDPHeader, data []byte) *UDPDatagram {
}
func ReadUDPDatagram(r io.Reader) (*UDPDatagram, error) {
// b := make([]byte, 65797)
b := lPool.Get().([]byte)
defer lPool.Put(b)
@@ -621,17 +621,21 @@ func ReadUDPDatagram(r io.Reader) (*UDPDatagram, error) {
return nil, ErrBadAddrType
}
// extended feature, for udp over tcp, using reserved field for data length
dlen := int(header.Rsv)
if n < hlen+dlen {
if dlen == 0 { // standard SOCKS5 UDP datagram
extra, err := ioutil.ReadAll(r) // we assume no redundant data
if err != nil {
return nil, err
}
copy(b[n:], extra)
n += len(extra) // total length
dlen = n - hlen // data length
} else { // extended feature, for UDP over TCP, using reserved field as data length
if _, err := io.ReadFull(r, b[n:hlen+dlen]); err != nil {
return nil, err
}
n = hlen + dlen
}
if dlen == 0 {
dlen = n - hlen
}
header.Addr = new(Addr)
if err := header.Addr.Decode(b[3:hlen]); err != nil {