Browse Source

Add recover() to H2 server's flushWriter.Write()

Fixes https://github.com/XTLS/Xray-core/issues/1748
RPRX 2 years ago
parent
commit
836e84b851
2 changed files with 10 additions and 5 deletions
  1. 3 5
      transport/internet/http/dialer.go
  2. 7 0
      transport/internet/http/hub.go

+ 3 - 5
transport/internet/http/dialer.go

@@ -204,7 +204,7 @@ type WaitReadCloser struct {
 func (w *WaitReadCloser) Set(rc io.ReadCloser) {
 	w.ReadCloser = rc
 	defer func() {
-		if err := recover(); err != nil {
+		if recover() != nil {
 			rc.Close()
 		}
 	}()
@@ -225,10 +225,8 @@ func (w *WaitReadCloser) Close() error {
 		return w.ReadCloser.Close()
 	}
 	defer func() {
-		if err := recover(); err != nil {
-			if w.ReadCloser != nil {
-				w.ReadCloser.Close()
-			}
+		if recover() != nil && w.ReadCloser != nil {
+			w.ReadCloser.Close()
 		}
 	}()
 	close(w.Wait)

+ 7 - 0
transport/internet/http/hub.go

@@ -51,6 +51,13 @@ func (fw flushWriter) Write(p []byte) (n int, err error) {
 		return 0, io.ErrClosedPipe
 	}
 
+	defer func() {
+		if recover() != nil {
+			fw.d.Close()
+			err = io.ErrClosedPipe
+		}
+	}()
+
 	n, err = fw.w.Write(p)
 	if f, ok := fw.w.(http.Flusher); ok && err == nil {
 		f.Flush()