opener: forbid paths ending with directory separator (issue2507)

If Linux is asked to open a filename with a trailing directory separator,
e.g. "foo/", the open fails with EISDIR. On AIX, the open succeeds, opening
file "foo". This causes test-mq-qnew to fail on AIX.

Fix by adding 'ends with directory separator' to the conditions checked
by the path auditor. Change test to expect auditor fail message.
This commit is contained in:
Jim Hague 2010-12-17 12:05:45 +00:00
parent 4655fb606c
commit e572ae4bd8
2 changed files with 6 additions and 2 deletions

View File

@ -487,6 +487,7 @@ class path_auditor(object):
'''ensure that a filesystem path contains no banned components.
the following properties of a path are checked:
- ends with a directory separator
- under top-level .hg
- starts at the root of a windows drive
- contains ".."
@ -504,6 +505,9 @@ class path_auditor(object):
def __call__(self, path):
if path in self.audited:
return
# AIX ignores "/" at end of path, others raise EISDIR.
if endswithsep(path):
raise Abort(_("path ends in directory separator: %s") % path)
normpath = os.path.normcase(path)
parts = splitpath(normpath)
if (os.path.splitdrive(path)[0]

View File

@ -107,7 +107,7 @@ plain headers
abort: "foo#bar" cannot be used as the name of a patch
abort: "foo:bar" cannot be used as the name of a patch
% qnew with name containing slash
abort: cannot write patch "foo/": (Is a|No such file or) directory (re)
abort: path ends in directory separator: foo/
abort: "foo" already exists as a directory
foo/bar.patch
popping foo/bar.patch
@ -172,7 +172,7 @@ hg headers
abort: "foo#bar" cannot be used as the name of a patch
abort: "foo:bar" cannot be used as the name of a patch
% qnew with name containing slash
abort: cannot write patch "foo/": (Is a|No such file or) directory (re)
abort: path ends in directory separator: foo/
abort: "foo" already exists as a directory
foo/bar.patch
popping foo/bar.patch