From 28dc961a18d867afc9c8d143f90212fbea73e4b9 Mon Sep 17 00:00:00 2001 From: Adam Langley Date: Sun, 15 Sep 2013 12:48:02 -0400 Subject: [PATCH] go.crypto/ssh/terminal: fix non-ASCII history. The length of history buffer entries (which are stored as strings) was being used as the number of runes. This was correct until ff9ce887b46b, which allowed unicode entry, but can now cause a panic when editing history that contains non-ASCII codepoints. R=golang-dev, sfrithjof, r CC=golang-dev https://golang.org/cl/13255050 --- ssh/terminal/terminal.go | 9 ++++++--- ssh/terminal/terminal_test.go | 10 ++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/ssh/terminal/terminal.go b/ssh/terminal/terminal.go index a0ddba3..66439cf 100644 --- a/ssh/terminal/terminal.go +++ b/ssh/terminal/terminal.go @@ -409,19 +409,22 @@ func (t *Terminal) handleKey(key rune) (line string, ok bool) { t.historyPending = string(t.line) } t.historyIndex++ - t.setLine([]rune(entry), len(entry)) + runes := []rune(entry) + t.setLine(runes, len(runes)) case keyDown: switch t.historyIndex { case -1: return case 0: - t.setLine([]rune(t.historyPending), len(t.historyPending)) + runes := []rune(t.historyPending) + t.setLine(runes, len(runes)) t.historyIndex-- default: entry, ok := t.history.NthPreviousEntry(t.historyIndex - 1) if ok { t.historyIndex-- - t.setLine([]rune(entry), len(entry)) + runes := []rune(entry) + t.setLine(runes, len(runes)) } } case keyEnter: diff --git a/ssh/terminal/terminal_test.go b/ssh/terminal/terminal_test.go index 6ea92d9..7fbf0e6 100644 --- a/ssh/terminal/terminal_test.go +++ b/ssh/terminal/terminal_test.go @@ -141,6 +141,16 @@ var keyPressTests = []struct { in: "Ξεσκεπάζω\r", line: "Ξεσκεπάζω", }, + { + in: "£\r\x1b[A\177\r", // non-ASCII char, enter, up, backspace. + line: "", + throwAwayLines: 1, + }, + { + in: "£\r££\x1b[A\x1b[B\177\r", // non-ASCII char, enter, 2x non-ASCII, up, down, backspace, enter. + line: "£", + throwAwayLines: 1, + }, } func TestKeyPresses(t *testing.T) {