mirror of
https://github.com/ginuerzh/gosocks5.git
synced 2024-08-11 17:54:31 +00:00
fix udp datagram parser
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user