abiosoft / ishell

Library for creating interactive cli applications.
MIT License
1.68k stars 195 forks source link

History file handle leak #113

Open crweatherly opened 5 years ago

crweatherly commented 5 years ago

The history file is not closed when it is reset, resulting in leaked file handles.

Here's a program that demonstrates the bug:

package main

import "gopkg.in/abiosoft/ishell.v2"

func main() {
        shell := ishell.New()

        shell.AddCmd(&ishell.Cmd{
                Name: "on",
                Func: func(ctx *ishell.Context) {
                        shell.SetHistoryPath("test-history")
                },
        })
        shell.AddCmd(&ishell.Cmd{
                Name: "off",
                Func: func(ctx *ishell.Context) {
                        shell.SetHistoryPath("")
                },
        })

        shell.Run()
}

By watching the output of lsof -c main on *nix can see that every call to on leaves the previous history file handle open. off does not close the existing file handle either.

It seems you need something like:

diff --git a/ishell.go b/ishell.go
index 098af06..c0545c1 100644
--- a/ishell.go
+++ b/ishell.go
@@ -393,6 +393,7 @@ func (s *Shell) SetHistoryPath(path string) {
        // Instance.
        config := s.reader.scanner.Config.Clone()
        config.HistoryFile = path
+       s.reader.scanner.Close()
        s.reader.scanner, _ = readline.NewEx(config)
 }