From 642f52d7d2c855e632727aa09efe437956ef170f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 2 Oct 2017 16:03:14 +0200 Subject: [PATCH] bpo-11063: Fix _uuid module on macOS On macOS, use uuid_generate_time() instead of uuid_generate_time_safe() of libuuid, since uuid_generate_time_safe() is not available. --- Lib/uuid.py | 2 +- Modules/_uuidmodule.c | 30 +++++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/Lib/uuid.py b/Lib/uuid.py index b2fbd38c353efc5..3123ff88a16b0be 100644 --- a/Lib/uuid.py +++ b/Lib/uuid.py @@ -509,7 +509,7 @@ def _load_system_functions(): pass elif _uuid is not None: _generate_time_safe = _uuid.generate_time_safe - _has_uuid_generate_time_safe = True + _has_uuid_generate_time_safe = _uuid.has_uuid_generate_time_safe return try: diff --git a/Modules/_uuidmodule.c b/Modules/_uuidmodule.c index e263b40d8ff3e2a..88c40ce353786e4 100644 --- a/Modules/_uuidmodule.c +++ b/Modules/_uuidmodule.c @@ -4,14 +4,27 @@ #include +/* bpo-11063: libuuid on macOS doesn't provide uuid_generate_time_safe(), + only uuid_generate_time(). */ +#ifndef __APPLE__ +# define HAVE_TIME_SAFE +#endif + + static PyObject * py_uuid_generate_time_safe(void) { +#ifdef HAVE_TIME_SAFE uuid_t out; int res; res = uuid_generate_time_safe(out); return Py_BuildValue("y#i", (const char *) out, sizeof(out), res); +#else + uuid_t out; + uuid_generate_time(out); + return Py_BuildValue("y#O", (const char *) out, sizeof(out), Py_None); +#endif } @@ -30,6 +43,21 @@ static struct PyModuleDef uuidmodule = { PyMODINIT_FUNC PyInit__uuid(void) { + PyObject *mod; assert(sizeof(uuid_t) == 16); - return PyModule_Create(&uuidmodule); +#ifdef HAVE_TIME_SAFE + int has_uuid_generate_time_safe = 1; +#else + int has_uuid_generate_time_safe = 0; +#endif + mod = PyModule_Create(&uuidmodule); + if (mod == NULL) { + return NULL; + } + if (PyModule_AddIntConstant(mod, "has_uuid_generate_time_safe", + has_uuid_generate_time_safe) < 0) { + return NULL; + } + + return mod; }