From 0f1763877cfdec24017c1b5929723678f2d8a658 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Fri, 3 Jul 2026 12:10:45 +0800 Subject: [PATCH] Fix v2rayhttp upgrade leak --- transport/v2rayhttpupgrade/client.go | 5 +++++ transport/v2raywebsocket/client.go | 2 ++ transport/v2raywebsocket/conn.go | 1 + 3 files changed, 8 insertions(+) diff --git a/transport/v2rayhttpupgrade/client.go b/transport/v2rayhttpupgrade/client.go index f282d3f6..27ef8758 100644 --- a/transport/v2rayhttpupgrade/client.go +++ b/transport/v2rayhttpupgrade/client.go @@ -87,22 +87,27 @@ func (c *Client) DialContext(ctx context.Context) (net.Conn, error) { request.Header.Set("Upgrade", "websocket") err = request.Write(conn) if err != nil { + conn.Close() return nil, err } bufReader := std_bufio.NewReader(conn) response, err := http.ReadResponse(bufReader, request) if err != nil { + conn.Close() return nil, err } if response.StatusCode != 101 || !strings.EqualFold(response.Header.Get("Connection"), "upgrade") || !strings.EqualFold(response.Header.Get("Upgrade"), "websocket") { + conn.Close() + response.Body.Close() return nil, E.New("v2ray-http-upgrade: unexpected status: ", response.Status) } if bufReader.Buffered() > 0 { buffer := buf.NewSize(bufReader.Buffered()) _, err = buffer.ReadFullFrom(bufReader, buffer.Len()) if err != nil { + conn.Close() return nil, err } conn = bufio.NewCachedConn(conn, buffer) diff --git a/transport/v2raywebsocket/client.go b/transport/v2raywebsocket/client.go index e5630109..a071e8d1 100644 --- a/transport/v2raywebsocket/client.go +++ b/transport/v2raywebsocket/client.go @@ -93,12 +93,14 @@ func (c *Client) dialContext(ctx context.Context, requestURL *url.URL, headers h reader, _, err := ws.Dialer{Header: ws.HandshakeHeaderHTTP(headers), Protocols: protocols}.Upgrade(deadlineConn, requestURL) deadlineConn.SetDeadline(time.Time{}) if err != nil { + conn.Close() return nil, err } if reader != nil { buffer := buf.NewSize(reader.Buffered()) _, err = buffer.ReadFullFrom(reader, buffer.Len()) if err != nil { + conn.Close() return nil, err } conn = bufio.NewCachedConn(conn, buffer) diff --git a/transport/v2raywebsocket/conn.go b/transport/v2raywebsocket/conn.go index cb788fc9..4939e737 100644 --- a/transport/v2raywebsocket/conn.go +++ b/transport/v2raywebsocket/conn.go @@ -187,6 +187,7 @@ func (c *EarlyWebsocketConn) writeRequest(content []byte) error { if len(lateData) > 0 { _, err = conn.Write(lateData) if err != nil { + conn.Close() return err } }