mirror of https://github.com/python/cpython
bpo-32502: Discard 64-bit (and other invalid) hardware addresses (#5254)
This commit is contained in:
parent
0bad4d63c6
commit
6b273f7f40
|
@ -311,6 +311,32 @@ class BaseTestUUID:
|
||||||
node2 = self.uuid.getnode()
|
node2 = self.uuid.getnode()
|
||||||
self.assertEqual(node1, node2, '%012x != %012x' % (node1, node2))
|
self.assertEqual(node1, node2, '%012x != %012x' % (node1, node2))
|
||||||
|
|
||||||
|
# bpo-32502: UUID1 requires a 48-bit identifier, but hardware identifiers
|
||||||
|
# need not necessarily be 48 bits (e.g., EUI-64).
|
||||||
|
def test_uuid1_eui64(self):
|
||||||
|
# Confirm that uuid.getnode ignores hardware addresses larger than 48
|
||||||
|
# bits. Mock out each platform's *_getnode helper functions to return
|
||||||
|
# something just larger than 48 bits to test. This will cause
|
||||||
|
# uuid.getnode to fall back on uuid._random_getnode, which will
|
||||||
|
# generate a valid value.
|
||||||
|
too_large_getter = lambda: 1 << 48
|
||||||
|
with unittest.mock.patch.multiple(
|
||||||
|
self.uuid,
|
||||||
|
_node=None, # Ignore any cached node value.
|
||||||
|
_NODE_GETTERS_WIN32=[too_large_getter],
|
||||||
|
_NODE_GETTERS_UNIX=[too_large_getter],
|
||||||
|
):
|
||||||
|
node = self.uuid.getnode()
|
||||||
|
self.assertTrue(0 < node < (1 << 48), '%012x' % node)
|
||||||
|
|
||||||
|
# Confirm that uuid1 can use the generated node, i.e., the that
|
||||||
|
# uuid.getnode fell back on uuid._random_getnode() rather than using
|
||||||
|
# the value from too_large_getter above.
|
||||||
|
try:
|
||||||
|
self.uuid.uuid1(node=node)
|
||||||
|
except ValueError as e:
|
||||||
|
self.fail('uuid1 was given an invalid node ID')
|
||||||
|
|
||||||
def test_uuid1(self):
|
def test_uuid1(self):
|
||||||
equal = self.assertEqual
|
equal = self.assertEqual
|
||||||
|
|
||||||
|
|
16
Lib/uuid.py
16
Lib/uuid.py
|
@ -656,7 +656,12 @@ def _random_getnode():
|
||||||
|
|
||||||
_node = None
|
_node = None
|
||||||
|
|
||||||
def getnode():
|
_NODE_GETTERS_WIN32 = [_windll_getnode, _netbios_getnode, _ipconfig_getnode]
|
||||||
|
|
||||||
|
_NODE_GETTERS_UNIX = [_unix_getnode, _ifconfig_getnode, _ip_getnode,
|
||||||
|
_arp_getnode, _lanscan_getnode, _netstat_getnode]
|
||||||
|
|
||||||
|
def getnode(*, getters=None):
|
||||||
"""Get the hardware address as a 48-bit positive integer.
|
"""Get the hardware address as a 48-bit positive integer.
|
||||||
|
|
||||||
The first time this runs, it may launch a separate program, which could
|
The first time this runs, it may launch a separate program, which could
|
||||||
|
@ -669,19 +674,18 @@ def getnode():
|
||||||
return _node
|
return _node
|
||||||
|
|
||||||
if sys.platform == 'win32':
|
if sys.platform == 'win32':
|
||||||
getters = [_windll_getnode, _netbios_getnode, _ipconfig_getnode]
|
getters = _NODE_GETTERS_WIN32
|
||||||
else:
|
else:
|
||||||
getters = [_unix_getnode, _ifconfig_getnode, _ip_getnode,
|
getters = _NODE_GETTERS_UNIX
|
||||||
_arp_getnode, _lanscan_getnode, _netstat_getnode]
|
|
||||||
|
|
||||||
for getter in getters + [_random_getnode]:
|
for getter in getters + [_random_getnode]:
|
||||||
try:
|
try:
|
||||||
_node = getter()
|
_node = getter()
|
||||||
except:
|
except:
|
||||||
continue
|
continue
|
||||||
if _node is not None:
|
if (_node is not None) and (0 <= _node < (1 << 48)):
|
||||||
return _node
|
return _node
|
||||||
assert False, '_random_getnode() returned None'
|
assert False, '_random_getnode() returned invalid value: {}'.format(_node)
|
||||||
|
|
||||||
|
|
||||||
_last_timestamp = None
|
_last_timestamp = None
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
uuid.uuid1 no longer raises an exception if a 64-bit hardware address is
|
||||||
|
encountered.
|
Loading…
Reference in New Issue