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
diff --git a/terminal.go b/terminal.go
index a0ddba3..66439cf 100644
--- a/terminal.go
+++ b/terminal.go
@@ -409,19 +409,22 @@
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/terminal_test.go b/terminal_test.go
index 6ea92d9..7fbf0e6 100644
--- a/terminal_test.go
+++ b/terminal_test.go
@@ -141,6 +141,16 @@
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) {