diff -r afe119a3619f Lib/test/test_socket.py --- a/Lib/test/test_socket.py Sun Jul 21 16:25:30 2013 +0200 +++ b/Lib/test/test_socket.py Fri Jul 26 18:54:07 2013 +0100 @@ -1736,6 +1736,45 @@ def _testRecvFromNegative(self): self.cli.sendto(MSG, 0, (HOST, self.port)) + +@requireSocket("AF_BLUETOOTH", "SOCK_STREAM", "BTPROTO_RFCOMM") +class BasicBluetoothTest(unittest.TestCase): + def setUp(self): + self.bs = socket.socket(socket.AF_BLUETOOTH, + socket.SOCK_STREAM, + socket.BTPROTO_RFCOMM) + + def test_address_invalid(self): + addr = 'ff:ff:ff:ff:fffa' + try: + self.bs.connect((addr, 1)) + except OSError as error: + # bad bluetooth address + self.assertIsNone(error.errno) + else: + self.fail('"{addr} is not a valid address.'.format(addr=addr)) + + def test_address_overflow(self): + addr = '{0:x}:10:60:0:AA:08'.format(2 ** (8 * struct.calcsize('I'))) + try: + self.bs.connect((addr, 3)) + except OSError as error: + # bad bluetooth address + self.assertIsNone(error.errno) + else: + self.fail('"{addr}" is not a valid address.'.format(addr=addr)) + + def test_address_valid(self): + addr = 'C0:10:60:AA:36:F8' + try: + self.bs.connect((addr, 1)) + except OSError as error: + # [Errno 112] Host is down. + self.assertEqual(error.errno, 112) + else: + self.fail('"{addr}" is a valid address.'.format(add=addr)) + + # Tests for the sendmsg()/recvmsg() interface. Where possible, the # same test code is used with different families and types of socket # (e.g. stream, datagram), and tests using recvmsg() are repeated diff -r afe119a3619f Modules/socketmodule.c --- a/Modules/socketmodule.c Sun Jul 21 16:25:30 2013 +0200 +++ b/Modules/socketmodule.c Fri Jul 26 18:54:07 2013 +0100 @@ -945,7 +945,7 @@ char ch; int n; - n = sscanf(name, "%X:%X:%X:%X:%X:%X%c", + n = sscanf(name, "%02X:%02X:%02X:%02X:%02X:%02X%c", &b5, &b4, &b3, &b2, &b1, &b0, &ch); if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) { bdaddr->b[0] = b0;