[2.7] bpo-32502: Discard 64-bit (and other invalid) hardware addresses (GH-9125)
(cherry picked from commit 6b273f7f4056f8276f61a97c789d6bb4425e653c)
Co-authored-by: Bo Bayles <bbayles@gmail.com>
diff --git a/Lib/uuid.py b/Lib/uuid.py
index 973013c..80d33c0 100644
--- a/Lib/uuid.py
+++ b/Lib/uuid.py
@@ -522,6 +522,11 @@
_node = None
+_NODE_GETTERS_WIN32 = [_windll_getnode, _netbios_getnode, _ipconfig_getnode]
+
+_NODE_GETTERS_UNIX = [_unixdll_getnode, _ifconfig_getnode, _arp_getnode,
+ _lanscan_getnode, _netstat_getnode]
+
def getnode():
"""Get the hardware address as a 48-bit positive integer.
@@ -537,18 +542,19 @@
import sys
if sys.platform == 'win32':
- getters = [_windll_getnode, _netbios_getnode, _ipconfig_getnode]
+ getters = _NODE_GETTERS_WIN32
else:
- getters = [_unixdll_getnode, _ifconfig_getnode, _arp_getnode,
- _lanscan_getnode, _netstat_getnode]
+ getters = _NODE_GETTERS_UNIX
for getter in getters + [_random_getnode]:
try:
_node = getter()
except:
continue
- if _node is not None:
+ if (_node is not None) and (0 <= _node < (1 << 48)):
return _node
+ assert False, '_random_getnode() returned invalid value: {}'.format(_node)
+
_last_timestamp = None