diff --git a/ShellCheck/Analytics.hs b/ShellCheck/Analytics.hs index edd1bdbadb54da3423e4f75fb099ce2a1a8375de..1b422406ea9c1e1cfad6b1d2ac5cb90a27d2ce2b 100644 --- a/ShellCheck/Analytics.hs +++ b/ShellCheck/Analytics.hs @@ -3676,28 +3676,33 @@ checkNonportableSignals _ = checkUnqualifiedCommand "trap" (const f) return $ err id 2173 "SIGKILL/SIGSTOP can not be trapped." -prop_checkMkdirDashPM0 = verify checkMkdirDashPM "mkdir -p -m 0755 dir" -prop_checkMkdirDashPM1 = verify checkMkdirDashPM "mkdir -pm 0755 dir" -prop_checkMkdirDashPM2 = verify checkMkdirDashPM "mkdir -vpm 0755 dir" -prop_checkMkdirDashPM3 = verify checkMkdirDashPM "mkdir -pm 0755 -v dir" -prop_checkMkdirDashPM4 = verify checkMkdirDashPM "mkdir --parents --mode=0755 dir" -prop_checkMkdirDashPM5 = verify checkMkdirDashPM "mkdir --parents --mode 0755 dir" -prop_checkMkdirDashPM6 = verify checkMkdirDashPM "mkdir -p --mode=0755 dir" -prop_checkMkdirDashPM7 = verify checkMkdirDashPM "mkdir --parents -m 0755 dir" -prop_checkMkdirDashPM8 = verifyNot checkMkdirDashPM "mkdir -p dir" -prop_checkMkdirDashPM9 = verifyNot checkMkdirDashPM "mkdir -m 0755 dir" -prop_checkMkdirDashPM10 = verifyNot checkMkdirDashPM "mkdir dir" -prop_checkMkdirDashPM11 = verifyNot checkMkdirDashPM "mkdir --parents dir" -prop_checkMkdirDashPM12 = verifyNot checkMkdirDashPM "mkdir --mode=0755 dir" -prop_checkMkdirDashPM13 = verifyNot checkMkdirDashPM "mkdir_func -pm 0755 dir" -checkMkdirDashPM _ t@(T_SimpleCommand _ _ _) = potentially $ do +prop_checkMkdirDashPM0 = verify checkMkdirDashPM "mkdir -p -m 0755 a/b" +prop_checkMkdirDashPM1 = verify checkMkdirDashPM "mkdir -pm 0755 $dir" +prop_checkMkdirDashPM2 = verify checkMkdirDashPM "mkdir -vpm 0755 a/b" +prop_checkMkdirDashPM3 = verify checkMkdirDashPM "mkdir -pm 0755 -v a/b" +prop_checkMkdirDashPM4 = verify checkMkdirDashPM "mkdir --parents --mode=0755 a/b" +prop_checkMkdirDashPM5 = verify checkMkdirDashPM "mkdir --parents --mode 0755 a/b" +prop_checkMkdirDashPM6 = verify checkMkdirDashPM "mkdir -p --mode=0755 a/b" +prop_checkMkdirDashPM7 = verify checkMkdirDashPM "mkdir --parents -m 0755 a/b" +prop_checkMkdirDashPM8 = verifyNot checkMkdirDashPM "mkdir -p a/b" +prop_checkMkdirDashPM9 = verifyNot checkMkdirDashPM "mkdir -m 0755 a/b" +prop_checkMkdirDashPM10 = verifyNot checkMkdirDashPM "mkdir a/b" +prop_checkMkdirDashPM11 = verifyNot checkMkdirDashPM "mkdir --parents a/b" +prop_checkMkdirDashPM12 = verifyNot checkMkdirDashPM "mkdir --mode=0755 a/b" +prop_checkMkdirDashPM13 = verifyNot checkMkdirDashPM "mkdir_func -pm 0755 a/b" +prop_checkMkdirDashPM14 = verifyNot checkMkdirDashPM "mkdir -p -m 0755 singlelevel" +checkMkdirDashPM _ t@(T_SimpleCommand _ _ args) = potentially $ do name <- getCommandName t guard $ name == "mkdir" dashP <- find ((\f -> f == "p" || f == "parents") . snd) flags dashM <- find ((\f -> f == "m" || f == "mode") . snd) flags - return $ warn (getId $ fst dashM) 2174 "-m will be ignored" - where - flags = getAllFlags t + guard $ any couldHaveSubdirs (drop 1 args) -- mkdir -pm 0700 dir is fine, but dir/subdir is not. + return $ warn (getId $ fst dashM) 2174 "When used with -p, -m only applies to the deepest directory." + where + flags = getAllFlags t + couldHaveSubdirs t = fromMaybe True $ do + name <- getLiteralString t + return $ '/' `elem` name checkMkdirDashPM _ _ = return () return []