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