]> granicus.if.org Git - python/commitdiff
Merged revisions 80784 via svnmerge from
authorRonald Oussoren <ronaldoussoren@mac.com>
Wed, 5 May 2010 15:13:15 +0000 (15:13 +0000)
committerRonald Oussoren <ronaldoussoren@mac.com>
Wed, 5 May 2010 15:13:15 +0000 (15:13 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r80784 | ronald.oussoren | 2010-05-05 16:48:37 +0200 (Wed, 05 May 2010) | 9 lines

  The C function used by uuid.uuid4 is broken on
  OSX 10.6 in that after os.fork() the parent and
  child generate the same sequence of UUIDs.

  This patch falls back to the the Python implementation
  on OSX 10.6 or later.

  Fixes issue #8621.
........

Lib/test/test_uuid.py
Lib/uuid.py
Misc/NEWS

index cc21baef5dbc5f964f1286406159547f1f46bf04..e5030849184a56dc0092243ce618830f81a0355f 100644 (file)
@@ -446,6 +446,34 @@ class TestUUID(TestCase):
             equal(u, uuid.UUID(v))
             equal(str(u), v)
 
+    def testIssue8621(self):
+        import os
+        import sys
+        if os.name != 'posix':
+            return
+
+        # On at least some versions of OSX uuid.uuid4 generates
+        # the same sequence of UUIDs in the parent and any
+        # children started using fork.
+        fds = os.pipe()
+        pid = os.fork()
+        if pid == 0:
+            os.close(fds[0])
+            value = uuid.uuid4()
+            os.write(fds[1], value.hex)
+            os._exit(0)
+
+        else:
+            os.close(fds[1])
+            parent_value = uuid.uuid4().hex
+            os.waitpid(pid, 0)
+            child_value = os.read(fds[0], 100)
+
+            self.assertNotEqual(parent_value, child_value)
+
+
+
+
 
 def test_main():
     test_support.run_unittest(TestUUID)
index 4840fa5d0f31359af6c989b926bf3269f07b2358..5cc9fd0c6b5db48817a0fd9237c6aab2f055d827 100644 (file)
@@ -406,6 +406,19 @@ try:
         if hasattr(lib, 'uuid_generate_time'):
             _uuid_generate_time = lib.uuid_generate_time
 
+    # The uuid_generate_* functions are broken on MacOS X 10.6, as noted
+    # in issue #8621 the function generates the same sequence of values
+    # in the parent process and all children created using fork (unless
+    # those children use exec as well).
+    #
+    # Assume that the uuid_generate functions are broken from 10.6 onward,
+    # the test can be adjusted when a later version is fixed.
+    import sys
+    if sys.platform == 'darwin':
+        import os
+        if int(os.uname()[2].split('.')[0]) >= 10:
+            _uuid_generate_random = _uuid_generate_time = None
+
     # On Windows prior to 2000, UuidCreate gives a UUID containing the
     # hardware address.  On Windows 2000 and later, UuidCreate makes a
     # random UUID and UuidCreateSequential gives a UUID containing the
index 5d7bd4fa7699eb7c6060d346d36f0076a7269b3f..f862ae87825a89057d389ab6f6e7ae30650b04d9 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -33,6 +33,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #8621: uuid.uuid4() returned the same sequence of values in the
+  parent and any children created using ``os.fork`` on MacOS X 10.6.
+
 - Issue #8313: traceback.format_exception_only() encodes unicode message to
   ASCII with backslashreplace error handler if str(value) failed