Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,10 +100,7 @@ func printPath(label, path string, stdoutIsTerminal bool) {
log.Printf("%s: skipping path with newline: %q", label, path)
return
}
if stdoutIsTerminal {
path = sanitizeName(path)
}
fmt.Println(path)
fmt.Println(sanitizeStdout(path, stdoutIsTerminal))
}

func writeLastDir(filename, lastDir string) {
Expand Down
10 changes: 2 additions & 8 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -346,14 +346,8 @@ Options:
return
}
// sanitize untrusted names when writing to a terminal
if term.IsTerminal(int(os.Stdout.Fd())) {
lines := strings.Split(resp, "\n")
for i := range lines {
lines[i] = sanitizeName(lines[i])
}
resp = strings.Join(lines, "\n")
}
fmt.Print(resp)
stdoutIsTerminal := term.IsTerminal(int(os.Stdout.Fd()))
fmt.Print(sanitizeStdout(resp, stdoutIsTerminal))
case *serverMode:
if err := os.Chdir(gUser.HomeDir); err != nil {
log.Print(err)
Expand Down
12 changes: 12 additions & 0 deletions termseq.go
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,18 @@ func sanitizeName(s string) string {
}, s)
}

// sanitizeStdout strips per-line control bytes when stdout is a terminal.
func sanitizeStdout(s string, stdoutIsTerminal bool) string {
if !stdoutIsTerminal {
return s
}
lines := strings.Split(s, "\n")
for i := range lines {
lines[i] = sanitizeName(lines[i])
}
return strings.Join(lines, "\n")
}

// sanitizeMessage sanitizes a message intended for the message line. Like
// sanitizeName it strips control runes, but it preserves terminal sequences
// that lf itself recognizes (SGR, EL, OSC 8) so internal messages that use
Expand Down
Loading