summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid McLean <gopsychonauts@gmail.com>2013-08-11 14:29:18 +1000
committerDavid McLean <gopsychonauts@gmail.com>2013-08-11 14:29:18 +1000
commit281a73f0308afb85eea5b4d29422031c06132429 (patch)
tree7846368c72f7a946e417f960dbe46c8a3bf43d68
parent99069c2fe2c1af51224ca204c15705d5f7f076fa (diff)
downloadxmobar-281a73f0308afb85eea5b4d29422031c06132429.tar.gz
xmobar-281a73f0308afb85eea5b4d29422031c06132429.tar.bz2
Run Coms using runInteractiveProcess, not runInteractiveCommand
The API exposed by Com is command -> [arguments] -> alias -> timeout -> Com. Since the command and arguments are separated like this, one would assume that the command is run "safely": The arguments are already separated in the arg list, so the command should be run without passing through a shell, which ensures that stray shell metacharacters in the arguments don't mess up anything. However, previous versions simply joined the command with its arguments into one string and then passed that string into a shell to run. This is counter-intuitive given the seemingly "safe" API exposed by Com, so using runInteractiveProcess instead is the correct implementation. Note that users may still run commands that need shells by being explicit about it, like this: Run Com "/bin/bash" ["-c", "command | nextCommand & parallelCommand"] 60
-rw-r--r--src/Commands.hs2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/Commands.hs b/src/Commands.hs
index a4ab5ed..e4402fc 100644
--- a/src/Commands.hs
+++ b/src/Commands.hs
@@ -62,7 +62,7 @@ instance Exec Command where
start (Com prog args _ r) cb = if r > 0 then go else exec
where go = exec >> tenthSeconds r >> go
exec = do
- (i,o,e,p) <- runInteractiveCommand (unwords (prog:args))
+ (i,o,e,p) <- runInteractiveProcess prog args Nothing Nothing
exit <- waitForProcess p
let closeHandles = hClose o >> hClose i >> hClose e
getL = handle (\(SomeException _) -> return "")