Skip to content

Commit 99bdd52

Browse files
committed
only use stable _uuid.generate_time_safe() to deduce MAC address
1 parent 5d8e432 commit 99bdd52

File tree

5 files changed

+328
-27
lines changed

5 files changed

+328
-27
lines changed

Lib/uuid.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -633,16 +633,18 @@ def _netstat_getnode():
633633
try:
634634
import _uuid
635635
_generate_time_safe = getattr(_uuid, "generate_time_safe", None)
636+
_has_stable_extractable_node = _uuid.has_stable_extractable_node
636637
_UuidCreate = getattr(_uuid, "UuidCreate", None)
637638
except ImportError:
638639
_uuid = None
639640
_generate_time_safe = None
641+
_has_stable_extractable_node = False
640642
_UuidCreate = None
641643

642644

643645
def _unix_getnode():
644646
"""Get the hardware address on Unix using the _uuid extension module."""
645-
if _generate_time_safe:
647+
if _generate_time_safe and _has_stable_extractable_node:
646648
uuid_time, _ = _generate_time_safe()
647649
return UUID(bytes=uuid_time).node
648650

Modules/_uuidmodule.c

+32-8
Original file line numberDiff line numberDiff line change
@@ -78,23 +78,47 @@ py_UuidCreate(PyObject *Py_UNUSED(context),
7878
return NULL;
7979
}
8080

81+
static int
82+
py_windows_has_stable_node(void)
83+
{
84+
UUID uuid;
85+
RPC_STATUS res;
86+
Py_BEGIN_ALLOW_THREADS
87+
res = UuidCreateSequential(&uuid);
88+
Py_END_ALLOW_THREADS
89+
return res == RPC_S_OK;
90+
}
8191
#endif /* MS_WINDOWS */
8292

8393

8494
static int
85-
uuid_exec(PyObject *module) {
95+
uuid_exec(PyObject *module)
96+
{
97+
#define ADD_INT(NAME, VALUE) \
98+
do { \
99+
if (PyModule_AddIntConstant(module, (NAME), (VALUE)) < 0) { \
100+
return -1; \
101+
} \
102+
} while (0)
103+
86104
assert(sizeof(uuid_t) == 16);
87105
#if defined(MS_WINDOWS)
88-
int has_uuid_generate_time_safe = 0;
106+
ADD_INT("has_uuid_generate_time_safe", 0);
89107
#elif defined(HAVE_UUID_GENERATE_TIME_SAFE)
90-
int has_uuid_generate_time_safe = 1;
108+
ADD_INT("has_uuid_generate_time_safe", 1);
91109
#else
92-
int has_uuid_generate_time_safe = 0;
110+
ADD_INT("has_uuid_generate_time_safe", 0);
93111
#endif
94-
if (PyModule_AddIntConstant(module, "has_uuid_generate_time_safe",
95-
has_uuid_generate_time_safe) < 0) {
96-
return -1;
97-
}
112+
113+
#if defined(MS_WINDOWS)
114+
ADD_INT("has_stable_extractable_node", py_windows_has_stable_node());
115+
#elif defined(HAVE_UUID_GENERATE_TIME_SAFE_STABLE_MAC)
116+
ADD_INT("has_stable_extractable_node", 1);
117+
#else
118+
ADD_INT("has_stable_extractable_node", 0);
119+
#endif
120+
121+
#undef ADD_INT
98122
return 0;
99123
}
100124

configure

+200-9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)