diff options
author | Tim Peters <tim.peters@gmail.com> | 2003-04-28 03:13:03 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2003-04-28 03:13:03 (GMT) |
commit | 5501b5e3d769e56d48722e97dd98f571ff128a54 (patch) | |
tree | 9099b46bc29cae35ba3bb834ef0ed9e6b28298d5 | |
parent | bf89b3a1f7937d7dbbcb2d739b3276c363631d9c (diff) | |
download | cpython-5501b5e3d769e56d48722e97dd98f571ff128a54.zip cpython-5501b5e3d769e56d48722e97dd98f571ff128a54.tar.gz cpython-5501b5e3d769e56d48722e97dd98f571ff128a54.tar.bz2 |
SF bug 728097: tmpnam problems on windows 2.3b, breaks test.test_os.
tmpnam() appears essentially useless on Windows, and it finally broke
the test for Irmen de Jong. Read the long new comment in test_tmpnam()
for details. Since the MS implementation is insane, it might be good
if we supplied a different implementation.
Bugfix candidate.
-rw-r--r-- | Doc/lib/libos.tex | 6 | ||||
-rw-r--r-- | Lib/test/test_os.py | 23 |
2 files changed, 27 insertions, 2 deletions
diff --git a/Doc/lib/libos.tex b/Doc/lib/libos.tex index c92aa4d..6a1223f 100644 --- a/Doc/lib/libos.tex +++ b/Doc/lib/libos.tex @@ -1025,7 +1025,11 @@ paths returned by \function{tmpnam()}; no automatic cleanup is provided. \warning{Use of \function{tmpnam()} is vulnerable to symlink attacks; consider using \function{tmpfile()} instead.} -Availability: \UNIX, Windows. +Availability: \UNIX, Windows. This function probably shouldn't be used +on Windows, though: Microsoft's implementation of \function{tmpnam()} +always creates a name in the root directory of the current drive, and +that's generally a poor location for a temp file (depending on +privileges, you may not even be able to open a file using this name). \end{funcdesc} \begin{datadesc}{TMP_MAX} diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 94c0bfb..9ea1d06 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -54,11 +54,32 @@ class TemporaryFileTests(unittest.TestCase): self.assert_(s == "foobar") def test_tmpnam(self): + import sys if not hasattr(os, "tmpnam"): return warnings.filterwarnings("ignore", "tmpnam", RuntimeWarning, r"test_os$") - self.check_tempfile(os.tmpnam()) + name = os.tmpnam() + if sys.platform in ("win32",): + # The Windows tmpnam() seems useless. From the MS docs: + # + # The character string that tmpnam creates consists of + # the path prefix, defined by the entry P_tmpdir in the + # file STDIO.H, followed by a sequence consisting of the + # digit characters '0' through '9'; the numerical value + # of this string is in the range 1 - 65,535. Changing the + # definitions of L_tmpnam or P_tmpdir in STDIO.H does not + # change the operation of tmpnam. + # + # The really bizarre part is that, at least under MSVC6, + # P_tmpdir is "\\". That is, the path returned refers to + # the root of the current drive. That's a terrible place to + # put temp files, and, depending on privileges, the user + # may not even be able to open a file in the root directory. + self.failIf(os.path.exists(name), + "file already exists for temporary file") + else: + self.check_tempfile(name) # Test attributes on return values from os.*stat* family. class StatAttributeTests(unittest.TestCase): |