diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2018-05-24 16:22:59 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-05-24 16:22:59 -0700 |
commit | 5734f41a9b46b4fd65b6ba90240b108f8a0b7c57 (patch) | |
tree | 6f3f2aec5631ee53c66d469ac3b3a5ed81c13b45 | |
parent | d9eb22c67c38b45764dd924801c72092770d200f (diff) | |
download | cpython-git-5734f41a9b46b4fd65b6ba90240b108f8a0b7c57.tar.gz |
bpo-32493: Fix uuid.uuid1() on FreeBSD. (GH-7099)
Use uuid_enc_be() if available to encode UUID to bytes as big endian.
(cherry picked from commit 17d8830312d82e7de42ab89739b0771f712645ff)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
-rw-r--r-- | Misc/NEWS.d/next/Library/2018-05-24-17-41-36.bpo-32493.5tAoAu.rst | 1 | ||||
-rw-r--r-- | Modules/_uuidmodule.c | 9 | ||||
-rwxr-xr-x | configure | 34 | ||||
-rw-r--r-- | configure.ac | 15 | ||||
-rw-r--r-- | pyconfig.h.in | 3 |
5 files changed, 61 insertions, 1 deletions
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 0000000000..32f88dd038 --- /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 16aa09b04f..89499143a6 100644 --- a/Modules/_uuidmodule.c +++ b/Modules/_uuidmodule.c @@ -18,10 +18,16 @@ py_uuid_generate_time_safe(void) 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); +# if defined(HAVE_UUID_ENC_BE) + unsigned char buf[sizeof(uuid)]; + uuid_enc_be(buf, &uuid); + return Py_BuildValue("y#i", buf, sizeof(uuid), (int) status); +# else return Py_BuildValue("y#i", (const char *) &uuid, sizeof(uuid), (int) status); +# endif #else uuid_generate_time(uuid); return Py_BuildValue("y#O", (const char *) uuid, sizeof(uuid), Py_None); @@ -57,6 +63,7 @@ PyInit__uuid(void) } if (PyModule_AddIntConstant(mod, "has_uuid_generate_time_safe", has_uuid_generate_time_safe) < 0) { + Py_DECREF(mod); return NULL; } @@ -9625,6 +9625,40 @@ $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Little-endian FreeBSD, OpenBSD and NetBSD needs encoding into an octet +# stream in big-endian byte-order +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for uuid_enc_be" >&5 +$as_echo_n "checking for uuid_enc_be... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <uuid.h> +int +main () +{ + +#ifndef uuid_enc_be +uuid_t uuid; +unsigned char buf[sizeof(uuid)]; +uuid_enc_be(buf, &uuid); +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +$as_echo "#define HAVE_UUID_ENC_BE 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + # 'Real Time' functions on Solaris # posix4 on Solaris 2.6 # pthread (first!) on Linux diff --git a/configure.ac b/configure.ac index 2535969642..59489047fc 100644 --- a/configure.ac +++ b/configure.ac @@ -2742,6 +2742,21 @@ void *x = uuid_create [AC_MSG_RESULT(no)] ) +# Little-endian FreeBSD, OpenBSD and NetBSD needs encoding into an octet +# stream in big-endian byte-order +AC_MSG_CHECKING(for uuid_enc_be) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <uuid.h>]], [[ +#ifndef uuid_enc_be +uuid_t uuid; +unsigned char buf[sizeof(uuid)]; +uuid_enc_be(buf, &uuid); +#endif +]])], + [AC_DEFINE(HAVE_UUID_ENC_BE, 1, Define if uuid_enc_be() exists.) + AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(no)] +) + # 'Real Time' functions on Solaris # posix4 on Solaris 2.6 # pthread (first!) on Linux diff --git a/pyconfig.h.in b/pyconfig.h.in index a0efff9777..e561a7c07c 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -1212,6 +1212,9 @@ /* Define if uuid_create() exists. */ #undef HAVE_UUID_CREATE +/* Define if uuid_enc_be() exists. */ +#undef HAVE_UUID_ENC_BE + /* Define if uuid_generate_time_safe() exists. */ #undef HAVE_UUID_GENERATE_TIME_SAFE |