diff --git a/proxy/vmess/vmessin_udp.go b/proxy/vmess/vmessin_udp.go index cc344eab..4e609552 100644 --- a/proxy/vmess/vmessin_udp.go +++ b/proxy/vmess/vmessin_udp.go @@ -34,20 +34,22 @@ func (handler *VMessInboundHandler) ListenUDP(port uint16) error { func (handler *VMessInboundHandler) AcceptPackets(conn *net.UDPConn) { for { - buffer := make([]byte, bufferSize) - nBytes, addr, err := conn.ReadFromUDP(buffer) + buffer := alloc.NewBuffer() + nBytes, addr, err := conn.ReadFromUDP(buffer.Value) if err != nil { log.Error("VMessIn failed to read UDP packets: %v", err) + buffer.Release() continue } - reader := bytes.NewReader(buffer[:nBytes]) + reader := bytes.NewReader(buffer.Value[:nBytes]) requestReader := protocol.NewVMessRequestReader(handler.clients) request, err := requestReader.Read(reader) if err != nil { log.Access(addr.String(), "", log.AccessRejected, err.Error()) log.Warning("VMessIn: Invalid request from (%s): %v", addr.String(), err) + buffer.Release() continue } log.Access(addr.String(), request.Address.String(), log.AccessAccepted, "") @@ -55,11 +57,13 @@ func (handler *VMessInboundHandler) AcceptPackets(conn *net.UDPConn) { cryptReader, err := v2io.NewAesDecryptReader(request.RequestKey, request.RequestIV, reader) if err != nil { log.Error("VMessIn: Failed to create decrypt reader: %v", err) + buffer.Release() continue } data := alloc.NewBuffer() nBytes, err = cryptReader.Read(data.Value) + buffer.Release() if err != nil { log.Warning("VMessIn: Unable to decrypt data: %v", err) data.Release() diff --git a/proxy/vmess/vmessout.go b/proxy/vmess/vmessout.go index 788d332a..68c20f6a 100644 --- a/proxy/vmess/vmessout.go +++ b/proxy/vmess/vmessout.go @@ -76,11 +76,12 @@ func (handler *VMessOutboundHandler) Dispatch(firstPacket v2net.Packet, ray ray. Address: firstPacket.Destination().Address(), } - buffer := make([]byte, 36) // 16 + 16 + 4 - rand.Read(buffer) - request.RequestIV = buffer[:16] - request.RequestKey = buffer[16:32] - request.ResponseHeader = buffer[32:] + buffer := alloc.NewSmallBuffer() + defer buffer.Release() + v2net.ReadAllBytes(rand.Reader, buffer.Value[:36]) // 16 + 16 + 4 + request.RequestIV = buffer.Value[:16] + request.RequestKey = buffer.Value[16:32] + request.ResponseHeader = buffer.Value[32:36] return startCommunicate(request, vNextAddress, ray, firstPacket) }