fix mojibake reversion in display of utf8

When displaying a ByteString like "💕", safeOutput operates on
individual bytes like "\240\159\146\149" and isControl '\146' = True,
so it got truncated to just "\240".

So, only treat the low control characters, and DEL, as control
characters.

Also split Utility.Terminal out of Utility.SafeOutput. The latter needs
win32, but Utility.SafeOutput is used by Control.Exception, which is
used by Setup.

Sponsored-by: Nicholas Golder-Manning on Patreon
This commit is contained in:
Joey Hess 2023-04-12 13:48:21 -04:00
parent c50aa21d5f
commit a576fc3b12
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
7 changed files with 61 additions and 42 deletions

View file

@ -10,6 +10,8 @@ module Annex.UntrustedFilePath where
import Data.Char
import System.FilePath
import Utility.SafeOutput
{- Given a string that we'd like to use as the basis for FilePath, but that
- was provided by a third party and is not to be trusted, returns the closest
- sane FilePath.
@ -55,10 +57,7 @@ sanitizeLeadingFilePathCharacter s = s
controlCharacterInFilePath :: FilePath -> Bool
controlCharacterInFilePath = any (not . safechar)
where
safechar c
| not (isControl c) = True
| c == '\t' = True
| otherwise = False
safechar c = safeOutputChar c && c /= '\n'
{- ../ is a path traversal, no matter where it appears.
-