Properly handle escaped double quotes in quoted backtick expressions.

This commit is contained in:
Vidar Holen 2015-11-01 12:30:33 -08:00
parent a66ee2967c
commit 1a5296659b
2 changed files with 14 additions and 9 deletions

View File

@ -2565,6 +2565,7 @@ prop_checkSpacefulness27= verifyNotTree checkSpacefulness "echo ${a:+'foo'}"
prop_checkSpacefulness28= verifyNotTree checkSpacefulness "exec {n}>&1; echo $n" prop_checkSpacefulness28= verifyNotTree checkSpacefulness "exec {n}>&1; echo $n"
prop_checkSpacefulness29= verifyNotTree checkSpacefulness "n=$(stuff); exec {n}>&-;" prop_checkSpacefulness29= verifyNotTree checkSpacefulness "n=$(stuff); exec {n}>&-;"
prop_checkSpacefulness30= verifyTree checkSpacefulness "file='foo bar'; echo foo > $file;" prop_checkSpacefulness30= verifyTree checkSpacefulness "file='foo bar'; echo foo > $file;"
prop_checkSpacefulness31= verifyNotTree checkSpacefulness "echo \"`echo \\\"$1\\\"`\""
checkSpacefulness params t = checkSpacefulness params t =
doVariableFlowAnalysis readF writeF (Map.fromList defaults) (variableFlow params) doVariableFlowAnalysis readF writeF (Map.fromList defaults) (variableFlow params)

View File

@ -623,7 +623,7 @@ readArithmeticContents =
readDoubleQuoted, readDoubleQuoted,
readNormalDollar, readNormalDollar,
readBraced, readBraced,
readBackTicked, readUnquotedBackTicked,
readNormalLiteral "+-*/=%^,]?:" readNormalLiteral "+-*/=%^,]?:"
] ]
spacing spacing
@ -833,7 +833,7 @@ readNormalWordPart end = do
readGlob, readGlob,
readNormalDollar, readNormalDollar,
readBraced, readBraced,
readBackTicked, readUnquotedBackTicked,
readProcSub, readProcSub,
readNormalLiteral end, readNormalLiteral end,
readLiteralCurlyBraces readLiteralCurlyBraces
@ -869,7 +869,7 @@ readDollarBracedWord = do
list <- many readDollarBracedPart list <- many readDollarBracedPart
return $ T_NormalWord id list return $ T_NormalWord id list
readDollarBracedPart = readSingleQuoted <|> readDoubleQuoted <|> readExtglob <|> readNormalDollar <|> readBackTicked <|> readDollarBracedLiteral readDollarBracedPart = readSingleQuoted <|> readDoubleQuoted <|> readExtglob <|> readNormalDollar <|> readUnquotedBackTicked <|> readDollarBracedLiteral
readDollarBracedLiteral = do readDollarBracedLiteral = do
id <- getNextId id <- getNextId
@ -927,15 +927,18 @@ readSingleQuotedPart =
readSingleEscaped readSingleEscaped
<|> many1 (noneOf "'\\\x2018\x2019") <|> many1 (noneOf "'\\\x2018\x2019")
prop_readBackTicked = isOk readBackTicked "`ls *.mp3`"
prop_readBackTicked2 = isOk readBackTicked "`grep \"\\\"\"`" prop_readBackTicked = isOk (readBackTicked False) "`ls *.mp3`"
prop_readBackTicked3 = isWarning readBackTicked "´grep \"\\\"\"´" prop_readBackTicked2 = isOk (readBackTicked False) "`grep \"\\\"\"`"
prop_readBackTicked4 = isOk readBackTicked "`echo foo\necho bar`" prop_readBackTicked3 = isWarning (readBackTicked False) "´grep \"\\\"\"´"
prop_readBackTicked4 = isOk readSimpleCommand "`echo foo\necho bar`"
prop_readBackTicked5 = isOk readSimpleCommand "echo `foo`bar" prop_readBackTicked5 = isOk readSimpleCommand "echo `foo`bar"
prop_readBackTicked6 = isWarning readSimpleCommand "echo `foo\necho `bar" prop_readBackTicked6 = isWarning readSimpleCommand "echo `foo\necho `bar"
prop_readBackTicked7 = isOk readSimpleCommand "`#inline comment`" prop_readBackTicked7 = isOk readSimpleCommand "`#inline comment`"
prop_readBackTicked8 = isOk readSimpleCommand "echo `#comment` \\\nbar baz" prop_readBackTicked8 = isOk readSimpleCommand "echo `#comment` \\\nbar baz"
readBackTicked = called "backtick expansion" $ do readQuotedBackTicked = readBackTicked True
readUnquotedBackTicked = readBackTicked False
readBackTicked quoted = called "backtick expansion" $ do
id <- getNextId id <- getNextId
startPos <- getPosition startPos <- getPosition
backtick backtick
@ -954,6 +957,7 @@ readBackTicked = called "backtick expansion" $ do
return $ T_Backticked id result return $ T_Backticked id result
where where
unEscape [] = [] unEscape [] = []
unEscape ('\\':'"':rest) | quoted = '"' : unEscape rest
unEscape ('\\':x:rest) | x `elem` "$`\\" = x : unEscape rest unEscape ('\\':x:rest) | x `elem` "$`\\" = x : unEscape rest
unEscape ('\\':'\n':rest) = unEscape rest unEscape ('\\':'\n':rest) = unEscape rest
unEscape (c:rest) = c : unEscape rest unEscape (c:rest) = c : unEscape rest
@ -1021,7 +1025,7 @@ suggestForgotClosingQuote startPos endPos name = do
parseProblemAt endPos InfoC 1079 parseProblemAt endPos InfoC 1079
"This is actually an end quote, but due to next char it looks suspect." "This is actually an end quote, but due to next char it looks suspect."
doubleQuotedPart = readDoubleLiteral <|> readDoubleQuotedDollar <|> readBackTicked doubleQuotedPart = readDoubleLiteral <|> readDoubleQuotedDollar <|> readQuotedBackTicked
readDoubleQuotedLiteral = do readDoubleQuotedLiteral = do
doubleQuote doubleQuote