summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2017-10-02 14:57:59 (GMT)
committerGitHub <noreply@github.com>2017-10-02 14:57:59 (GMT)
commit4337a0d9955f0855ba38ef30feec3858d304abf0 (patch)
treea45f7d035c6e28bb95e4a54fb1d433c83353963b
parent1023dbbcb7f05e76053486ae7ef7f73b4cdc5398 (diff)
downloadcpython-4337a0d9955f0855ba38ef30feec3858d304abf0.zip
cpython-4337a0d9955f0855ba38ef30feec3858d304abf0.tar.gz
cpython-4337a0d9955f0855ba38ef30feec3858d304abf0.tar.bz2
bpo-11063: Fix _uuid module on macOS (#3855)
On macOS, use uuid_generate_time() instead of uuid_generate_time_safe() of libuuid, since uuid_generate_time_safe() is not available.
-rw-r--r--Lib/uuid.py2
-rw-r--r--Modules/_uuidmodule.c30
2 files changed, 30 insertions, 2 deletions
diff --git a/Lib/uuid.py b/Lib/uuid.py
index b2fbd38..3123ff8 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 e263b40..88c40ce 100644
--- a/Modules/_uuidmodule.c
+++ b/Modules/_uuidmodule.c
@@ -4,14 +4,27 @@
#include <uuid/uuid.h>
+/* 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;
}