From b1bafab3239741b9a4dda533f39d40db3e9a1e85 Mon Sep 17 00:00:00 2001
From: Eric <xplzv@126.com>
Date: Mon, 4 Nov 2019 21:29:13 +0800
Subject: [PATCH] [Bugfix] fix unclosed fd

---
 pkg/common/client.go          |  1 +
 pkg/common/utils.go           |  2 ++
 pkg/handler/session.go        | 12 ++++++++++++
 pkg/handler/wrappersession.go | 12 ++++++++++++
 4 files changed, 27 insertions(+)

diff --git a/pkg/common/client.go b/pkg/common/client.go
index 6c0aafa..3313b98 100644
--- a/pkg/common/client.go
+++ b/pkg/common/client.go
@@ -238,6 +238,7 @@ func (c *Client) UploadFile(url string, gFile string, res interface{}, params ..
 	if err != nil {
 		return err
 	}
+	defer f.Close()
 	buf := new(bytes.Buffer)
 	bodyWriter := multipart.NewWriter(buf)
 	gName := filepath.Base(gFile)
diff --git a/pkg/common/utils.go b/pkg/common/utils.go
index cd80e2d..801860f 100644
--- a/pkg/common/utils.go
+++ b/pkg/common/utils.go
@@ -28,10 +28,12 @@ func GzipCompressFile(srcPath, dstPath string) error {
 	if err != nil {
 		return err
 	}
+	defer sf.Close()
 	df, err := os.Create(dstPath)
 	if err != nil {
 		return err
 	}
+	defer df.Close()
 	writer := gzip.NewWriter(df)
 	writer.Name = dstPath
 	writer.ModTime = time.Now().UTC()
diff --git a/pkg/handler/session.go b/pkg/handler/session.go
index 90026d3..0916034 100644
--- a/pkg/handler/session.go
+++ b/pkg/handler/session.go
@@ -129,10 +129,22 @@ func (h *interactiveHandler) watchWinSizeChange() {
 }
 
 func (h *interactiveHandler) pauseWatchWinSize() {
+	select {
+	case <-h.sess.Sess.Context().Done():
+		return
+	default:
+
+	}
 	h.winWatchChan <- false
 }
 
 func (h *interactiveHandler) resumeWatchWinSize() {
+	select {
+	case <-h.sess.Sess.Context().Done():
+		return
+	default:
+
+	}
 	h.winWatchChan <- true
 }
 
diff --git a/pkg/handler/wrappersession.go b/pkg/handler/wrappersession.go
index b73e648..5367b6d 100644
--- a/pkg/handler/wrappersession.go
+++ b/pkg/handler/wrappersession.go
@@ -15,10 +15,13 @@ type WrapperSession struct {
 	inWriter  io.WriteCloser
 	outReader io.ReadCloser
 	mux       *sync.RWMutex
+
+	closed chan struct{}
 }
 
 func (w *WrapperSession) initial() {
 	w.initReadPip()
+	w.closed = make(chan struct{})
 	go w.readLoop()
 }
 
@@ -37,11 +40,20 @@ func (w *WrapperSession) readLoop() {
 			break
 		}
 	}
+	w.mux.RLock()
 	_ = w.inWriter.Close()
+	_ = w.outReader.Close()
+	w.mux.RUnlock()
+	close(w.closed)
 
 }
 
 func (w *WrapperSession) Read(p []byte) (int, error) {
+	select {
+	case <-w.closed:
+		return 0, io.EOF
+	default:
+	}
 	w.mux.RLock()
 	defer w.mux.RUnlock()
 	return w.outReader.Read(p)
-- 
2.18.0