pathauditor: check for Windows shortname aliases stable 3.2.3
authorMatt Mackall <mpm@selenic.com>
Thu, 18 Dec 2014 14:18:28 -0600
branchstable
changeset 23599 6dad422ecc5a
parent 23598 c02a05cc6f5e
child 23600 71f8c28b9f1b
pathauditor: check for Windows shortname aliases
mercurial/pathutil.py
tests/test-commit.t
--- a/mercurial/pathutil.py	Tue Dec 16 13:08:17 2014 -0500
+++ b/mercurial/pathutil.py	Thu Dec 18 14:18:28 2014 -0600
@@ -46,6 +46,13 @@
             or _lowerclean(parts[0]) in ('.hg', '.hg.', '')
             or os.pardir in parts):
             raise util.Abort(_("path contains illegal component: %s") % path)
+        # Windows shortname aliases
+        for p in parts:
+            if "~" in p:
+                first, last = p.split("~", 1)
+                if last.isdigit() and first.upper() in ["HG", "HG8B6C"]:
+                    raise util.Abort(_("path contains illegal component: %s")
+                                     % path)
         if '.hg' in _lowerclean(path):
             lparts = [_lowerclean(p.lower()) for p in parts]
             for p in '.hg', '.hg.':
--- a/tests/test-commit.t	Tue Dec 16 13:08:17 2014 -0500
+++ b/tests/test-commit.t	Thu Dec 18 14:18:28 2014 -0600
@@ -474,4 +474,38 @@
   abort: path contains illegal component: .h\xe2\x80\x8cg/hgrc (esc)
   [255]
 
-  $ cd ..
+  $ hg rollback -f
+  repository tip rolled back to revision 1 (undo commit)
+  $ cat > evil-commit.py <<EOF
+  > from mercurial import ui, hg, context, node
+  > notrc = "HG~1/hgrc"
+  > u = ui.ui()
+  > r = hg.repository(u, '.')
+  > def filectxfn(repo, memctx, path):
+  >     return context.memfilectx(repo, path, '[hooks]\nupdate = echo owned')
+  > c = context.memctx(r, [r['tip'].node(), node.nullid],
+  >                    'evil', [notrc], filectxfn, 0)
+  > r.commitctx(c)
+  > EOF
+  $ $PYTHON evil-commit.py
+  $ hg co --clean tip
+  abort: path contains illegal component: HG~1/hgrc
+  [255]
+
+  $ hg rollback -f
+  repository tip rolled back to revision 1 (undo commit)
+  $ cat > evil-commit.py <<EOF
+  > from mercurial import ui, hg, context, node
+  > notrc = "HG8B6C~2/hgrc"
+  > u = ui.ui()
+  > r = hg.repository(u, '.')
+  > def filectxfn(repo, memctx, path):
+  >     return context.memfilectx(repo, path, '[hooks]\nupdate = echo owned')
+  > c = context.memctx(r, [r['tip'].node(), node.nullid],
+  >                    'evil', [notrc], filectxfn, 0)
+  > r.commitctx(c)
+  > EOF
+  $ $PYTHON evil-commit.py
+  $ hg co --clean tip
+  abort: path contains illegal component: HG8B6C~2/hgrc
+  [255]