From 5501b5e3d769e56d48722e97dd98f571ff128a54 Mon Sep 17 00:00:00 2001
From: Tim Peters <tim.peters@gmail.com>
Date: Mon, 28 Apr 2003 03:13:03 +0000
Subject: 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.
---
 Doc/lib/libos.tex   |  6 +++++-
 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):
-- 
cgit v0.12

