diff --git a/Lib/uuid.py b/Lib/uuid.py index 66383218e70c0d..dcf5e90fce340b 100644 --- a/Lib/uuid.py +++ b/Lib/uuid.py @@ -533,6 +533,7 @@ def _netbios_getnode(): _generate_time_safe = _UuidCreate = None _has_uuid_generate_time_safe = None +_little_endian = None # Import optional C extension at toplevel, to help disabling it when testing try: @@ -545,7 +546,7 @@ def _load_system_functions(): """ Try to load platform-specific functions for generating uuids. """ - global _generate_time_safe, _UuidCreate, _has_uuid_generate_time_safe + global _generate_time_safe, _UuidCreate, _has_uuid_generate_time_safe, _little_endian if _has_uuid_generate_time_safe is not None: return @@ -564,6 +565,7 @@ def _load_system_functions(): elif _uuid is not None: _generate_time_safe = _uuid.generate_time_safe _has_uuid_generate_time_safe = _uuid.has_uuid_generate_time_safe + _little_endian = _uuid.little_endian return try: @@ -592,6 +594,7 @@ def _generate_time_safe(): res = _uuid_generate_time_safe(_buffer) return bytes(_buffer.raw), res _has_uuid_generate_time_safe = True + _little_endian = False break elif hasattr(lib, 'uuid_generate_time'): # pragma: nocover @@ -602,6 +605,7 @@ def _generate_time_safe(): _buffer = ctypes.create_string_buffer(16) _uuid_generate_time(_buffer) return bytes(_buffer.raw), None + _little_endian = False break # On Windows prior to 2000, UuidCreate gives a UUID containing the @@ -630,7 +634,10 @@ def _unix_getnode(): or ctypes.""" _load_system_functions() uuid_time, _ = _generate_time_safe() - return UUID(bytes=uuid_time).node + if _little_endian: + return UUID(bytes_le=uuid_time).node + else: + return UUID(bytes=uuid_time).node def _windll_getnode(): """Get the hardware address on Windows using ctypes.""" @@ -707,7 +714,10 @@ def uuid1(node=None, clock_seq=None): is_safe = SafeUUID(safely_generated) except ValueError: is_safe = SafeUUID.unknown - return UUID(bytes=uuid_time, is_safe=is_safe) + if _little_endian: + return UUID(bytes_le=uuid_time, is_safe=is_safe) + else: + return UUID(bytes=uuid_time, is_safe=is_safe) global _last_timestamp import time diff --git a/Misc/NEWS.d/next/Library/2018-05-24-17-41-36.bpo-32493.5tAoAu.rst b/Misc/NEWS.d/next/Library/2018-05-24-17-41-36.bpo-32493.5tAoAu.rst new file mode 100644 index 00000000000000..32f88dd0388d5a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-05-24-17-41-36.bpo-32493.5tAoAu.rst @@ -0,0 +1 @@ +Fixed :func:`uuid.uuid1` on FreeBSD. diff --git a/Modules/_uuidmodule.c b/Modules/_uuidmodule.c index 3a0c0573826692..9cd033d20f873c 100644 --- a/Modules/_uuidmodule.c +++ b/Modules/_uuidmodule.c @@ -19,7 +19,7 @@ py_uuid_generate_time_safe(PyObject *Py_UNUSED(context), res = uuid_generate_time_safe(uuid); return Py_BuildValue("y#i", (const char *) uuid, sizeof(uuid), res); -#elif HAVE_UUID_CREATE +#elif defined(HAVE_UUID_CREATE) uint32_t status; uuid_create(&uuid, &status); return Py_BuildValue("y#i", (const char *) &uuid, sizeof(uuid), (int) status); @@ -51,6 +51,12 @@ PyInit__uuid(void) int has_uuid_generate_time_safe = 1; #else int has_uuid_generate_time_safe = 0; +#endif + /* uuid_create() creates bytes with platform-depending endianess */ +#if !defined(HAVE_UUID_GENERATE_TIME_SAFE) && defined(HAVE_UUID_CREATE) + int little_endian = PY_LITTLE_ENDIAN; +#else + int little_endian = 0; #endif mod = PyModule_Create(&uuidmodule); if (mod == NULL) { @@ -58,6 +64,11 @@ PyInit__uuid(void) } if (PyModule_AddIntConstant(mod, "has_uuid_generate_time_safe", has_uuid_generate_time_safe) < 0) { + Py_DECREF(mod); + return NULL; + } + if (PyModule_AddIntConstant(mod, "little_endian", little_endian) < 0) { + Py_DECREF(mod); return NULL; }