summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2003-04-28 03:13:03 (GMT)
committerTim Peters <tim.peters@gmail.com>2003-04-28 03:13:03 (GMT)
commit5501b5e3d769e56d48722e97dd98f571ff128a54 (patch)
tree9099b46bc29cae35ba3bb834ef0ed9e6b28298d5
parentbf89b3a1f7937d7dbbcb2d739b3276c363631d9c (diff)
downloadcpython-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.tex6
-rw-r--r--Lib/test/test_os.py23
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):