Commit d6dd1dc1 authored by Adam Langley's avatar Adam Langley

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://codereview.appspot.com/13255050
parent c459930c
......@@ -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:
......
......@@ -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) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment