diff --git a/contrib/hg-ssh b/contrib/hg-ssh
index 30c34fde40cc547d8b0c0d3e695f7ec077fbd6fe_Y29udHJpYi9oZy1zc2g=..cc021114fc98f0f91e2ab5ce946e062ea414759e_Y29udHJpYi9oZy1zc2g= 100755
--- a/contrib/hg-ssh
+++ b/contrib/hg-ssh
@@ -31,9 +31,9 @@
 
 from mercurial import dispatch
 
-import sys, os
+import sys, os, shlex
 
 cwd = os.getcwd()
 allowed_paths = [os.path.normpath(os.path.join(cwd, os.path.expanduser(path)))
                  for path in sys.argv[1:]]
 orig_cmd = os.getenv('SSH_ORIGINAL_COMMAND', '?')
@@ -35,6 +35,11 @@
 
 cwd = os.getcwd()
 allowed_paths = [os.path.normpath(os.path.join(cwd, os.path.expanduser(path)))
                  for path in sys.argv[1:]]
 orig_cmd = os.getenv('SSH_ORIGINAL_COMMAND', '?')
+try:
+    cmdargv = shlex.split(orig_cmd)
+except ValueError, e:
+    sys.stderr.write("Illegal command %r: %s\n" % (orig_cmd, e))
+    sys.exit(-1)
 
@@ -40,6 +45,6 @@
 
-if orig_cmd.startswith('hg -R ') and orig_cmd.endswith(' serve --stdio'):
-    path = orig_cmd[6:-14]
+if cmdargv[:2] == ['hg', '-R'] and cmdargv[3:] == ['serve', '--stdio']:
+    path = cmdargv[2]
     repo = os.path.normpath(os.path.join(cwd, os.path.expanduser(path)))
     if repo in allowed_paths:
         dispatch.dispatch(dispatch.request(['-R', repo, 'serve', '--stdio']))
diff --git a/tests/test-ssh.t b/tests/test-ssh.t
index 30c34fde40cc547d8b0c0d3e695f7ec077fbd6fe_dGVzdHMvdGVzdC1zc2gudA==..cc021114fc98f0f91e2ab5ce946e062ea414759e_dGVzdHMvdGVzdC1zc2gudA== 100644
--- a/tests/test-ssh.t
+++ b/tests/test-ssh.t
@@ -275,6 +275,19 @@
   $ hg id --ssh "python $TESTDIR/dummyssh" "ssh://user@dummy/a repo"
   3fb238f49e8c
 
+Test hg-ssh:
+
+  $ SSH_ORIGINAL_COMMAND="'hg' -R 'a repo' serve --stdio" hg id --ssh "python \"$TESTDIR\"/../contrib/hg-ssh \"$TESTTMP/a repo\"" "ssh://user@dummy/a repo"
+  3fb238f49e8c
+  $ SSH_ORIGINAL_COMMAND="'hg' -R 'a repo' serve --stdio" hg id --ssh "python \"$TESTDIR\"/../contrib/hg-ssh \"$TESTTMP\"" "ssh://user@dummy/a repo"
+  remote: Illegal repository '$TESTTMP/a repo'
+  abort: no suitable response from remote hg!
+  [255]
+  $ SSH_ORIGINAL_COMMAND="'hg' -R 'a'repo' serve --stdio" hg id --ssh "python \"$TESTDIR\"/../contrib/hg-ssh \"$TESTTMP\"" "ssh://user@dummy/a repo"
+  remote: Illegal command "'hg' -R 'a'repo' serve --stdio": No closing quotation
+  abort: no suitable response from remote hg!
+  [255]
+
   $ cat dummylog
   Got arguments 1:user@dummy 2:hg -R nonexistent serve --stdio
   Got arguments 1:user@dummy 2:hg -R /$TESTTMP/nonexistent serve --stdio