Fix v2rayhttp upgrade leak

This commit is contained in:
世界
2026-07-03 12:10:45 +08:00
parent 25a600db24
commit 0f1763877c
3 changed files with 8 additions and 0 deletions

View File

@@ -87,22 +87,27 @@ func (c *Client) DialContext(ctx context.Context) (net.Conn, error) {
request.Header.Set("Upgrade", "websocket") request.Header.Set("Upgrade", "websocket")
err = request.Write(conn) err = request.Write(conn)
if err != nil { if err != nil {
conn.Close()
return nil, err return nil, err
} }
bufReader := std_bufio.NewReader(conn) bufReader := std_bufio.NewReader(conn)
response, err := http.ReadResponse(bufReader, request) response, err := http.ReadResponse(bufReader, request)
if err != nil { if err != nil {
conn.Close()
return nil, err return nil, err
} }
if response.StatusCode != 101 || if response.StatusCode != 101 ||
!strings.EqualFold(response.Header.Get("Connection"), "upgrade") || !strings.EqualFold(response.Header.Get("Connection"), "upgrade") ||
!strings.EqualFold(response.Header.Get("Upgrade"), "websocket") { !strings.EqualFold(response.Header.Get("Upgrade"), "websocket") {
conn.Close()
response.Body.Close()
return nil, E.New("v2ray-http-upgrade: unexpected status: ", response.Status) return nil, E.New("v2ray-http-upgrade: unexpected status: ", response.Status)
} }
if bufReader.Buffered() > 0 { if bufReader.Buffered() > 0 {
buffer := buf.NewSize(bufReader.Buffered()) buffer := buf.NewSize(bufReader.Buffered())
_, err = buffer.ReadFullFrom(bufReader, buffer.Len()) _, err = buffer.ReadFullFrom(bufReader, buffer.Len())
if err != nil { if err != nil {
conn.Close()
return nil, err return nil, err
} }
conn = bufio.NewCachedConn(conn, buffer) conn = bufio.NewCachedConn(conn, buffer)

View File

@@ -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) reader, _, err := ws.Dialer{Header: ws.HandshakeHeaderHTTP(headers), Protocols: protocols}.Upgrade(deadlineConn, requestURL)
deadlineConn.SetDeadline(time.Time{}) deadlineConn.SetDeadline(time.Time{})
if err != nil { if err != nil {
conn.Close()
return nil, err return nil, err
} }
if reader != nil { if reader != nil {
buffer := buf.NewSize(reader.Buffered()) buffer := buf.NewSize(reader.Buffered())
_, err = buffer.ReadFullFrom(reader, buffer.Len()) _, err = buffer.ReadFullFrom(reader, buffer.Len())
if err != nil { if err != nil {
conn.Close()
return nil, err return nil, err
} }
conn = bufio.NewCachedConn(conn, buffer) conn = bufio.NewCachedConn(conn, buffer)

View File

@@ -187,6 +187,7 @@ func (c *EarlyWebsocketConn) writeRequest(content []byte) error {
if len(lateData) > 0 { if len(lateData) > 0 {
_, err = conn.Write(lateData) _, err = conn.Write(lateData)
if err != nil { if err != nil {
conn.Close()
return err return err
} }
} }