ishell
ishell copied to clipboard
History file handle leak
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)
}