diff --git a/client.go b/client.go index cae82ea4..661784a4 100644 --- a/client.go +++ b/client.go @@ -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) { diff --git a/main.go b/main.go index 7d988794..412b920e 100644 --- a/main.go +++ b/main.go @@ -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) diff --git a/termseq.go b/termseq.go index 19803b00..f904cad8 100644 --- a/termseq.go +++ b/termseq.go @@ -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