From 56507c7862b6e2de189b6a942f394efb676cdb0b Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 26 Nov 2013 22:47:16 +0200 Subject: [PATCH] Issue #11508: Fixed uuid.getnode() and uuid.uuid1() on environment with virtual interface. Original patch by Kent Frazier. --- Lib/test/test_uuid.py | 21 +++++++++++++++++++++ Lib/uuid.py | 12 ++++++++++-- Misc/ACKS | 1 + Misc/NEWS | 3 +++ 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_uuid.py b/Lib/test/test_uuid.py index 97ad6d0c2fb..0a47a91a73b 100644 --- a/Lib/test/test_uuid.py +++ b/Lib/test/test_uuid.py @@ -1,5 +1,7 @@ import unittest +from test import support import builtins +import io import os import uuid @@ -356,6 +358,25 @@ class TestUUID(unittest.TestCase): self.assertEqual(node1, node2) + def test_find_mac(self): + data = '''\ + +fake hwaddr +cscotun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 +eth0 Link encap:Ethernet HWaddr 12:34:56:78:90:ab +''' + def mock_popen(cmd): + return io.StringIO(data) + + with support.swap_attr(os, 'popen', mock_popen): + mac = uuid._find_mac( + command='ifconfig', + args='', + hw_identifiers=['hwaddr'], + get_index=lambda x: x + 1, + ) + self.assertEqual(mac, 0x1234567890ab) + @unittest.skipUnless(importable('ctypes'), 'requires ctypes') def test_uuid1(self): equal = self.assertEqual diff --git a/Lib/uuid.py b/Lib/uuid.py index 9226fd4ebbe..d5c3160fdfd 100644 --- a/Lib/uuid.py +++ b/Lib/uuid.py @@ -327,8 +327,16 @@ def _find_mac(command, args, hw_identifiers, get_index): words = line.lower().split() for i in range(len(words)): if words[i] in hw_identifiers: - return int( - words[get_index(i)].replace(':', ''), 16) + try: + return int( + words[get_index(i)].replace(':', ''), 16) + except (ValueError, IndexError): + # Virtual interfaces, such as those provided by + # VPNs, do not have a colon-delimited MAC address + # as expected, but a 16-byte HWAddr separated by + # dashes. These should be ignored in favor of a + # real MAC address + pass except IOError: continue return None diff --git a/Misc/ACKS b/Misc/ACKS index 5b0f8b045b9..2ad044aad99 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -394,6 +394,7 @@ John Fouhy Andrew Francis Stefan Franke Martin Franklin +Kent Frazier Bruce Frederiksen Robin Friedrich Bradley Froehle diff --git a/Misc/NEWS b/Misc/NEWS index 84217e7b218..07f5b8fd333 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -16,6 +16,9 @@ Core and Builtins Library ------- +- Issue #11508: Fixed uuid.getnode() and uuid.uuid1() on environment with + virtual interface. Original patch by Kent Frazier. + - Issue #11489: JSON decoder now accepts lone surrogates. - Issue #19545: Avoid chained exceptions while passing stray % to