diff --git a/src/lint/linter/ArcanistExternalLinter.php b/src/lint/linter/ArcanistExternalLinter.php
--- a/src/lint/linter/ArcanistExternalLinter.php
+++ b/src/lint/linter/ArcanistExternalLinter.php
@@ -385,6 +385,19 @@
     return null;
   }
 
+  /**
+   * Prepare the path to be added to the command string
+   *
+   * This method is expected to return an already escaped string.
+   *
+   * @param string Path to the file being linted
+   *
+   * @return string The command-ready file argument
+   */
+  protected function getPathArgumentForLinterFuture($path) {
+    return csprintf('%s', $path);
+  }
+
   protected function buildFutures(array $paths) {
     $executable = $this->getExecutableCommand();
 
@@ -393,15 +406,14 @@
     $futures = array();
     foreach ($paths as $path) {
       if ($this->supportsReadDataFromStdin()) {
-        $future = new ExecFuture(
-          '%C %C',
-          $bin,
+        $future = new ExecFuture('%C %C', $bin,
           $this->getReadDataFromStdinFilename());
         $future->write($this->getEngine()->loadData($path));
       } else {
         // TODO: In commit hook mode, we need to do more handling here.
         $disk_path = $this->getEngine()->getFilePathOnDisk($path);
-        $future = new ExecFuture('%C %s', $bin, $disk_path);
+        $path_argument = $this->getPathArgumentForLinterFuture($disk_path);
+        $future = new ExecFuture('%C %C', $bin, $path_argument);
       }
 
       $futures[$path] = $future;